tasks/growl.js
function initGrowlStatus() {
    grunt.util.hooker.hook(grunt.log, 'write', function(msg){
      if( grunt.log.uncolor(msg).match(/Waiting.../) ) { flushMessages('ok'); }
    });

    grunt.util.hooker.hook(grunt.log, 'header', function(msg){
      msg = grunt.log.uncolor(msg);

      if( ignoreWatch && msg.match(/"watch" task/) ) { return; }

      if( msg.match(/".+:.+"/) ) { return; }

      if( !ignoreWatch && msg.match(/"watch" task/) ) {
        msg += ' for ' + path.basename(process.cwd());
        ignoreWatch = true;
      }

      messages.push(msg);
    });

    grunt.util.hooker.hook(grunt.log, 'ok', function(msg){
      if( typeof msg === 'string' ) {
       messages.push(grunt.log.uncolor(msg));
      }
    });

    grunt.util.hooker.hook(grunt, 'warn', function(error){
      var warning = [];

      if( typeof error !== 'undefined' ) {
        warning.push(messages[0]);
        warning.push(messages[messages.length-1]);
        warning.push(String(error.message || error));
        messages = warning;
        flushMessages('error');
      }
    });

    grunt.util.hooker.hook(grunt.log, 'error', function(msg){
      if( typeof msg === 'string' ) {
       messages.push(grunt.log.uncolor(msg));
       flushMessages('error');
      }
    });
  }
function initGrowlStatus() {
    grunt.util.hooker.hook(grunt.log, 'write', function(msg){
      if( grunt.log.uncolor(msg).match(/Waiting.../) ) { flushMessages('ok'); }
    });

    grunt.util.hooker.hook(grunt.log, 'header', function(msg){
      msg = grunt.log.uncolor(msg);

      if( ignoreWatch && msg.match(/"watch" task/) ) { return; }

      if( msg.match(/".+:.+"/) ) { return; }

      if( !ignoreWatch && msg.match(/"watch" task/) ) {
        msg += ' for ' + path.basename(process.cwd());
        ignoreWatch = true;
      }

      messages.push(msg);
    });

    grunt.util.hooker.hook(grunt.log, 'ok', function(msg){
      if( typeof msg === 'string' ) {
       messages.push(grunt.log.uncolor(msg));
      }
    });

    grunt.util.hooker.hook(grunt, 'warn', function(error){
      var warning = [];

      if( typeof error !== 'undefined' ) {
        warning.push(messages[0]);
        warning.push(messages[messages.length-1]);
        warning.push(String(error.message || error));
        messages = warning;
        flushMessages('error');
      }
    });

    grunt.util.hooker.hook(grunt.log, 'error', function(msg){
      if( typeof msg === 'string' ) {
       messages.push(grunt.log.uncolor(msg));
       flushMessages('error');
      }
    });
  }
function initGrowlStatus ( ) { grunt . util . hooker . hook ( grunt . log , 'write' , function ( msg ) { if ( grunt . log . uncolor ( msg ) . match ( / Waiting... / ) ) { flushMessages ( 'ok' ) ; } } ) ; grunt . util . hooker . hook ( grunt . log , 'header' , function ( msg ) { msg = grunt . log . uncolor ( msg ) ; if ( ignoreWatch && msg . match ( / "watch" task / ) ) { return ; } if ( msg . match ( / ".+:.+" / ) ) { return ; } if ( ! ignoreWatch && msg . match ( / "watch" task / ) ) { msg += ' for ' + path . basename ( process . cwd ( ) ) ; ignoreWatch = true ; } messages . push ( msg ) ; } ) ; grunt . util . hooker . hook ( grunt . log , 'ok' , function ( msg ) { if ( typeof msg === 'string' ) { messages . push ( grunt . log . uncolor ( msg ) ) ; } } ) ; grunt . util . hooker . hook ( grunt , 'warn' , function ( error ) { var warning = [ ] ; if ( typeof error !== 'undefined' ) { warning . push ( messages [ 0 ] ) ; warning . push ( messages [ messages . length - 1 ] ) ; warning . push ( String ( error . message || error ) ) ; messages = warning ; flushMessages ( 'error' ) ; } } ) ; grunt . util . hooker . hook ( grunt . log , 'error' , function ( msg ) { if ( typeof msg === 'string' ) { messages . push ( grunt . log . uncolor ( msg ) ) ; flushMessages ( 'error' ) ; } } ) ; }
========================================================================== DEFAULT NOTIFICATIONS ==========================================================================
========================================================================== DEFAULT NOTIFICATIONS ==========================================================================