diff options
Diffstat (limited to 'deps/npm/lib/utils/error-handler.js')
-rw-r--r-- | deps/npm/lib/utils/error-handler.js | 48 |
1 files changed, 35 insertions, 13 deletions
diff --git a/deps/npm/lib/utils/error-handler.js b/deps/npm/lib/utils/error-handler.js index da716679d2..f40e1f04fb 100644 --- a/deps/npm/lib/utils/error-handler.js +++ b/deps/npm/lib/utils/error-handler.js @@ -1,28 +1,27 @@ +let npm // set by the cli let cbCalled = false const log = require('npmlog') -const npm = require('../npm.js') let itWorked = false const path = require('path') +const writeFileAtomic = require('write-file-atomic') +const mkdirp = require('mkdirp-infer-owner') +const fs = require('graceful-fs') let wroteLogFile = false let exitCode = 0 const errorMessage = require('./error-message.js') const replaceInfo = require('./replace-info.js') -const cacheFile = require('./cache-file.js') - let logFileName const getLogFile = () => { + // we call this multiple times, so we need to treat it as a singleton because + // the date is part of the name if (!logFileName) logFileName = path.resolve(npm.config.get('cache'), '_logs', (new Date()).toISOString().replace(/[.:]/g, '_') + '-debug.log') return logFileName } -const timings = { - version: npm.version, - command: process.argv.slice(2), - logfile: null, -} +const timings = {} process.on('timing', (name, value) => { if (timings[name]) timings[name] += value @@ -35,9 +34,21 @@ process.on('exit', code => { log.disableProgress() if (npm.config && npm.config.loaded && npm.config.get('timing')) { try { - timings.logfile = getLogFile() - cacheFile.append('_timing.json', JSON.stringify(timings) + '\n') - } catch (_) { + const file = path.resolve(npm.config.get('cache'), '_timing.json') + const dir = path.dirname(npm.config.get('cache')) + mkdirp.sync(dir) + + fs.appendFileSync(file, JSON.stringify({ + command: process.argv.slice(2), + logfile: getLogFile(), + version: npm.version, + ...timings, + }) + '\n') + + const st = fs.lstatSync(path.dirname(npm.config.get('cache'))) + fs.chownSync(dir, st.uid, st.gid) + fs.chownSync(file, st.uid, st.gid) + } catch (ex) { // ignore } } @@ -174,7 +185,7 @@ const errorHandler = (er) => { log.error(k, v) } - const msg = errorMessage(er) + const msg = errorMessage(er, npm) for (const errline of [...msg.summary, ...msg.detail]) log.error(...errline) @@ -214,7 +225,15 @@ const writeLogFile = () => { logOutput += line + os.EOL }) }) - cacheFile.write(getLogFile(), logOutput) + + const file = getLogFile() + const dir = path.dirname(file) + mkdirp.sync(dir) + writeFileAtomic.sync(file, logOutput) + + const st = fs.lstatSync(path.dirname(npm.config.get('cache'))) + fs.chownSync(dir, st.uid, st.gid) + fs.chownSync(file, st.uid, st.gid) // truncate once it's been written. log.record.length = 0 @@ -226,3 +245,6 @@ const writeLogFile = () => { module.exports = errorHandler module.exports.exit = exit +module.exports.setNpm = (n) => { + npm = n +} |