diff options
Diffstat (limited to 'deps/npm/lib/utils/error-handler.js')
-rw-r--r-- | deps/npm/lib/utils/error-handler.js | 192 |
1 files changed, 76 insertions, 116 deletions
diff --git a/deps/npm/lib/utils/error-handler.js b/deps/npm/lib/utils/error-handler.js index 902ad7af9b..16abcd67ce 100644 --- a/deps/npm/lib/utils/error-handler.js +++ b/deps/npm/lib/utils/error-handler.js @@ -1,40 +1,37 @@ - -module.exports = errorHandler -module.exports.exit = exit - -var cbCalled = false -var log = require('npmlog') -var npm = require('../npm.js') -var itWorked = false -var path = require('path') -var wroteLogFile = false -var exitCode = 0 -var rollbacks = npm.rollbacks -var chain = require('slide').chain -var errorMessage = require('./error-message.js') -var replaceInfo = require('./replace-info.js') -var stopMetrics = require('./metrics.js').stop +let cbCalled = false +const log = require('npmlog') +const npm = require('../npm.js') +let itWorked = false +const path = require('path') +let wroteLogFile = false +let exitCode = 0 +const errorMessage = require('./error-message.js') +const stopMetrics = require('./metrics.js').stop const cacheFile = require('./cache-file.js') -var logFileName -function getLogFile () { +let logFileName +const getLogFile = () => { if (!logFileName) { logFileName = path.resolve(npm.config.get('cache'), '_logs', (new Date()).toISOString().replace(/[.:]/g, '_') + '-debug.log') } return logFileName } -var timings = { +const timings = { version: npm.version, command: process.argv.slice(2), logfile: null } -process.on('timing', function (name, value) { - if (timings[name]) { timings[name] += value } else { timings[name] = value } +process.on('timing', (name, value) => { + if (timings[name]) { + timings[name] += value + } else { + timings[name] = value + } }) -process.on('exit', function (code) { +process.on('exit', code => { process.emit('timeEnd', 'npm') log.disableProgress() if (npm.config && npm.config.loaded && npm.config.get('timing')) { @@ -57,7 +54,7 @@ process.on('exit', function (code) { log.error('', 'cb() never called!') console.error('') log.error('', 'This is an error with npm itself. Please report this error at:') - log.error('', ' <https://npm.community>') + log.error('', ' <https://github.com/npm/cli/issues>') writeLogFile() } @@ -80,54 +77,20 @@ process.on('exit', function (code) { wroteLogFile = false } - var doExit = npm.config && npm.config.loaded && npm.config.get('_exit') - if (doExit) { - // actually exit. - if (exitCode === 0 && !itWorked) { - exitCode = 1 - } - if (exitCode !== 0) process.exit(exitCode) - } else { - itWorked = false // ready for next exit + // actually exit. + if (exitCode === 0 && !itWorked) { + exitCode = 1 } + if (exitCode !== 0) process.exit(exitCode) }) -function exit (code, noLog) { +const exit = (code, noLog) => { exitCode = exitCode || process.exitCode || code - var doExit = npm.config && npm.config.loaded ? npm.config.get('_exit') : true - log.verbose('exit', [code, doExit]) + log.verbose('exit', code) if (log.level === 'silent') noLog = true - if (rollbacks.length) { - chain(rollbacks.map(function (f) { - return function (cb) { - npm.commands.unbuild([f], true, cb) - } - }), function (er) { - if (er) { - log.error('error rolling back', er) - if (!code) { - errorHandler(er) - } else { - if (!noLog) writeLogFile() - reallyExit(er) - } - } else { - if (!noLog && code) writeLogFile() - reallyExit() - } - }) - rollbacks.length = 0 - } else if (code && !noLog) { - writeLogFile() - } else { - reallyExit() - } - - function reallyExit (er) { - if (er && !code) code = typeof er.errno === 'number' ? er.errno : 1 - + const reallyExit = () => { itWorked = !code // Exit directly -- nothing in the CLI should still be running in the @@ -139,9 +102,15 @@ function exit (code, noLog) { process.exit(code) }) } + + if (code && !noLog) { + writeLogFile() + } else { + reallyExit() + } } -function errorHandler (er) { +const errorHandler = (er) => { log.disableProgress() if (!npm.config || !npm.config.loaded) { // logging won't work unless we pretend that it's ready @@ -153,6 +122,13 @@ function errorHandler (er) { er = er || new Error('Callback called more than once.') } + if (npm.updateNotification) { + const { level } = log + log.level = log.levels.notice + log.notice('', npm.updateNotification) + log.level = level + } + cbCalled = true if (!er) return exit(0) if (typeof er === 'string') { @@ -163,50 +139,35 @@ function errorHandler (er) { return exit(1, true) } - var m = er.code || er.message.match(/^(?:Error: )?(E[A-Z]+)/) - if (m && !er.code) { - er.code = m + if (!er.code) { + const matchErrorCode = er.message.match(/^(?:Error: )?(E[A-Z]+)/) + er.code = matchErrorCode && matchErrorCode[1] } - ;[ - 'type', - 'stack', - 'statusCode', - 'pkgid' - ].forEach(function (k) { - var v = er[k] - if (!v) return - v = replaceInfo(v) - log.verbose(k, v) - }) + for (const k of ['type', 'stack', 'statusCode', 'pkgid']) { + const v = er[k] + if (v) log.verbose(k, v) + } log.verbose('cwd', process.cwd()) - var os = require('os') - var args = replaceInfo(process.argv) + const os = require('os') log.verbose('', os.type() + ' ' + os.release()) - log.verbose('argv', args.map(JSON.stringify).join(' ')) + log.verbose('argv', process.argv.map(JSON.stringify).join(' ')) log.verbose('node', process.version) log.verbose('npm ', 'v' + npm.version) - ;[ - 'code', - 'syscall', - 'file', - 'path', - 'dest', - 'errno' - ].forEach(function (k) { - var v = er[k] + for (const k of ['code', 'syscall', 'file', 'path', 'dest', 'errno']) { + const v = er[k] if (v) log.error(k, v) - }) + } - var msg = errorMessage(er) - msg.summary.concat(msg.detail).forEach(function (errline) { - log.error.apply(log, errline) - }) + const msg = errorMessage(er) + for (const errline of [...msg.summary, ...msg.detail]) { + log.error(...errline) + } if (npm.config && npm.config.get('json')) { - var error = { + const error = { error: { code: er.code, summary: messageText(msg.summary), @@ -216,32 +177,28 @@ function errorHandler (er) { console.log(JSON.stringify(error, null, 2)) } - exit(typeof er.errno === 'number' ? er.errno : 1) + exit(typeof er.errno === 'number' ? er.errno : typeof er.code === 'number' ? er.code : 1) } -function messageText (msg) { - return msg.map(function (line) { - return line.slice(1).join(' ') - }).join('\n') -} +const messageText = msg => msg.map(line => line.slice(1).join(' ')).join('\n') -function writeLogFile () { +const writeLogFile = () => { if (wroteLogFile) return - var os = require('os') + const os = require('os') try { - var logOutput = '' - log.record.forEach(function (m) { - var pref = [m.id, m.level] - if (m.prefix) pref.push(m.prefix) - pref = pref.join(' ') - - m.message.trim().split(/\r?\n/).map(function (line) { - return (pref + ' ' + line).trim() - }).forEach(function (line) { - logOutput += line + os.EOL - }) + let logOutput = '' + log.record.forEach(m => { + const p = [m.id, m.level] + if (m.prefix) p.push(m.prefix) + const pref = p.join(' ') + + m.message.trim().split(/\r?\n/) + .map(line => (pref + ' ' + line).trim()) + .forEach(line => { + logOutput += line + os.EOL + }) }) cacheFile.write(getLogFile(), logOutput) @@ -252,3 +209,6 @@ function writeLogFile () { } } + +module.exports = errorHandler +module.exports.exit = exit |