diff options
Diffstat (limited to 'deps/node/deps/npm/lib/update.js')
-rw-r--r-- | deps/node/deps/npm/lib/update.js | 72 |
1 files changed, 72 insertions, 0 deletions
diff --git a/deps/node/deps/npm/lib/update.js b/deps/node/deps/npm/lib/update.js new file mode 100644 index 00000000..9b1345f9 --- /dev/null +++ b/deps/node/deps/npm/lib/update.js @@ -0,0 +1,72 @@ +'use strict' +module.exports = update + +const url = require('url') +const log = require('npmlog') +const Bluebird = require('bluebird') +const npm = require('./npm.js') +const Installer = require('./install.js').Installer +const usage = require('./utils/usage') +const outdated = Bluebird.promisify(npm.commands.outdated) + +update.usage = usage( + 'update', + 'npm update [-g] [<pkg>...]' +) + +update.completion = npm.commands.outdated.completion + +function update (args, cb) { + return update_(args).asCallback(cb) +} + +function update_ (args) { + let dryrun = false + if (npm.config.get('dry-run')) dryrun = true + + log.verbose('update', 'computing outdated modules to update') + return outdated(args, true).then((rawOutdated) => { + const outdated = rawOutdated.map(function (ww) { + return { + dep: ww[0], + depname: ww[1], + current: ww[2], + wanted: ww[3], + latest: ww[4], + req: ww[5], + what: ww[1] + '@' + ww[3] + } + }) + + const wanted = outdated.filter(function (ww) { + if (ww.current === ww.wanted && ww.wanted !== ww.latest) { + log.verbose( + 'outdated', + 'not updating', ww.depname, + "because it's currently at the maximum version that matches its specified semver range" + ) + } + return ww.current !== ww.wanted && ww.latest !== 'linked' + }) + if (wanted.length === 0) return + + log.info('outdated', 'updating', wanted) + const toInstall = {} + + wanted.forEach(function (ww) { + // use the initial installation method (repo, tar, git) for updating + if (url.parse(ww.req).protocol) ww.what = ww.req + + const where = (ww.dep.parent && ww.dep.parent.path) || ww.dep.path + const isTransitive = !(ww.dep.requiredBy || []).some((p) => p.isTop) + const key = where + ':' + String(isTransitive) + if (!toInstall[key]) toInstall[key] = {where: where, opts: {saveOnlyLock: isTransitive}, what: []} + if (toInstall[key].what.indexOf(ww.what) === -1) toInstall[key].what.push(ww.what) + }) + return Bluebird.each(Object.keys(toInstall), (key) => { + const deps = toInstall[key] + const inst = new Installer(deps.where, dryrun, deps.what, deps.opts) + return inst.run() + }) + }) +} |