/* * grunt * http://gruntjs.com/ * * Copyright (c) 2013 "Cowboy" Ben Alman * Licensed under the MIT license. * https://github.com/gruntjs/grunt/blob/master/LICENSE-MIT */ 'use strict'; var grunt = require('../grunt'); // The module to be exported. var fail = module.exports = {}; // Error codes. fail.code = { FATAL_ERROR: 1, MISSING_GRUNTFILE: 2, TASK_FAILURE: 3, TEMPLATE_ERROR: 4, INVALID_AUTOCOMPLETE: 5, WARNING: 6, }; // DRY it up! function writeln(e, mode) { grunt.log.muted = false; var msg = String(e.message || e); if (!grunt.option('no-color')) { msg += '\x07'; } // Beep! if (mode === 'warn') { msg = 'Warning: ' + msg + ' '; msg += (grunt.option('force') ? 'Used --force, continuing.'.underline : 'Use --force to continue.'); msg = msg.yellow; } else { msg = ('Fatal error: ' + msg).red; } grunt.log.writeln(msg); } // If --stack is enabled, log the appropriate error stack (if it exists). function dumpStack(e) { if (grunt.option('stack')) { if (e.origError && e.origError.stack) { console.log(e.origError.stack); } else if (e.stack) { console.log(e.stack); } } } // A fatal error occurred. Abort immediately. fail.fatal = function(e, errcode) { writeln(e, 'fatal'); dumpStack(e); grunt.util.exit(typeof errcode === 'number' ? errcode : fail.code.FATAL_ERROR); }; // Keep track of error and warning counts. fail.errorcount = 0; fail.warncount = 0; // A warning occurred. Abort immediately unless -f or --force was used. fail.warn = function(e, errcode) { var message = typeof e === 'string' ? e : e.message; fail.warncount++; writeln(message, 'warn'); // If -f or --force aren't used, stop script processing. if (!grunt.option('force')) { dumpStack(e); grunt.log.writeln().fail('Aborted due to warnings.'); grunt.util.exit(typeof errcode === 'number' ? errcode : fail.code.WARNING); } }; // This gets called at the very end. fail.report = function() { if (fail.warncount > 0) { grunt.log.writeln().fail('Done, but with warnings.'); } else { grunt.log.writeln().success('Done, without errors.'); } };