mirror of
https://github.com/nodejs/node.git
synced 2025-05-16 14:23:58 +00:00

Conflicts: ChangeLog Makefile deps/npm/AUTHORS deps/npm/html/api/bin.html deps/npm/html/api/bugs.html deps/npm/html/api/commands.html deps/npm/html/api/config.html deps/npm/html/api/deprecate.html deps/npm/html/api/docs.html deps/npm/html/api/edit.html deps/npm/html/api/explore.html deps/npm/html/api/help-search.html deps/npm/html/api/init.html deps/npm/html/api/install.html deps/npm/html/api/link.html deps/npm/html/api/load.html deps/npm/html/api/ls.html deps/npm/html/api/npm.html deps/npm/html/api/outdated.html deps/npm/html/api/owner.html deps/npm/html/api/pack.html deps/npm/html/api/prefix.html deps/npm/html/api/prune.html deps/npm/html/api/publish.html deps/npm/html/api/rebuild.html deps/npm/html/api/restart.html deps/npm/html/api/root.html deps/npm/html/api/run-script.html deps/npm/html/api/search.html deps/npm/html/api/shrinkwrap.html deps/npm/html/api/start.html deps/npm/html/api/stop.html deps/npm/html/api/submodule.html deps/npm/html/api/tag.html deps/npm/html/api/test.html deps/npm/html/api/uninstall.html deps/npm/html/api/unpublish.html deps/npm/html/api/update.html deps/npm/html/api/version.html deps/npm/html/api/view.html deps/npm/html/api/whoami.html deps/npm/html/doc/README.html deps/npm/html/doc/adduser.html deps/npm/html/doc/bin.html deps/npm/html/doc/bugs.html deps/npm/html/doc/build.html deps/npm/html/doc/bundle.html deps/npm/html/doc/cache.html deps/npm/html/doc/changelog.html deps/npm/html/doc/coding-style.html deps/npm/html/doc/completion.html deps/npm/html/doc/config.html deps/npm/html/doc/deprecate.html deps/npm/html/doc/developers.html deps/npm/html/doc/disputes.html deps/npm/html/doc/docs.html deps/npm/html/doc/edit.html deps/npm/html/doc/explore.html deps/npm/html/doc/faq.html deps/npm/html/doc/folders.html deps/npm/html/doc/help-search.html deps/npm/html/doc/help.html deps/npm/html/doc/index.html deps/npm/html/doc/init.html deps/npm/html/doc/install.html deps/npm/html/doc/json.html deps/npm/html/doc/link.html deps/npm/html/doc/list.html deps/npm/html/doc/npm.html deps/npm/html/doc/outdated.html deps/npm/html/doc/owner.html deps/npm/html/doc/pack.html deps/npm/html/doc/prefix.html deps/npm/html/doc/prune.html deps/npm/html/doc/publish.html deps/npm/html/doc/rebuild.html deps/npm/html/doc/registry.html deps/npm/html/doc/removing-npm.html deps/npm/html/doc/restart.html deps/npm/html/doc/root.html deps/npm/html/doc/run-script.html deps/npm/html/doc/scripts.html deps/npm/html/doc/search.html deps/npm/html/doc/semver.html deps/npm/html/doc/shrinkwrap.html deps/npm/html/doc/star.html deps/npm/html/doc/start.html deps/npm/html/doc/stop.html deps/npm/html/doc/submodule.html deps/npm/html/doc/tag.html deps/npm/html/doc/test.html deps/npm/html/doc/uninstall.html deps/npm/html/doc/unpublish.html deps/npm/html/doc/update.html deps/npm/html/doc/version.html deps/npm/html/doc/view.html deps/npm/html/doc/whoami.html deps/npm/man/man1/npm.1 deps/npm/man/man3/npm.3 deps/npm/package.json doc/api/url.markdown lib/http.js src/node_version.h test/simple/test-fs-sync-fd-leak.js
86 lines
2.8 KiB
JavaScript
86 lines
2.8 KiB
JavaScript
module.exports = unbuild
|
|
unbuild.usage = "npm unbuild <folder>\n(this is plumbing)"
|
|
|
|
var readJson = require("./utils/read-json.js")
|
|
, rm = require("rimraf")
|
|
, npm = require("./npm.js")
|
|
, path = require("path")
|
|
, fs = require("graceful-fs")
|
|
, lifecycle = require("./utils/lifecycle.js")
|
|
, asyncMap = require("slide").asyncMap
|
|
, chain = require("slide").chain
|
|
, log = require("./utils/log.js")
|
|
, build = require("./build.js")
|
|
|
|
// args is a list of folders.
|
|
// remove any bins/etc, and then delete the folder.
|
|
function unbuild (args, cb) { asyncMap(args, unbuild_, cb) }
|
|
|
|
function unbuild_ (folder, cb) {
|
|
folder = path.resolve(folder)
|
|
delete build._didBuild[folder]
|
|
log.info(folder, "unbuild")
|
|
readJson(path.resolve(folder, "package.json"), function (er, pkg) {
|
|
// if no json, then just trash it, but no scripts or whatever.
|
|
if (er) return rm(folder, cb)
|
|
readJson.clearCache(folder)
|
|
chain
|
|
( [ [lifecycle, pkg, "preuninstall", folder, false, true]
|
|
, [lifecycle, pkg, "uninstall", folder, false, true]
|
|
, [rmStuff, pkg, folder]
|
|
, [lifecycle, pkg, "postuninstall", folder, false, true]
|
|
, [rm, folder] ]
|
|
, cb )
|
|
})
|
|
}
|
|
|
|
function rmStuff (pkg, folder, cb) {
|
|
// if it's global, and folder is in {prefix}/node_modules,
|
|
// then bins are in {prefix}/bin
|
|
// otherwise, then bins are in folder/../.bin
|
|
var parent = path.dirname(folder)
|
|
, gnm = npm.dir
|
|
, top = gnm === parent
|
|
|
|
log.verbose([top, gnm, parent], "unbuild "+pkg._id)
|
|
asyncMap([rmBins, rmMans], function (fn, cb) {
|
|
fn(pkg, folder, parent, top, cb)
|
|
}, cb)
|
|
}
|
|
|
|
function rmBins (pkg, folder, parent, top, cb) {
|
|
if (!pkg.bin) return cb()
|
|
var binRoot = top ? npm.bin : path.resolve(parent, ".bin")
|
|
log.verbose([binRoot, pkg.bin], "binRoot")
|
|
asyncMap(Object.keys(pkg.bin), function (b, cb) {
|
|
if (process.platform === "win32") {
|
|
rm(path.resolve(binRoot, b) + ".cmd", cb)
|
|
} else {
|
|
rm( path.resolve(binRoot, b)
|
|
, { gently: !npm.config.get("force") && folder }
|
|
, cb )
|
|
}
|
|
}, cb)
|
|
}
|
|
|
|
function rmMans (pkg, folder, parent, top, cb) {
|
|
if (!pkg.man || !top || process.platform === "win32") return cb()
|
|
var manRoot = path.resolve(npm.config.get("prefix"), "share", "man")
|
|
asyncMap(pkg.man, function (man, cb) {
|
|
var parseMan = man.match(/(.*)\.([0-9]+)(\.gz)?$/)
|
|
, stem = parseMan[1]
|
|
, sxn = parseMan[2]
|
|
, gz = parseMan[3] || ""
|
|
, bn = path.basename(stem)
|
|
, manDest = path.join( manRoot
|
|
, "man"+sxn
|
|
, (bn.indexOf(pkg.name) === 0 ? bn
|
|
: pkg.name + "-" + bn)
|
|
+ "." + sxn + gz
|
|
)
|
|
rm( manDest
|
|
, { gently: !npm.config.get("force") && folder }
|
|
, cb )
|
|
}, cb)
|
|
}
|