mirror of
https://github.com/nodejs/node.git
synced 2025-05-14 18:26:05 +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
147 lines
3.9 KiB
JavaScript
147 lines
3.9 KiB
JavaScript
/*
|
|
|
|
npm outdated [pkg]
|
|
|
|
Does the following:
|
|
|
|
1. check for a new version of pkg
|
|
|
|
If no packages are specified, then run for all installed
|
|
packages.
|
|
|
|
*/
|
|
|
|
module.exports = outdated
|
|
|
|
outdated.usage = "npm outdated [<pkg> [<pkg> ...]]"
|
|
|
|
outdated.completion = require("./utils/completion/installed-deep.js")
|
|
|
|
|
|
var path = require("path")
|
|
, fs = require("graceful-fs")
|
|
, readJson = require("./utils/read-json.js")
|
|
, cache = require("./cache.js")
|
|
, asyncMap = require("slide").asyncMap
|
|
, npm = require("./npm.js")
|
|
, log = require("./utils/log.js")
|
|
, semver = require("semver")
|
|
, relativize = require("./utils/relativize.js")
|
|
|
|
function outdated (args, silent, cb) {
|
|
if (typeof cb !== "function") cb = silent, silent = false
|
|
var dir = path.resolve(npm.dir, "..")
|
|
outdated_(args, dir, {}, function (er, list) {
|
|
function cb_ (er) { cb(er, list) }
|
|
|
|
if (er || silent) return cb_(er)
|
|
var outList = list.map(makePretty)
|
|
require("./utils/output.js").write(outList.join("\n"), cb_)
|
|
})
|
|
}
|
|
|
|
// [[ dir, dep, has, want ]]
|
|
function makePretty (p) {
|
|
var parseable = npm.config.get("parseable")
|
|
, long = npm.config.get("long")
|
|
, dep = p[1]
|
|
, dir = path.resolve(p[0], "node_modules", dep)
|
|
, has = p[2]
|
|
, want = p[3]
|
|
if (parseable) {
|
|
var str = dir
|
|
if (npm.config.get("long")) {
|
|
str += ":" + dep + "@" + want
|
|
+ ":" + (has ? (dep + "@" + has) : "MISSING")
|
|
}
|
|
return str
|
|
}
|
|
|
|
if (!npm.config.get("global")) {
|
|
dir = relativize(dir, process.cwd()+"/x")
|
|
}
|
|
return dep + "@" + want + " " + dir
|
|
+ " current=" + (has || "MISSING")
|
|
}
|
|
|
|
function outdated_ (args, dir, parentHas, cb) {
|
|
// get the deps from package.json, or {<dir/node_modules/*>:"*"}
|
|
// asyncMap over deps:
|
|
// shouldHave = cache.add(dep, req).version
|
|
// if has === shouldHave then
|
|
// return outdated(args, dir/node_modules/dep, parentHas + has)
|
|
// else if dep in args or args is empty
|
|
// return [dir, dep, has, shouldHave]
|
|
|
|
var deps = null
|
|
readJson(path.resolve(dir, "package.json"), function (er, d) {
|
|
deps = (er) ? true : d.dependencies
|
|
return next()
|
|
})
|
|
|
|
var has = null
|
|
fs.readdir(path.resolve(dir, "node_modules"), function (er, pkgs) {
|
|
if (er) {
|
|
has = Object.create(parentHas)
|
|
return next()
|
|
}
|
|
asyncMap(pkgs, function (pkg, cb) {
|
|
readJson( path.resolve(dir, "node_modules", pkg, "package.json")
|
|
, function (er, d) {
|
|
cb(null, er ? [] : [[d.name, d.version]])
|
|
})
|
|
}, function (er, pvs) {
|
|
if (er) return cb(er)
|
|
has = Object.create(parentHas)
|
|
pvs.forEach(function (pv) {
|
|
has[pv[0]] = pv[1]
|
|
})
|
|
next()
|
|
})
|
|
})
|
|
|
|
function next () {
|
|
if (!has || !deps) return
|
|
if (deps === true) {
|
|
deps = Object.keys(has).reduce(function (l, r) {
|
|
l[r] = "*"
|
|
return l
|
|
}, {})
|
|
}
|
|
// now get what we should have, based on the dep.
|
|
// if has[dep] !== shouldHave[dep], then cb with the data
|
|
// otherwise dive into the folder
|
|
asyncMap(Object.keys(deps), function (dep, cb) {
|
|
shouldUpdate(args, dir, dep, has, deps[dep], cb)
|
|
}, cb)
|
|
}
|
|
}
|
|
|
|
function shouldUpdate (args, dir, dep, has, req, cb) {
|
|
// look up the most recent version.
|
|
// if that's what we already have, or if it's not on the args list,
|
|
// then dive into it. Otherwise, cb() with the data.
|
|
|
|
function skip () {
|
|
outdated_( args
|
|
, path.resolve(dir, "node_modules", dep)
|
|
, has
|
|
, cb )
|
|
}
|
|
|
|
function doIt (shouldHave) {
|
|
cb(null, [[ dir, dep, has[dep], shouldHave ]])
|
|
}
|
|
|
|
if (args.length && args.indexOf(dep) === -1) {
|
|
return skip()
|
|
}
|
|
|
|
// so, we can conceivably update this. find out if we need to.
|
|
cache.add(dep, req, function (er, d) {
|
|
// if this fails, then it means we can't update this thing.
|
|
// it's probably a thing that isn't published.
|
|
return (er || d.version === has[dep]) ? skip() : doIt(d.version)
|
|
})
|
|
}
|