|
| 1 | +'use strict'; |
| 2 | + |
1 | 3 | fs = require 'fs'
|
2 | 4 | colors = require 'colors'
|
| 5 | +path = require 'path' |
| 6 | +minimatch = require 'minimatch' |
| 7 | + |
| 8 | +getFilterDirectories = (rootDir) -> |
| 9 | + defaultPatterns = ["node_modules", "components", "bower_components"] |
| 10 | + rootDir = rootDir || '.' |
| 11 | + try |
| 12 | + data = fs.readFileSync(path.join(rootDir, '.gitignore'), 'utf8') |
| 13 | + if data |
| 14 | + data.split("\n") |
| 15 | + else |
| 16 | + defaultPatterns |
| 17 | + catch err |
| 18 | + defaultPatterns |
3 | 19 |
|
4 | 20 | # The Notes class holds all the logic needed for crawling a directory of files,
|
5 | 21 | # searching for a set of patterns to annotate.
|
@@ -37,20 +53,18 @@ class Notes
|
37 | 53 | "\\.log", "\\.bin", "\\.psd", "\\.swf", "\\.fla", "\\.ico"
|
38 | 54 | ]
|
39 | 55 |
|
40 |
| - # You can filter out full directory trees |
41 |
| - @filterDirectories = ["node_modules", "components", "bower_components"] |
42 |
| - |
43 | 56 | @skipHidden = true
|
44 | 57 |
|
45 | 58 | @concurrentFiles = 30
|
46 | 59 |
|
47 | 60 | constructor: (@rootDir) ->
|
48 | 61 | # Constructor must take at least a root directory as first argument
|
49 | 62 | throw "Root directory is required." unless @rootDir
|
| 63 | + @filterDirectories = getFilterDirectories(@rootDir) |
50 | 64 |
|
51 | 65 | annotate: ->
|
52 | 66 | files = []
|
53 |
| - filesUnderDirectory @rootDir, (file) -> |
| 67 | + @filesUnderDirectory @rootDir, (file) -> |
54 | 68 | files.push file
|
55 | 69 |
|
56 | 70 | # Simple way to control # of files being opened at a time...
|
@@ -84,14 +98,22 @@ class Notes
|
84 | 98 | concurrency++
|
85 | 99 | run()
|
86 | 100 |
|
87 |
| - filesUnderDirectory = (dir, fileCallback) -> |
| 101 | + isInFilteredDirectories: (f) -> |
| 102 | + result = false |
| 103 | + |
| 104 | + for pattern in @filterDirectories |
| 105 | + result = result || minimatch(f, pattern) |
| 106 | + |
| 107 | + !result |
| 108 | + |
| 109 | + filesUnderDirectory: (dir, fileCallback) -> |
88 | 110 | try
|
89 | 111 | files = fs.readdirSync dir
|
90 | 112 | # If it's another directory, make a recursive call into it
|
91 | 113 | if files?
|
92 | 114 | files = (f for f in files when !f.match(/^\./)) if Notes.skipHidden # Skip hidden files/directories
|
93 |
| - files = (f for f in files when Notes.filterDirectories.indexOf(f) < 0) # Skip directories that should be filtered |
94 |
| - filesUnderDirectory("#{dir}/#{f}", fileCallback) for f in files |
| 115 | + files = (f for f in files when @isInFilteredDirectories(f)) # Skip directories that should be filtered |
| 116 | + @filesUnderDirectory("#{dir}/#{f}", fileCallback) for f in files |
95 | 117 | catch error
|
96 | 118 | if error.code is "ENOTDIR"
|
97 | 119 | filter = ///(#{Notes.filterExtensions.join('|')})$/// # skip files matching filterExtensions
|
|
0 commit comments