aboutsummaryrefslogtreecommitdiff
path: root/deps/npm/lib/doctor
diff options
context:
space:
mode:
Diffstat (limited to 'deps/npm/lib/doctor')
-rw-r--r--deps/npm/lib/doctor/check-files-permission.js20
-rw-r--r--deps/npm/lib/doctor/check-ping.js5
-rw-r--r--deps/npm/lib/doctor/checksum-cached-files.js62
-rw-r--r--deps/npm/lib/doctor/get-latest-npm-version.js5
-rw-r--r--deps/npm/lib/doctor/verify-cached-files.js19
5 files changed, 36 insertions, 75 deletions
diff --git a/deps/npm/lib/doctor/check-files-permission.js b/deps/npm/lib/doctor/check-files-permission.js
index 74393596f6..50014fd232 100644
--- a/deps/npm/lib/doctor/check-files-permission.js
+++ b/deps/npm/lib/doctor/check-files-permission.js
@@ -9,12 +9,12 @@ var fileCompletion = require('../utils/completion/file-completion.js')
function checkFilesPermission (root, mask, cb) {
if (process.platform === 'win32') return cb(null, true)
getUid(npm.config.get('user'), npm.config.get('group'), function (e, uid, gid) {
+ var tracker = log.newItem('checkFilePermissions', 1)
if (e) {
tracker.finish()
tracker.warn('checkFilePermissions', 'Error looking up user and group:', e)
return cb(e)
}
- var tracker = log.newItem('checkFilePermissions', 1)
tracker.info('checkFilePermissions', 'Building file list of ' + root)
fileCompletion(root, '.', Infinity, function (e, files) {
if (e) {
@@ -38,14 +38,16 @@ function checkFilesPermission (root, mask, cb) {
tracker.completeWork(1)
if (e) return next(e)
if (!stat.isFile()) return next()
- var mode = stat.mode
- var isGroup = stat.gid ? stat.gid === gid : true
- var isUser = stat.uid ? stat.uid === uid : true
- if ((mode & parseInt('000' + mask, 8))) return next()
- if ((isGroup && mode & parseInt('00' + mask + '0', 8))) return next()
- if ((isUser && mode & parseInt('0' + mask + '00', 8))) return next()
- tracker.error('checkFilePermissions', 'Missing permissions on (' + isGroup + ', ' + isUser + ', ' + mode + ')', file)
- return next(new Error('Missing permissions for ' + file))
+ // 6 = fs.constants.R_OK | fs.constants.W_OK
+ // constants aren't available on v4
+ fs.access(file, 6, (err) => {
+ if (err) {
+ tracker.error('checkFilePermissions', `Missing permissions on ${file}`)
+ return next(new Error('Missing permissions for ' + file))
+ } else {
+ return next()
+ }
+ })
})
}
})
diff --git a/deps/npm/lib/doctor/check-ping.js b/deps/npm/lib/doctor/check-ping.js
index 99e4ea2ba2..29a25c2fb7 100644
--- a/deps/npm/lib/doctor/check-ping.js
+++ b/deps/npm/lib/doctor/check-ping.js
@@ -4,9 +4,10 @@ var ping = require('../ping.js')
function checkPing (cb) {
var tracker = log.newItem('checkPing', 1)
tracker.info('checkPing', 'Pinging registry')
- ping({}, true, function (err, pong) {
+ ping({}, true, function (err, pong, data, res) {
+ if (err) { return cb(err) }
tracker.finish()
- cb(err, pong)
+ cb(null, [res.statusCode, res.statusMessage])
})
}
diff --git a/deps/npm/lib/doctor/checksum-cached-files.js b/deps/npm/lib/doctor/checksum-cached-files.js
deleted file mode 100644
index d50c326852..0000000000
--- a/deps/npm/lib/doctor/checksum-cached-files.js
+++ /dev/null
@@ -1,62 +0,0 @@
-var crypto = require('crypto')
-var fs = require('fs')
-var path = require('path')
-var chain = require('slide').chain
-var log = require('npmlog')
-var npm = require('../npm')
-var fileCompletion = require('../utils/completion/file-completion.js')
-
-function checksum (str) {
- return crypto
- .createHash('sha1')
- .update(str, 'utf8')
- .digest('hex')
-}
-
-function checksumCachedFiles (cb) {
- var tracker = log.newItem('checksumCachedFiles', 1)
- tracker.info('checksumCachedFiles', 'Building file list of ' + npm.cache)
- fileCompletion(npm.cache, '.', Infinity, function (e, files) {
- if (e) {
- tracker.finish()
- return cb(e)
- }
- tracker.addWork(files.length)
- tracker.completeWork(1)
- chain(files.map(andChecksumFile), function (er) {
- tracker.finish()
- cb(null, !er)
- })
- function andChecksumFile (f) {
- return [function (next) { process.nextTick(function () { checksumFile(f, next) }) }]
- }
- function checksumFile (f, next) {
- var file = path.join(npm.cache, f)
- tracker.silly('checksumFile', f)
- if (!/.tgz$/.test(file)) {
- tracker.completeWork(1)
- return next()
- }
- fs.readFile(file, function (err, tgz) {
- tracker.completeWork(1)
- if (err) return next(err)
- try {
- var pkgJSON = fs.readFileSync(path.join(path.dirname(file), 'package/package.json'))
- } catch (e) {
- return next() // no package.json in cche is ok
- }
- try {
- var pkg = JSON.parse(pkgJSON)
- var shasum = (pkg.dist && pkg.dist.shasum) || pkg._shasum
- var actual = checksum(tgz)
- if (actual !== shasum) return next(new Error('Checksum mismatch on ' + file + ', expected: ' + shasum + ', got: ' + shasum))
- return next()
- } catch (e) {
- return next(new Error('Error parsing JSON in ' + file + ': ' + e))
- }
- })
- }
- })
-}
-
-module.exports = checksumCachedFiles
diff --git a/deps/npm/lib/doctor/get-latest-npm-version.js b/deps/npm/lib/doctor/get-latest-npm-version.js
index aba9b773cd..5a096ab895 100644
--- a/deps/npm/lib/doctor/get-latest-npm-version.js
+++ b/deps/npm/lib/doctor/get-latest-npm-version.js
@@ -4,9 +4,10 @@ var fetchPackageMetadata = require('../fetch-package-metadata')
function getLatestNpmVersion (cb) {
var tracker = log.newItem('getLatestNpmVersion', 1)
tracker.info('getLatestNpmVersion', 'Getting npm package information')
- fetchPackageMetadata('npm@latest', '.', {fullMetadata: true}, function (e, d) {
+ fetchPackageMetadata('npm@latest', '.', {}, function (err, d) {
tracker.finish()
- cb(e, d.version)
+ if (err) { return cb(err) }
+ cb(null, d.version)
})
}
diff --git a/deps/npm/lib/doctor/verify-cached-files.js b/deps/npm/lib/doctor/verify-cached-files.js
new file mode 100644
index 0000000000..f00dbd6256
--- /dev/null
+++ b/deps/npm/lib/doctor/verify-cached-files.js
@@ -0,0 +1,19 @@
+'use strict'
+
+const cacache = require('cacache')
+const log = require('npmlog')
+
+module.exports = verifyCachedFiles
+function verifyCachedFiles (cache, cb) {
+ log.info('verifyCachedFiles', `Verifying cache at ${cache}`)
+ cacache.verify(cache).then((stats) => {
+ log.info('verifyCachedFiles', `Verification complete. Stats: ${JSON.stringify(stats, 2)}`)
+ if (stats.reclaimedCount || stats.badContentCount || stats.missingContent) {
+ stats.badContentCount && log.warn('verifyCachedFiles', `Corrupted content removed: ${stats.badContentCount}`)
+ stats.reclaimedCount && log.warn('verifyCachedFiles', `Content garbage-collected: ${stats.reclaimedCount} (${stats.reclaimedSize} bytes)`)
+ stats.missingContent && log.warn('verifyCachedFiles', `Missing content: ${stats.missingContent}`)
+ log.warn('verifyCachedFiles', 'Cache issues have been fixed')
+ }
+ return stats
+ }).then((s) => cb(null, s), cb)
+}