From 7c326a6fcf700560f9dadc89b0422f51e4afde82 Mon Sep 17 00:00:00 2001 From: Chris Talkington Date: Thu, 13 Dec 2012 12:04:35 -0600 Subject: [PATCH] prep for upcoming grunt release. Closes GH-23. normalize linefeeds. remove grunt v0.3 and node v0.6 support --- .gitattributes | 1 + AUTHORS | 2 +- CHANGELOG | 5 ++++- LICENSE-MIT | 42 ++++++++++++++++++++-------------------- README.md | 38 ++++++++++++++---------------------- package.json | 6 +++--- tasks/watch.js | 22 ++++++++++++++------- test/tasks/watch_test.js | 11 ----------- 8 files changed, 59 insertions(+), 68 deletions(-) create mode 100644 .gitattributes diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..2125666 --- /dev/null +++ b/.gitattributes @@ -0,0 +1 @@ +* text=auto \ No newline at end of file diff --git a/AUTHORS b/AUTHORS index a8d52c8..7dfa666 100644 --- a/AUTHORS +++ b/AUTHORS @@ -1,2 +1,2 @@ -Kyle Robinson Young (http://dontkry.com) +Kyle Robinson Young (http://dontkry.com) "Cowboy" Ben Alman (http://benalman.com) \ No newline at end of file diff --git a/CHANGELOG b/CHANGELOG index a9efb2d..9486cfb 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,5 +1,8 @@ -v0.1.5: +v0.2.0: + date: 2012-12-15 changes: + - Conversion to grunt v0.4 conventions. + - Remove node v0.6 and grunt v0.3 support. - Allow watch task to be renamed. - Use grunt.util.spawn "grunt" option. v0.1.4: diff --git a/LICENSE-MIT b/LICENSE-MIT index 7ed0303..9edf753 100644 --- a/LICENSE-MIT +++ b/LICENSE-MIT @@ -1,22 +1,22 @@ -Copyright (c) 2012 "Cowboy" Ben Alman, contributors - -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 +Copyright (c) 2012 "Cowboy" Ben Alman, contributors + +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. \ No newline at end of file diff --git a/README.md b/README.md index d5bbbe9..24eecd7 100644 --- a/README.md +++ b/README.md @@ -2,31 +2,20 @@ > Run predefined tasks whenever watched file patterns are added, changed or deleted. -_Note that this plugin has not yet been released, and only works with the latest bleeding-edge, in-development version of grunt. See the [When will I be able to use in-development feature 'X'?](https://github.com/gruntjs/grunt/blob/devel/docs/faq.md#when-will-i-be-able-to-use-in-development-feature-x) FAQ entry for more information._ ## Getting Started -_If you haven't used [grunt][] before, be sure to check out the [Getting Started][] guide._ +If you haven't used [grunt][] before, be sure to check out the [Getting Started][] guide, as it explains how to create a [gruntfile][Getting Started] as well as install and use grunt plugins. Once you're familiar with that process, install this plugin with this command: -From the same directory as your project's [Gruntfile][Getting Started] and [package.json][], install this plugin with the following command: - -```bash +```shell npm install grunt-contrib-watch --save-dev ``` -Once that's done, add this line to your project's Gruntfile: - -```js -grunt.loadNpmTasks('grunt-contrib-watch'); -``` - -If the plugin has been installed correctly, running `grunt --help` at the command line should list the newly-installed plugin's task or tasks. In addition, the plugin should be listed in package.json as a `devDependency`, which ensures that it will be installed whenever the `npm install` command is run. - [grunt]: http://gruntjs.com/ [Getting Started]: https://github.com/gruntjs/grunt/blob/devel/docs/getting_started.md -[package.json]: https://npmjs.org/doc/json.html -## The watch task +## Watch task +_Run this task with the `grunt watch` command._ ### Overview @@ -135,14 +124,15 @@ grunt.initConfig({ ## Release History - * 2012-11-19 - v0.1.5 - Allow watch task to be renamed. Use grunt.util.spawn "grunt" option. - * 2012-10-31 - v0.1.4 - Prevent watch from spawning duplicate watch tasks - * 2012-10-27 - v0.1.3 - Better method to spawn the grunt bin Bump gaze to v0.2.0. Better handles some events and new option forceWatchMethod Only support Node.js >= v0.8 - * 2012-10-16 - v0.1.2 - Only spawn a process per task one at a time Add interrupt option to cancel previous spawned process Grunt v0.3 compatibility changes - * 2012-10-15 - v0.1.1 - Fallback to global grunt bin if local doesnt exist. Fatal if bin cannot be found Update to gaze 0.1.6 - * 2012-10-07 - v0.1.0 - Release watch task Remove spawn from helper Run on Grunt v0.4 + * 2012-12-14   v0.2.0   Conversion to grunt v0.4 conventions. Remove node v0.6 and grunt v0.3 support. Allow watch task to be renamed. Use grunt.util.spawn "grunt" option. + * 2012-10-31   v0.1.4   Prevent watch from spawning duplicate watch tasks + * 2012-10-27   v0.1.3   Better method to spawn the grunt bin Bump gaze to v0.2.0. Better handles some events and new option forceWatchMethod Only support Node.js >= v0.8 + * 2012-10-16   v0.1.2   Only spawn a process per task one at a time Add interrupt option to cancel previous spawned process Grunt v0.3 compatibility changes + * 2012-10-15   v0.1.1   Fallback to global grunt bin if local doesnt exist. Fatal if bin cannot be found Update to gaze 0.1.6 + * 2012-10-07   v0.1.0   Release watch task Remove spawn from helper Run on Grunt v0.4 + +--- --- -Task submitted by Kyle Robinson Young. +Task submitted by [Kyle Robinson Young](http://dontkry.com) -*Generated on Mon Nov 19 2012 12:58:44.* +*This file was generated on Thu Dec 13 2012 11:57:38.* diff --git a/package.json b/package.json index 0ab970b..2aeb4ef 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "grunt-contrib-watch", "description": "Run predefined tasks whenever watched file patterns are added, changed or deleted.", - "version": "0.1.4", + "version": "0.2.0a", "homepage": "https://github.com/gruntjs/grunt-contrib-watch", "author": { "name": "Grunt Team", @@ -33,8 +33,8 @@ "devDependencies": { "grunt-contrib-jshint": "~0.1.0", "grunt-contrib-nodeunit": "~0.1.0", - "grunt-contrib-internal": "*", - "grunt": "~0.4.0a" + "grunt-contrib-internal": "~0.1.0", + "grunt": "~0.4.0" }, "keywords": [ "gruntplugin", "watch" diff --git a/tasks/watch.js b/tasks/watch.js index 2dcfb86..b5724d3 100644 --- a/tasks/watch.js +++ b/tasks/watch.js @@ -9,17 +9,10 @@ module.exports = function(grunt) { 'use strict'; - // TODO: ditch this when grunt v0.4 is released - grunt.util = grunt.util || grunt.utils; - var path = require('path'); var fs = require('fs'); var Gaze = require('gaze').Gaze; - // In Nodejs 0.8.0, existsSync moved from path -> fs. - // TODO: When 0.4 is release, use grunt.file.exists - fs.existsSync = fs.existsSync || path.existsSync; - // Default options for the watch task var defaults = { interrupt: false @@ -28,11 +21,13 @@ module.exports = function(grunt) { grunt.registerTask('watch', 'Run predefined tasks whenever watched files change.', function(target) { var name = this.name || 'watch'; this.requiresConfig(name); + // Build an array of files/tasks objects var watch = grunt.config(name); var targets = target ? [target] : Object.keys(watch).filter(function(key) { return typeof watch[key] !== 'string' && !Array.isArray(watch[key]); }); + targets = targets.map(function(target) { // Fail if any required config properties have been omitted target = [name, target]; @@ -47,12 +42,16 @@ module.exports = function(grunt) { // Message to display when waiting for changes var waiting = 'Waiting...'; + // File changes to be logged. var changedFiles = Object.create(null); + // Keep track of spawns per tasks var spawned = Object.create(null); + // List of changed / deleted file paths. grunt.file.watchFiles = {changed: [], deleted: [], added: []}; + // Get process.argv options without grunt.cli.tasks to pass to child processes var cliArgs = grunt.util._.without.apply(null, [[].slice.call(process.argv, 2)].concat(grunt.cli.tasks)); @@ -68,16 +67,20 @@ module.exports = function(grunt) { spawned[i].kill('SIGINT'); delete spawned[i]; } + // Only spawn one at a time unless interrupt is specified if (!spawned[i]) { grunt.log.ok(); + var fileArray = Object.keys(changedFiles); fileArray.forEach(function(filepath) { // Log which file has changed, and how. grunt.log.ok('File "' + filepath + '" ' + changedFiles[filepath] + '.'); }); + // Reset changedFiles changedFiles = Object.create(null); + // Spawn the tasks as a child process spawned[i] = grunt.util.spawn({ // Spawn with the grunt bin @@ -91,6 +94,7 @@ module.exports = function(grunt) { delete spawned[i]; grunt.log.writeln('').write(waiting); }); + // Display stdout/stderr immediately spawned[i].stdout.on('data', function(buf) { grunt.log.write(String(buf)); }); spawned[i].stderr.on('data', function(buf) { @@ -106,20 +110,24 @@ module.exports = function(grunt) { } // Get patterns to glob for this target var patterns = grunt.util._.chain(target.files).flatten().uniq().value(); + // Default options per target var options = grunt.util._.defaults(target.options || {}, defaults); + // Create watcher per target var gaze = new Gaze(patterns, options, function(err) { if (err) { grunt.log.error(err.message); return done(); } + // On changed/added/deleted this.on('all', function(status, filepath) { filepath = path.relative(process.cwd(), filepath); changedFiles[filepath] = status; runTasks(i, target.tasks, options); }); + // On watcher error this.on('error', function(err) { grunt.log.error(err); }); }); diff --git a/test/tasks/watch_test.js b/test/tasks/watch_test.js index d528a3b..10f47f0 100644 --- a/test/tasks/watch_test.js +++ b/test/tasks/watch_test.js @@ -2,17 +2,6 @@ var grunt = require('grunt'); var path = require('path'); -grunt.util = grunt.util || grunt.utils; - -// Node v0.6 compat -path.sep = path.sep || path.normalize('/'); - -// In case the grunt being used to test is different than the grunt being -// tested, initialize the task and config subsystems. -if (grunt.task.searchDirs.length === 0) { - grunt.task.init([]); - grunt.config.init({}); -} // Where our fixtures are var fixtures = path.join(__dirname, '..', 'fixtures');