summaryrefslogtreecommitdiff
path: root/deps/npm/lib/utils/error-handler.js
diff options
context:
space:
mode:
Diffstat (limited to 'deps/npm/lib/utils/error-handler.js')
-rw-r--r--deps/npm/lib/utils/error-handler.js48
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
+}