aboutsummaryrefslogtreecommitdiff
path: root/deps/npm/lib/install/actions.js
diff options
context:
space:
mode:
authorKat Marchán <kzm@sykosomatic.org>2017-05-09 14:46:02 -0700
committerAnna Henningsen <anna@addaleax.net>2017-05-23 19:39:43 +0200
commitc0d858f8bb8ba5212548da2fba6a7bc02db0462b (patch)
tree99f043ec5aec3f5150a2aed0f62597234b158140 /deps/npm/lib/install/actions.js
parent994617370e8e66f3ea9488fec32fd912e7902396 (diff)
downloadandroid-node-v8-c0d858f8bb8ba5212548da2fba6a7bc02db0462b.tar.gz
android-node-v8-c0d858f8bb8ba5212548da2fba6a7bc02db0462b.tar.bz2
android-node-v8-c0d858f8bb8ba5212548da2fba6a7bc02db0462b.zip
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.js202
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))
}