|
| 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