123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112 |
- /*
- * grunt-contrib-watch
- * http://gruntjs.com/
- *
- * Copyright (c) 2014 "Cowboy" Ben Alman, contributors
- * Licensed under the MIT license.
- */
-
- 'use strict';
-
- var path = require('path');
- var EE = require('events').EventEmitter;
- var util = require('util');
-
- module.exports = function(grunt) {
-
- var livereload = require('./livereload')(grunt);
-
- // Create a TaskRun on a target
- function TaskRun(target) {
- this.name = target.name || 0;
- this.files = target.files || [];
- this._getConfig = target._getConfig;
- this.options = target.options;
- this.startedAt = false;
- this.spawned = null;
- this.changedFiles = Object.create(null);
- this.spawnTaskFailure = false;
- this.livereloadOnError = true;
- if (typeof this.options.livereloadOnError !== 'undefined') {
- this.livereloadOnError = this.options.livereloadOnError;
- }
- }
-
- var getErrorCount = function(){
- if (typeof grunt.fail.forever_warncount !== 'undefined') {
- return grunt.fail.forever_warncount + grunt.fail.forever_errorcount;
- } else {
- return grunt.fail.warncount + grunt.fail.errorcount;
- }
- };
-
- // Run it
- TaskRun.prototype.run = function(done) {
- var self = this;
-
- // Dont run if already running
- if (self.startedAt !== false) { return; }
-
- // Start this task run
- self.startedAt = Date.now();
-
- // reset before each run
- self.spawnTaskFailure = false;
- self.errorsAndWarningsCount = getErrorCount();
-
- // pull the tasks here in case they were changed by a watch event listener
- self.tasks = self._getConfig('tasks') || [];
- if (typeof self.tasks === 'string') {
- self.tasks = [self.tasks];
- }
-
- // If no tasks just call done to trigger potential livereload
- if (self.tasks.length < 1) { return done(); }
-
- if (self.options.spawn === false || self.options.nospawn === true) {
- grunt.task.run(self.tasks);
- done();
- } else {
- self.spawned = grunt.util.spawn({
- // Spawn with the grunt bin
- grunt: true,
- // Run from current working dir and inherit stdio from process
- opts: {
- cwd: self.options.cwd.spawn,
- stdio: 'inherit',
- },
- // Run grunt this process uses, append the task to be run and any cli options
- args: self.tasks.concat(self.options.cliArgs || []),
- }, function(err, res, code) {
- self.spawnTaskFailure = (code !== 0);
- if (self.options.interrupt !== true || (code !== 130 && code !== 1)) {
- // Spawn is done
- self.spawned = null;
- done();
- }
- });
- }
- };
-
- // When the task run has completed
- TaskRun.prototype.complete = function() {
- var time = Date.now() - this.startedAt;
- this.startedAt = false;
- if (this.spawned) {
- this.spawned.kill('SIGINT');
- this.spawned = null;
- }
-
- var taskFailed = this.spawnTaskFailure || (getErrorCount() > this.errorsAndWarningsCount);
- this.errorsAndWarningsCount = getErrorCount();
-
- // Trigger livereload if necessary
- if (this.livereload && (this.livereloadOnError || !taskFailed)) {
- this.livereload.trigger(Object.keys(this.changedFiles));
- this.changedFiles = Object.create(null);
- }
- return time;
- };
-
- return TaskRun;
- };
|