| @ -0,0 +1 @@ | |||
| node_modules | |||
| @ -0,0 +1,50 @@ | |||
| tend | |||
| ==== | |||
| Quick and easy cli command to watch a directory for file changes and run a | |||
| provided command when any files have been changed, removed or added. | |||
| ## Installation | |||
| ```bash | |||
| npm install -g tend | |||
| ``` | |||
| ## Usage | |||
| ``` | |||
| Usage: | |||
| tend (--help | --version) | |||
| tend [--restart] [--ignoreHidden] <dir> <command> [<filter>] | |||
| Options: | |||
| -h --help Show this help text | |||
| -v --version Show tend version information | |||
| -r --restart If <command> is still running when there is a change, stop and re-run it | |||
| -i --ignoreHidden Ignore changes to files which start with "." | |||
| ``` | |||
| ```bash | |||
| tend --restart --ignoreHidden ./ "node server.js" | |||
| ``` | |||
| ## License | |||
| ``` | |||
| The MIT License (MIT) Copyright (c) 2014 Brett Langdon <brett@blangdon.com> (http://brett.is) | |||
| Permission is hereby granted, free of charge, to any person obtaining a copy | |||
| of this software and associated documentation files (the "Software"), to deal | |||
| in the Software without restriction, including without limitation the rights to | |||
| use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies | |||
| of the Software, and to permit persons to whom the Software is furnished to do | |||
| so, subject to the following conditions: | |||
| The above copyright notice and this permission notice shall be included in all | |||
| copies or substantial portions of the Software. | |||
| THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, | |||
| INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A | |||
| PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT | |||
| HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF | |||
| CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE | |||
| OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | |||
| ``` | |||
| @ -0,0 +1,28 @@ | |||
| #!/usr/bin/env node | |||
| var docopt = require('docopt'); | |||
| var tend = require('../'); | |||
| var doc = [ | |||
| 'Usage:', | |||
| ' tend (--help | --version)', | |||
| ' tend [--restart] [--ignoreHidden] <dir> <command> [<filter>]', | |||
| '', | |||
| 'Options:', | |||
| ' -h --help Show this help text', | |||
| ' -v --version Show tend version information', | |||
| ' -r --restart If <command> is still running when there is a change, stop and re-run it', | |||
| ' -i --ignoreHidden Ignore changes to files which start with "."', | |||
| ].join('\r\n'); | |||
| var args = docopt.docopt(doc, { | |||
| help: true, | |||
| version: 'tend ' + require('../package.json').version, | |||
| }); | |||
| var options = { | |||
| pattern: args['<filter>'], | |||
| ignoreHidden: args['--ignoreHidden'], | |||
| restart: args['--restart'], | |||
| }; | |||
| tend.tend(args['<dir>'], args['<command>'], options); | |||
| @ -0,0 +1,73 @@ | |||
| var colors = require('colors'); | |||
| var path = require('path'); | |||
| var spawn = require('child_process').spawn; | |||
| var watch = require('watch'); | |||
| module.exports.tend = function(dir, rawCommand, options) { | |||
| options = options || {}; | |||
| var pattern = options.pattern || '.'; | |||
| var filter = new RegExp(pattern, 'i'); | |||
| var ignoreHidden = options.ignoreHidden === true; | |||
| var restart = options.restart === true; | |||
| var args = rawCommand.split(' '); | |||
| var command = args.shift(); | |||
| var executor = null; | |||
| var timeout = null; | |||
| var startCommand = function() { | |||
| console.log(('Running Command: ' + rawCommand).green); | |||
| executor = spawn(command, args); | |||
| executor.stdout.on('data', function(chunk) { | |||
| console.log(chunk.toString()); | |||
| }); | |||
| executor.stderr.on('data', function(chunk) { | |||
| console.error(chunk.toString().red); | |||
| }); | |||
| executor.on('error', function(error) { | |||
| console.error('Error Running Command'.red); | |||
| }); | |||
| executor.on('close', function(code, signal) { | |||
| if (code === 0) { | |||
| console.log('Command Exited Successfully'.green); | |||
| } else if (signal) { | |||
| console.warn(('Command Killed With Signal: ' + signal).yellow); | |||
| } else { | |||
| console.error(('Command Exited With Status: ' + code).red); | |||
| } | |||
| executor = null; | |||
| }); | |||
| console.log(('Process ' + executor.pid + ' Started').green); | |||
| }.bind(this); | |||
| watch.watchTree(dir, function(f, curr, prev) { | |||
| if (curr === null && prev === null) { | |||
| return; | |||
| } | |||
| if (ignoreHidden) { | |||
| var basename = path.basename(f); | |||
| if (basename.indexOf('.') === 0) { | |||
| return; | |||
| } | |||
| } | |||
| if (!filter.test(f)) { | |||
| return; | |||
| } | |||
| if (executor && restart) { | |||
| console.warn(('Killing Process: ' + executor.pid).yellow); | |||
| executor.on('close', function(code, signal) { | |||
| startCommand(); | |||
| }); | |||
| executor.kill(); | |||
| return; | |||
| } else if (executor) { | |||
| console.warn(('Process ' + executor.pid + ' Still Running').yellow); | |||
| return; | |||
| } | |||
| clearTimeout(timeout); | |||
| timeout = setTimeout(startCommand, 300); | |||
| }); | |||
| }; | |||
| @ -0,0 +1,34 @@ | |||
| { | |||
| "name": "tend", | |||
| "version": "0.1.0", | |||
| "description": "CLI Tool to run a command when a file changes", | |||
| "main": "lib/index.js", | |||
| "scripts": { | |||
| "test": "echo \"Error: no test specified\" && exit 1" | |||
| }, | |||
| "repository": { | |||
| "type": "git", | |||
| "url": "git://github.com/brettlangdon/tend.git" | |||
| }, | |||
| "keywords": [ | |||
| "tend", | |||
| "watch", | |||
| "cli", | |||
| "file", | |||
| "command" | |||
| ], | |||
| "author": "Brett Langdon <brett@blangdon.com> (http://brett.is)", | |||
| "license": "MIT", | |||
| "bugs": { | |||
| "url": "https://github.com/brettlangdon/tend/issues" | |||
| }, | |||
| "homepage": "https://github.com/brettlangdon/tend", | |||
| "dependencies": { | |||
| "watch": "~0.10.0", | |||
| "docopt": "~0.4.0", | |||
| "colors": "~0.6.2" | |||
| }, | |||
| "bin": { | |||
| "tend": "bin/tend" | |||
| } | |||
| } | |||