watch
 1  #!/usr/bin/env node
 2  
 3  var argv = require('minimist')(process.argv.slice(2))
 4  var execshell = require('exec-sh')
 5  var path = require('path')
 6  var watch = require('./main.js')
 7  
 8  if(argv._.length === 0) {
 9    console.error([
10      'Usage: watch <command> [...directory]',
11      '[--wait=<seconds>]',
12      '[--filter=<file>]',
13      '[--interval=<seconds>]',
14      '[--ignoreDotFiles]',
15      '[--ignoreUnreadable]',
16      '[--ignoreDirectoryPattern]'
17    ].join(' '))
18    process.exit()
19  }
20  
21  var watchTreeOpts = {}
22  var command = argv._[0]
23  var dirs = []
24  
25  var i
26  var argLen = argv._.length
27  if (argLen > 1) {
28    for(i = 1; i< argLen; i++) {
29        dirs.push(argv._[i])
30    }
31  } else {
32    dirs.push(process.cwd())
33  }
34  
35  var waitTime = Number(argv.wait || argv.w)
36  if (argv.interval || argv.i) {
37    watchTreeOpts.interval = Number(argv.interval || argv.i || 0.2);
38  }
39  
40  if(argv.ignoreDotFiles || argv.d)
41    watchTreeOpts.ignoreDotFiles = true
42  
43  if(argv.ignoreUnreadable || argv.u)
44    watchTreeOpts.ignoreUnreadableDir = true
45  
46  if(argv.ignoreDirectoryPattern || argv.p) {
47    var match = (argv.ignoreDirectoryPattern || argv.p).match(/^\/(.*)\/([gimuy]*)$/);
48    watchTreeOpts.ignoreDirectoryPattern = new RegExp(match[1], match[2])
49  }
50  
51  if(argv.filter || argv.f) {
52    try {
53      watchTreeOpts.filter = require(path.resolve(process.cwd(), argv.filter || argv.f))
54    } catch (e) {
55      console.error(e)
56      process.exit(1)
57    }
58  }
59  
60  var wait = false
61  
62  var dirLen = dirs.length
63  var skip = dirLen - 1
64  for(i = 0; i < dirLen; i++) {
65    var dir = dirs[i]
66    console.error('> Watching', dir)
67    watch.watchTree(dir, watchTreeOpts, function (f, curr, prev) {
68      if(skip) {
69          skip--
70          return
71      }
72      if(wait) return
73  
74      execshell(command)
75  
76      if(waitTime > 0) {
77        wait = true
78        setTimeout(function () {
79          wait = false
80        }, waitTime * 1000)
81      }
82    })
83  }