diff options
author | Kat Marchán <kzm@sykosomatic.org> | 2017-05-09 14:46:02 -0700 |
---|---|---|
committer | Anna Henningsen <anna@addaleax.net> | 2017-05-23 19:39:43 +0200 |
commit | c0d858f8bb8ba5212548da2fba6a7bc02db0462b (patch) | |
tree | 99f043ec5aec3f5150a2aed0f62597234b158140 /deps/npm/lib/install/actions.js | |
parent | 994617370e8e66f3ea9488fec32fd912e7902396 (diff) | |
download | node-new-c0d858f8bb8ba5212548da2fba6a7bc02db0462b.tar.gz |
deps: upgrade npm beta to 5.0.0-beta.56
PR-URL: https://github.com/nodejs/node/pull/12936
Reviewed-By: Anna Henningsen <anna@addaleax.net>
Diffstat (limited to 'deps/npm/lib/install/actions.js')
-rw-r--r-- | deps/npm/lib/install/actions.js | 202 |
1 files changed, 119 insertions, 83 deletions
diff --git a/deps/npm/lib/install/actions.js b/deps/npm/lib/install/actions.js index cb41217c02..912985e2c7 100644 --- a/deps/npm/lib/install/actions.js +++ b/deps/npm/lib/install/actions.js @@ -1,18 +1,16 @@ 'use strict' -var validate = require('aproba') -var chain = require('slide').chain -var asyncMap = require('slide').asyncMap -var limit = require('call-limit') -var iferr = require('iferr') -var npm = require('../npm.js') -var andFinishTracker = require('./and-finish-tracker.js') -var andAddParentToErrors = require('./and-add-parent-to-errors.js') -var failedDependency = require('./deps.js').failedDependency -var moduleName = require('../utils/module-name.js') -var reportOptionalFailure = require('./report-optional-failure.js') -var isInstallable = require('./validate-args.js').isInstallable - -var actions = {} + +const BB = require('bluebird') + +const andAddParentToErrors = require('./and-add-parent-to-errors.js') +const failedDependency = require('./deps.js').failedDependency +const isInstallable = BB.promisify(require('./validate-args.js').isInstallable) +const moduleName = require('../utils/module-name.js') +const npm = require('../npm.js') +const reportOptionalFailure = require('./report-optional-failure.js') +const validate = require('aproba') + +const actions = {} actions.fetch = require('./action/fetch.js') actions.extract = require('./action/extract.js') @@ -24,20 +22,19 @@ actions.prepare = require('./action/prepare.js') actions.finalize = require('./action/finalize.js') actions.remove = require('./action/remove.js') actions.move = require('./action/move.js') -actions['update-linked'] = require('./action/update-linked.js') actions['global-install'] = require('./action/global-install.js') actions['global-link'] = require('./action/global-link.js') +actions['refresh-package-json'] = require('./action/refresh-package-json.js') // FIXME: We wrap actions like three ways to sunday here. // Rewrite this to only work one way. Object.keys(actions).forEach(function (actionName) { var action = actions[actionName] - actions[actionName] = limit(function (staging, pkg, log, next) { - // top, buildpath, pkg, log - validate('SOOF', arguments) + actions[actionName] = (staging, pkg, log) => { + validate('SOO', [staging, pkg, log]) // refuse to run actions for failed packages - if (pkg.failed) return next() + if (pkg.failed) return BB.resolve() if (action.rollback) { if (!pkg.rollback) pkg.rollback = [] pkg.rollback.unshift(action.rollback) @@ -46,98 +43,137 @@ Object.keys(actions).forEach(function (actionName) { if (!pkg.commit) pkg.commit = [] pkg.commit.push(action.commit) } + + let actionP if (pkg.knownInstallable) { - return thenRunAction() + actionP = runAction(action, staging, pkg, log) } else { - return isInstallable(pkg.package, iferr(andDone(next), andMarkInstallable(thenRunAction))) - } - function andMarkInstallable (cb) { - return function () { + actionP = isInstallable(pkg.package).then(() => { pkg.knownInstallable = true - cb() - } + return runAction(action, staging, pkg, log) + }) } - function thenRunAction () { - action(staging, pkg, log, andDone(next)) - } - function andDone (cb) { - return andFinishTracker(log, andAddParentToErrors(pkg.parent, andHandleOptionalDepErrors(pkg, cb))) - } - }, npm.limit.action) + + return actionP.then(() => { + log.finish() + }, (err) => { + return BB.fromNode((cb) => { + andAddParentToErrors(pkg.parent, cb)(err) + }).catch((err) => { + return handleOptionalDepErrors(pkg, err) + }) + }) + } }) +exports.actions = actions + +function runAction (action, staging, pkg, log) { + return BB.fromNode((cb) => { + const result = action(staging, pkg, log, cb) + if (result && result.then) { + result.then(() => cb(), cb) + } + }) +} function markAsFailed (pkg) { pkg.failed = true - pkg.requires.forEach(function (req) { - req.requiredBy = req.requiredBy.filter(function (reqReqBy) { return reqReqBy !== pkg }) - if (req.requiredBy.length === 0 && !req.userRequired && !req.existing) { + pkg.requires.forEach((req) => { + req.requiredBy = req.requiredBy.filter((reqReqBy) => { + return reqReqBy !== pkg + }) + if (req.requiredBy.length === 0 && !req.userRequired) { markAsFailed(req) } }) } -function andHandleOptionalDepErrors (pkg, next) { - return function (er) { - if (!er) return next.apply(null, arguments) - markAsFailed(pkg) - var anyFatal = pkg.userRequired || pkg.isTop - for (var ii = 0; ii < pkg.requiredBy.length; ++ii) { - var parent = pkg.requiredBy[ii] - var isFatal = failedDependency(parent, pkg) - if (isFatal) anyFatal = true - } - if (anyFatal) return next.apply(null, arguments) - reportOptionalFailure(pkg, null, er) - next() +function handleOptionalDepErrors (pkg, err) { + markAsFailed(pkg) + var anyFatal = pkg.userRequired || pkg.isTop + for (var ii = 0; ii < pkg.requiredBy.length; ++ii) { + var parent = pkg.requiredBy[ii] + var isFatal = failedDependency(parent, pkg) + if (isFatal) anyFatal = true } -} - -function prepareAction (staging, log) { - validate('SO', arguments) - return function (action) { - validate('SO', action) - var cmd = action[0] - var pkg = action[1] - if (!actions[cmd]) throw new Error('Unknown decomposed command "' + cmd + '" (is it new?)') - return [actions[cmd], staging, pkg, log.newGroup(cmd + ':' + moduleName(pkg))] + if (anyFatal) { + throw err + } else { + reportOptionalFailure(pkg, null, err) } } -exports.actions = actions - -function execAction (todo, done) { - validate('AF', arguments) - var cmd = todo.shift() - todo.push(done) - cmd.apply(null, todo) +exports.doOne = doOne +function doOne (cmd, staging, pkg, log, next) { + validate('SSOOF', arguments) + execAction(prepareAction([cmd, pkg], staging, log)).then(() => next(), next) } -exports.doOne = function (cmd, staging, pkg, log, next) { - validate('SSOOF', arguments) - execAction(prepareAction(staging, log)([cmd, pkg]), next) +exports.doParallel = doParallel +function doParallel (type, staging, actionsToRun, log, next) { + validate('SSAOF', arguments) + const acts = actionsToRun.reduce((acc, todo) => { + if (todo[0] === type) { + acc.push(prepareAction(todo, staging, log)) + } + return acc + }, []) + log.silly('doParallel', type + ' ' + actionsToRun.length) + time(log) + BB.map(acts, execAction, { + concurrency: npm.limit.action + }).nodeify((err) => { + log.finish() + timeEnd(log) + next(err) + }) } -exports.doSerial = function (type, staging, actionsToRun, log, next) { +exports.doSerial = doSerial +function doSerial (type, staging, actionsToRun, log, next) { validate('SSAOF', arguments) - actionsToRun = actionsToRun - .filter(function (value) { return value[0] === type }) log.silly('doSerial', '%s %d', type, actionsToRun.length) - chain(actionsToRun.map(prepareAction(staging, log)), andFinishTracker(log, next)) + runSerial(type, staging, actionsToRun, log, next) } -exports.doReverseSerial = function (type, staging, actionsToRun, log, next) { +exports.doReverseSerial = doReverseSerial +function doReverseSerial (type, staging, actionsToRun, log, next) { validate('SSAOF', arguments) - actionsToRun = actionsToRun - .filter(function (value) { return value[0] === type }) - .reverse() log.silly('doReverseSerial', '%s %d', type, actionsToRun.length) - chain(actionsToRun.map(prepareAction(staging, log)), andFinishTracker(log, next)) + runSerial(type, staging, actionsToRun.reverse(), log, next) } -exports.doParallel = function (type, staging, actionsToRun, log, next) { - validate('SSAOF', arguments) - actionsToRun = actionsToRun.filter(function (value) { return value[0] === type }) - log.silly('doParallel', type + ' ' + actionsToRun.length) +function runSerial (type, staging, actionsToRun, log, next) { + const acts = actionsToRun.reduce((acc, todo) => { + if (todo[0] === type) { + acc.push(prepareAction(todo, staging, log)) + } + return acc + }, []) + time(log) + BB.each(acts, execAction).nodeify((err) => { + log.finish() + timeEnd(log) + next(err) + }) +} + +function time (log) { + process.emit('time', 'action:' + log.name) +} +function timeEnd (log) { + process.emit('timeEnd', 'action:' + log.name) +} + +function prepareAction (action, staging, log) { + validate('ASO', arguments) + validate('SO', action) + var cmd = action[0] + var pkg = action[1] + if (!actions[cmd]) throw new Error('Unknown decomposed command "' + cmd + '" (is it new?)') + return [actions[cmd], staging, pkg, log.newGroup(cmd + ':' + moduleName(pkg))] +} - asyncMap(actionsToRun.map(prepareAction(staging, log)), execAction, andFinishTracker(log, next)) +function execAction (todo) { + return todo[0].apply(null, todo.slice(1)) } |