diff options
author | isaacs <i@izs.me> | 2012-06-07 01:48:24 +0400 |
---|---|---|
committer | isaacs <i@izs.me> | 2012-06-07 01:56:35 +0400 |
commit | 2568e40a395b809fb34125b3383f9f2616004f73 (patch) | |
tree | b770c89d4ed5a46341bf3b42e563a7fbf110af32 /lib | |
parent | d4b2d1149a0f2b56467ebeebd36e21d3a2bfe48a (diff) |
Replace the log util with npmlog module
This feels so good. lib/utils/log.js is the worst kind of
glue code that keeps the npm project from being properly
abstracted into independent pieces.
In the process, also cleaned up a lot of unproductive logging,
and made the npm-debug.log generated on errors be a bit more
easy to read.
Diffstat (limited to 'lib')
54 files changed, 487 insertions, 577 deletions
diff --git a/lib/adduser.js b/lib/adduser.js index d65eed595..4aa54cf0e 100644 --- a/lib/adduser.js +++ b/lib/adduser.js @@ -3,7 +3,7 @@ module.exports = adduser var registry = require("./utils/npm-registry-client/index.js") , ini = require("./utils/ini.js") - , log = require("./utils/log.js") + , log = require("npmlog") , npm = require("./npm.js") , read = require("read") , promiseChain = require("./utils/promise-chain.js") @@ -42,7 +42,7 @@ function adduser (args, cb) { ini.set("username", u.u, "user") ini.set("_password", u.p, "user") ini.set("email", u.e, "user") - log("Authorized user " + u.u, "adduser") + log.info("adduser", "Authorized user %s", u.u) ini.save("user", cb) }) }) diff --git a/lib/bugs.js b/lib/bugs.js index 2a9352632..0d5460ac9 100644 --- a/lib/bugs.js +++ b/lib/bugs.js @@ -13,7 +13,7 @@ bugs.completion = function (opts, cb) { var exec = require("./utils/exec.js") , registry = require("./utils/npm-registry-client/index.js") , npm = require("./npm.js") - , log = require("./utils/log.js") + , log = require("npmlog") function bugs (args, cb) { if (!args.length) return cb(bugs.usage) @@ -29,7 +29,7 @@ function bugs (args, cb) { if (repo) { if (Array.isArray(repo)) repo = repo.shift() if (repo.hasOwnProperty("url")) repo = repo.url - log.verbose(repo, "repository") + log.verbose("repository", repo) if (repo && repo.match(/^(https?:\/\/|git(:\/\/|@))github.com/)) { return open(repo.replace(/^git(@|:\/\/)/, "http://") .replace(/^https?:\/\/github.com:/, "github.com/") diff --git a/lib/build.js b/lib/build.js index 864eb27cf..c0dcbf7fb 100644 --- a/lib/build.js +++ b/lib/build.js @@ -9,7 +9,7 @@ // This runs AFTER install or link are completed. var npm = require("./npm.js") - , log = require("./utils/log.js") + , log = require("npmlog") , chain = require("slide").chain , fs = require("graceful-fs") , path = require("path") @@ -44,7 +44,7 @@ function build (args, global, didPre, didRB, cb) { function build_ (global, didPre, didRB) { return function (folder, cb) { folder = path.resolve(folder) build._didBuild[folder] = true - log.info(folder, "build") + log.info("build", folder) readJson(path.resolve(folder, "package.json"), function (er, pkg) { if (er) return cb(er) chain @@ -76,17 +76,17 @@ function linkStuff (pkg, folder, global, didRB, cb) { , top = parent === npm.dir , gtop = parent === gnm - log.verbose([global, gnm, gtop, parent], "linkStuff") - log(pkg._id, "linkStuff") + log.verbose("linkStuff", [global, gnm, gtop, parent]) + log.info("linkStuff", pkg._id) if (top && pkg.preferGlobal && !global) { - log.warn(pkg._id + " should be installed with -g", "prefer global") + log.warn("prefer global", pkg._id + " should be installed with -g") } asyncMap( [linkBins, linkMans, !didRB && rebuildBundles] , function (fn, cb) { if (!fn) return cb() - log.verbose(pkg._id, fn.name) + log.verbose(fn.name, pkg._id) fn(pkg, folder, parent, gtop, cb) }, cb) } @@ -102,7 +102,7 @@ function rebuildBundles (pkg, folder, parent, gtop, cb) { // error means no bundles if (er) return cb() - log.verbose(files, "rebuildBundles") + log.verbose("rebuildBundles", files) // don't asyncMap these, because otherwise build script output // gets interleaved and is impossible to read chain(files.filter(function (file) { @@ -117,7 +117,7 @@ function rebuildBundles (pkg, folder, parent, gtop, cb) { file = path.resolve(folder, "node_modules", file) return function (cb) { if (build._didBuild[file]) return cb() - log.verbose(file, "rebuild bundle") + log.verbose("rebuild bundle", file) // if file is not a package dir, then don't do it. fs.lstat(path.resolve(file, "package.json"), function (er, st) { if (er) return cb() @@ -133,7 +133,7 @@ function linkBins (pkg, folder, parent, gtop, cb) { } var binRoot = gtop ? npm.globalBin : path.resolve(parent, ".bin") - log.verbose([pkg.bin, binRoot, gtop], "bins linking") + log.verbose("link bins", [pkg.bin, binRoot, gtop]) asyncMap(Object.keys(pkg.bin), function (b, cb) { linkBin( path.resolve(folder, pkg.bin[b]) diff --git a/lib/cache.js b/lib/cache.js index 076267e89..69f0c746d 100644 --- a/lib/cache.js +++ b/lib/cache.js @@ -39,7 +39,7 @@ var mkdir = require("mkdirp") , rm = require("rimraf") , readJson = require("./utils/read-json.js") , registry = require("./utils/npm-registry-client/index.js") - , log = require("./utils/log.js") + , log = require("npmlog") , path = require("path") , output , sha = require("./utils/sha.js") @@ -104,7 +104,7 @@ function read (name, ver, forceBypass, cb) { } if (forceBypass && npm.config.get("force")) { - log.verbose(true, "force found, skipping cache") + log.verbose("using force", "skipping cache") return addNamed(name, ver, c) } @@ -171,7 +171,7 @@ exports.add = function (pkg, ver, scrub, cb) { add([pkg, ver], cb) }) } - log.verbose([pkg, ver], "cache add") + log.verbose("cache add", [pkg, ver]) return add([pkg, ver], cb) } @@ -204,14 +204,15 @@ function add (args, cb) { spec = args[0] } - log.silly([name, spec, args], "cache add: name, spec, args") + log.silly("cache add", "name=%j spec=%j args=%j", name, spec, args) + if (!name && !spec) return cb(usage) // see if the spec is a url // otherwise, treat as name@version var p = url.parse(spec) || {} - log.verbose(p, "parsed url") + log.verbose("parsed url", p) // it could be that we got name@http://blah // in that case, we will not have a protocol now, but if we @@ -260,12 +261,15 @@ function addRemoteTarball (u, shasum, name, cb_) { delete inFlightURLs[u] } - log.verbose([u, shasum], "addRemoteTarball") + log.verbose("addRemoteTarball", [u, shasum]) var tmp = path.join(npm.tmp, Date.now()+"-"+Math.random(), "tmp.tgz") mkdir(path.dirname(tmp), function (er) { if (er) return cb(er) fetch(u, tmp, function (er) { - if (er) return log.er(cb, "failed to fetch "+u)(er) + if (er) { + log.error("fetch failed", u) + return cb(er) + } if (!shasum) return done() // validate that the url we just downloaded matches the expected shasum. sha.check(tmp, shasum, done) @@ -309,7 +313,7 @@ function addRemoteGit (u, parsed, name, cb_) { u = u.replace(/^ssh:\/\//, "") } - log.verbose([u, co], "addRemoteGit") + log.verbose("addRemoteGit", [u, co]) var tmp = path.join(npm.tmp, Date.now()+"-"+Math.random()) mkdir(path.dirname(tmp), function (er) { @@ -318,18 +322,18 @@ function addRemoteGit (u, parsed, name, cb_) { , function (er, code, stdout, stderr) { stdout = (stdout + "\n" + stderr).trim() if (er) { - log.error(stdout, "git clone "+u) + log.error("git clone " + u, stdout) return cb(er) } - log.verbose(stdout, "git clone "+u) + log.verbose("git clone "+u, stdout) exec( npm.config.get("git"), ["checkout", co], null, false, tmp , function (er, code, stdout, stderr) { stdout = (stdout + "\n" + stderr).trim() if (er) { - log.error(stdout, "git checkout "+co) + log.error("git checkout " + co, stdout) return cb(er) } - log.verbose(stdout, "git checkout "+co) + log.verbose("git checkout " + co, stdout) addLocalDirectory(tmp, cb) }) }) @@ -341,7 +345,7 @@ function addRemoteGit (u, parsed, name, cb_) { // name@blah thing. var inFlightNames = {} function addNamed (name, x, cb_) { - log.verbose([name, x], "addNamed") + log.verbose("addNamed", [name, x]) var k = name + "@" + x if (!inFlightNames[k]) inFlightNames[k] = [] var iF = inFlightNames[k] @@ -354,7 +358,7 @@ function addNamed (name, x, cb_) { delete inFlightNames[k] } - log.verbose([semver.valid(x), semver.validRange(x)], "addNamed") + log.verbose("addNamed", [semver.valid(x), semver.validRange(x)]) return ( null !== semver.valid(x) ? addNameVersion : null !== semver.validRange(x) ? addNameRange : addNameTag @@ -362,7 +366,7 @@ function addNamed (name, x, cb_) { } function addNameTag (name, tag, cb) { - log([name, tag], "addNameTag") + log.info("addNameTag", [name, tag]) var explicit = true if (!tag) { explicit = false @@ -407,7 +411,7 @@ function addNameRange (name, range, data, cb) { if (range === null) return cb(new Error( "Invalid version range: "+range)) - log.silly([name, range, !!data], "name, range, hasData") + log.silly("addNameRange", {name:name, range:range, hasData:!!data}) if (data) return next() registry.get(name, function (er, d, json, response) { @@ -417,7 +421,8 @@ function addNameRange (name, range, data, cb) { }) function next () { - log.silly([name, range, !!data], "name, range, hasData 2") + log.silly( "addNameRange", "number 2" + , {name:name, range:range, hasData:!!data}) engineFilter(data) if (npm.config.get("registry")) return next_() @@ -433,7 +438,9 @@ function addNameRange (name, range, data, cb) { } function next_ () { - log.silly([data.name, Object.keys(data.versions)], "versions") + log.silly("addNameRange", "versions" + , [data.name, Object.keys(data.versions)]) + // if the tagged version satisfies, then use that. var tagged = data["dist-tags"][npm.config.get("tag")] if (tagged && data.versions[tagged] && semver.satisfies(tagged, range)) { @@ -454,9 +461,12 @@ function addNameRange (name, range, data, cb) { // filter the versions down based on what's already in cache. function cachedFilter (data, range, cb) { - log.silly(data.name, "cachedFilter") + log.silly("cachedFilter", data.name) ls_(data.name, 1, function (er, files) { - if (er) return log.er(cb, "Not in cache, can't fetch: "+data.name)(er) + if (er) { + log.error("cachedFilter", "Not in cache, can't fetch", data.name) + return cb(er) + } files = files.map(function (f) { return path.basename(f.replace(/(\\|\/)$/, "")) }).filter(function (f) { @@ -467,16 +477,17 @@ function cachedFilter (data, range, cb) { return cb(new Error("Not in cache, can't fetch: "+data.name+"@"+range)) } - log.silly([data.name, files], "cached") + log.silly("cached", [data.name, files]) Object.keys(data.versions).forEach(function (v) { if (files.indexOf(v) === -1) delete data.versions[v] }) if (Object.keys(data.versions).length === 0) { - return log.er(cb, "Not in cache, can't fetch: "+data.name)(er) + log.error("cachedFilter", "Not in cache, can't fetch", data.name) + return cb(new Error("Not in cache, can't fetch: "+data.name+"@"+range)) } - log.silly([data.name, Object.keys(data.versions)], "filtered") + log.silly("filtered", [data.name, Object.keys(data.versions)]) cb(null, data) }) } @@ -524,10 +535,10 @@ function addNameVersion (name, ver, data, cb) { var bd = npm.config.get("bindist") , b = dist.bin && bd && dist.bin[bd] - log.verbose([bd, dist], "bin dist") + log.verbose("bin dist", [bd, dist]) if (b && b.tarball && b.shasum) { - log.info(data._id, "prebuilt") - log.verbose(b, "prebuilt "+data._id) + log.info("prebuilt", data._id) + log.verbose("prebuilt", data._id, b) dist = b } @@ -579,7 +590,8 @@ function addLocal (p, name, cb_) { && (process.platform !== "win32" || p.indexOf("\\") === -1)) { return addNamed(p, "", cb_) } - return log.er(cb_, "Could not install: "+p)(er) + log.error("addLocal", "Could not install %s", p) + return cb_(er) } return cb_(er, data) } @@ -620,7 +632,7 @@ function addLocalTarball (p, name, cb) { to.on("error", errHandler) to.on("close", function () { if (errState) return - log.verbose(npm.modes.file.toString(8), "chmod "+tmp) + log.verbose("chmod", tmp, npm.modes.file.toString(8)) fs.chmod(tmp, npm.modes.file, function (er) { if (er) return cb(er) addTmpTarball(tmp, name, cb) @@ -637,7 +649,8 @@ function getCacheStat (cb) { fs.stat(npm.cache, function (er, st) { if (er) return makeCacheDir(cb) if (!st.isDirectory()) { - return log.er(cb, "invalid cache directory: "+npm.cache)(er) + log.error("getCacheStat", "invalid cache dir %j", npm.cache) + return cb(er) } return cb(null, cacheStat = st) }) @@ -659,9 +672,12 @@ function makeCacheDir (cb) { } fs.stat(process.env.HOME, function (er, st) { - if (er) return log.er(cb, "homeless?")(er) + if (er) { + log.error("makeCacheDir", "homeless?") + return cb(er) + } cacheStat = st - log.silly([st.uid, st.gid], "uid, gid for cache dir") + log.silly("makeCacheDir", "cache dir uid, gid", [st.uid, st.gid]) return mkdir(npm.cache, afterMkdir) }) @@ -698,33 +714,46 @@ function addPlacedTarball_ (p, name, uid, gid, cb) { , folder = path.join(target, "package") rm(folder, function (er) { - if (er) return log.er(cb, "Could not remove "+folder)(er) + if (er) { + log.error("addPlacedTarball", "Could not remove %j", folder) + return cb(er) + } tar.unpack(p, folder, null, null, uid, gid, function (er) { - if (er) return log.er(cb, "Could not unpack "+p+" to "+target)(er) + if (er) { + log.error("addPlacedTarball", "Could not unpack %j to %j", p, target) + return cb(er) + } // calculate the sha of the file that we just unpacked. // this is so that the data is available when publishing. sha.get(p, function (er, shasum) { - if (er) return log.er(cb, "couldn't validate shasum of "+p)(er) + if (er) { + log.error("addPlacedTarball", "shasum fail", p) + return cb(er) + } readJson(path.join(folder, "package.json"), function (er, data) { - if (er) return log.er(cb, "couldn't read json in "+folder)(er) + if (er) { + log.error("addPlacedTarball", "Couldn't read json in %j" + , folder) + return cb(er) + } data.dist = data.dist || {} if (shasum) data.dist.shasum = shasum deprCheck(data) asyncMap([p], function (f, cb) { - log.verbose(npm.modes.file.toString(8), "chmod "+f) + log.verbose("chmod", f, npm.modes.file.toString(8)) fs.chmod(f, npm.modes.file, cb) }, function (f, cb) { if (process.platform === "win32") { - log.silly(f, "skipping chown for windows") + log.silly("chown", "skipping for windows", f) cb() } else if (typeof uid === "number" && typeof gid === "number" && parseInt(uid, 10) === uid && parseInt(gid, 10) === gid) { - log.verbose([f, uid, gid], "chown") + log.verbose("chown", f, [uid, gid]) fs.chown(f, uid, gid, cb) } else { - log.verbose([f, uid, gid], "not chowning, invalid uid/gid") + log.verbose("chown", "skip for invalid uid/gid", [f, uid, gid]) cb() } }, function (er) { @@ -758,9 +787,15 @@ function addLocalDirectory (p, name, cb) { mkdir(path.dirname(tgz), function (er, made) { if (er) return cb(er) tar.pack(tgz, p, data, doFancyCrap, function (er) { - if (er) return log.er(cb,"couldn't pack "+p+ " to "+tgz)(er) + if (er) { + log.error( "addLocalDirectory", "Could not pack %j to %j" + , p, tgz ) + return cb(er) + } - if (er || !cs || isNaN(cs.uid) || isNaN(cs.gid)) return cb() + // if we don't get a cache stat, or if the gid/uid is not + // a number, then just move on. chown would fail anyway. + if (!cs || isNaN(cs.uid) || isNaN(cs.gid)) return cb() chownr(made || tgz, cs.uid, cs.gid, function (er) { if (er) return cb(er) @@ -797,7 +832,7 @@ function unpack (pkg, ver, unpackTarget, dMode, fMode, uid, gid, cb) { read(pkg, ver, false, function (er, data) { if (er) { - log.error("Could not read data for "+pkg+"@"+ver) + log.error("unpack", "Could not read data for %s", pkg + "@" + ver) return cb(er) } npm.commands.unbuild([unpackTarget], function (er) { @@ -819,6 +854,6 @@ function deprCheck (data) { else return if (!deprWarned[data._id]) { deprWarned[data._id] = true - log.warn(data._id+": "+data.deprecated, "deprecated") + log.warn("deprecated", "%s: %s", data._id, data.deprecated) } } diff --git a/lib/config.js b/lib/config.js index a69c30ea6..44f3d36f4 100644 --- a/lib/config.js +++ b/lib/config.js @@ -10,7 +10,7 @@ config.usage = "npm config set <key> <value>" + "\nnpm get [<key>]" var ini = require("./utils/ini.js") - , log = require("./utils/log.js") + , log = require("npmlog") , npm = require("./npm.js") , exec = require("./utils/exec.js") , fs = require("graceful-fs") @@ -129,7 +129,7 @@ function set (key, val, cb) { } key = key.trim() val = val.trim() - log("set "+key+" "+val, "config") + log.info("config", "set %j %j", key, val) var where = ini.get("global") ? "global" : "user" ini.set(key, val, where) ini.save(where, cb) diff --git a/lib/deprecate.js b/lib/deprecate.js index 6f18879e4..2fd18cf9f 100644 --- a/lib/deprecate.js +++ b/lib/deprecate.js @@ -20,7 +20,6 @@ deprecate.completion = function (opts, cb) { var registry = require("./utils/npm-registry-client/index.js") , semver = require("semver") - , log = require("./utils/log.js") , npm = require("./npm.js") function deprecate (args, cb) { diff --git a/lib/docs.js b/lib/docs.js index 20b110406..275fce7e9 100644 --- a/lib/docs.js +++ b/lib/docs.js @@ -13,7 +13,7 @@ docs.completion = function (opts, cb) { var exec = require("./utils/exec.js") , registry = require("./utils/npm-registry-client/index.js") , npm = require("./npm.js") - , log = require("./utils/log.js") + , log = require("npmlog") function docs (args, cb) { if (!args.length) return cb(docs.usage) @@ -26,7 +26,7 @@ function docs (args, cb) { if (repo) { if (Array.isArray(repo)) repo = repo.shift() if (repo.hasOwnProperty("url")) repo = repo.url - log.verbose(repo, "repository") + log.verbose("repository", repo) if (repo) { return open(repo.replace(/^git(@|:\/\/)/, 'http://') .replace(/\.git$/, '')+"#readme", cb) diff --git a/lib/edit.js b/lib/edit.js index df103d4df..0ffe723bc 100644 --- a/lib/edit.js +++ b/lib/edit.js @@ -10,7 +10,6 @@ var npm = require("./npm.js") , exec = require("./utils/exec.js") , path = require("path") , fs = require("graceful-fs") - , log = require("./utils/log.js") function edit (args, cb) { var p = args[0] diff --git a/lib/help-search.js b/lib/help-search.js index a4ef667c0..6f1f117cb 100644 --- a/lib/help-search.js +++ b/lib/help-search.js @@ -7,7 +7,7 @@ var fs = require("graceful-fs") , asyncMap = require("slide").asyncMap , cliDocsPath = path.join(__dirname, "..", "doc", "cli") , apiDocsPath = path.join(__dirname, "..", "doc", "api") - , log = require("./utils/log.js") + , log = require("npmlog") , npm = require("./npm.js") helpSearch.usage = "npm help-search <text>" @@ -26,7 +26,10 @@ function helpSearch (args, silent, cb) { } fs.readdir(docsPath, function(er, files) { - if (er) return log.er(cb, "Could not load documentation")(er) + if (er) { + log.error("helpSearch", "Could not load documentation") + return cb(er) + } var search = args.join(" ") , results = [] diff --git a/lib/help.js b/lib/help.js index 442f839b3..998d90471 100644 --- a/lib/help.js +++ b/lib/help.js @@ -13,7 +13,7 @@ var fs = require("graceful-fs") , exec = require("./utils/exec.js") , npm = require("./npm.js") , output = require("./utils/output.js") - , log = require("./utils/log.js") + , log = require("npmlog") function help (args, cb) { var num = 1 @@ -34,6 +34,7 @@ function help (args, cb) { && npm.commands[section].usage ) { npm.config.set("loglevel", "silent") + log.level = "silent" return output.write(npm.commands[section].usage, cb) } @@ -83,6 +84,7 @@ function help (args, cb) { } else getSections(function (er, sections) { if (er) return cb(er) npm.config.set("loglevel", "silent") + log.level = "silent" output.write ( ["\nUsage: npm <command>" , "" diff --git a/lib/init.js b/lib/init.js index 7cd7da8e2..0d96e07ac 100644 --- a/lib/init.js +++ b/lib/init.js @@ -10,7 +10,7 @@ var read = require("read") , promiseChain = require("./utils/promise-chain.js") , exec = require("./utils/exec.js") , semver = require("semver") - , log = require("./utils/log.js") + , log = require("npmlog") , npm = require("./npm.js") , output = require("./utils/output.js") @@ -18,8 +18,7 @@ init.usage = "npm init [folder]" function init (args, cb) { var folder = args[0] || "." - , ll = npm.config.get("loglevel") - npm.config.set("loglevel", "paused") + log.pause() if (folder.charAt(0) !== "/") folder = path.join(process.cwd(), folder) readJson(path.join(folder, "package.json"), function (er, data) { @@ -31,8 +30,8 @@ function init (args, cb) { , url: npm.config.get("init.author.url") } init_(data, folder, function (er) { - npm.config.set("loglevel", ll) - if (!er) log(path.resolve(folder, "package.json"), "written") + log.resume() + if (!er) log.info("written", path.resolve(folder, "package.json")) cb(er) }) }) diff --git a/lib/install.js b/lib/install.js index 276f3d8b3..ed5c4ce2b 100644 --- a/lib/install.js +++ b/lib/install.js @@ -58,7 +58,7 @@ install.completion = function (opts, cb) { var npm = require("./npm.js") , semver = require("semver") , readJson = require("./utils/read-json.js") - , log = require("./utils/log.js") + , log = require("npmlog") , path = require("path") , fs = require("graceful-fs") , cache = require("./cache.js") @@ -98,7 +98,7 @@ function install (args, cb_) { where = args args = [].concat(cb_) // pass in [] to do default dep-install cb_ = arguments[2] - log.verbose([where, args], "install(where, what)") + log.verbose("install", "where,what", [where, args]) } if (!npm.config.get("global")) { @@ -117,9 +117,12 @@ function install (args, cb_) { , where , { dev: !npm.config.get("production") } , function (er, data) { - if (er) return log.er(cb, "Couldn't read dependencies.")(er) + if (er) { + log.error("install", "Couldn't read dependencies") + return cb(er) + } var deps = Object.keys(data.dependencies || {}) - log.verbose([where, deps], "where, deps") + log.verbose("install", "where, deps", [where, deps]) var context = { family: {} , ancestors: {} , explicit: false @@ -176,18 +179,18 @@ function readDependencies (context, where, opts, cb) { if (er) return cb(er) if (wrap) { - log.verbose([where, wrap], "readDependencies: using existing wrap") + log.verbose("readDependencies: using existing wrap", [where, wrap]) var rv = {} Object.keys(data).forEach(function (key) { rv[key] = data[key] }) rv.dependencies = {} Object.keys(wrap).forEach(function (key) { - log.verbose([key, wrap[key]], "from wrap") + log.verbose("from wrap", [key, wrap[key]]) var w = wrap[key] rv.dependencies[key] = w.from || w.version }) - log.verbose([rv.dependencies], "readDependencies: returned deps") + log.verbose("readDependencies returned deps", rv.dependencies) return cb(null, rv, wrap) } @@ -195,7 +198,7 @@ function readDependencies (context, where, opts, cb) { fs.readFile(wrapfile, "utf8", function (er, wrapjson) { if (er) { - log.verbose("readDependencies: using package.json deps") + log.verbose("readDependencies", "using package.json deps") return cb(null, data, null) } @@ -205,7 +208,7 @@ function readDependencies (context, where, opts, cb) { return cb(ex) } - log.info(wrapfile, "using shrinkwrap file") + log.info("shrinkwrap", "file %j", wrapfile) var rv = {} Object.keys(data).forEach(function (key) { rv[key] = data[key] @@ -215,7 +218,7 @@ function readDependencies (context, where, opts, cb) { var w = newwrap.dependencies[key] rv.dependencies[key] = w.from || w.version }) - log.verbose([rv.dependencies], "readDependencies: returned deps") + log.verbose("readDependencies returned deps", rv.dependencies) return cb(null, rv, newwrap.dependencies) }) }) @@ -358,10 +361,10 @@ function treeify (installed) { return l }, {}) - //log.warn(whatWhere, "whatWhere") + //log.warn("install", whatWhere, "whatWhere") return Object.keys(whatWhere).reduce(function (l, r) { var ww = whatWhere[r] - //log.warn([r, ww], "r, ww") + //log.warn("r, ww", [r, ww]) if (!ww.parent) { l[r] = ww } else { @@ -464,12 +467,12 @@ function installMany (what, where, context, cb) { targets.forEach(function (t) { newPrev[t.name] = t.version }) - log.silly(targets, "resolved") + log.silly("resolved", targets) targets.filter(function (t) { return t }).forEach(function (t) { - log.info(t._id, "into "+where) + log.info("install", "%s into %s", t._id, where) }) asyncMap(targets, function (target, cb) { - log.info(target._id, "installOne") + log.info("installOne", target._id) var newWrap = wrap ? wrap[target.name].dependencies || {} : null var newContext = { family: newPrev , ancestors: newAnc @@ -521,7 +524,7 @@ function targetResolver (where, context, deps) { // now we know what's been installed here manually, // or tampered with in some way that npm doesn't want to overwrite. if (alreadyInstalledManually.indexOf(what.split("@").shift()) !== -1) { - log.verbose("skipping "+what, "already installed in "+where) + log.verbose("already installed", "skipping %s %s", what, where) return cb(null, []) } @@ -529,7 +532,7 @@ function targetResolver (where, context, deps) { // If installing from a shrinkwrap, it must match exactly. if (context.family[what]) { if (wrap && wrap[what].version === context.family[what]) { - log.verbose(what, "using existing (matches shrinkwrap)") + log.verbose("shrinkwrap", "use existing", what) return cb(null, []) } } @@ -538,8 +541,8 @@ function targetResolver (where, context, deps) { // doing `npm install foo` inside of the foo project. Print // a warning, and skip it. if (parent && parent.name === what && !npm.config.get("force")) { - log.warn("Refusing to install "+what+" as a dependency of itself" - ,"install") + log.warn("install", "Refusing to install %s as a dependency of itself" + , what) return cb(null, []) } @@ -547,10 +550,10 @@ function targetResolver (where, context, deps) { name = what.split(/@/).shift() if (wrap[name]) { var wrapTarget = wrap[name].from || wrap[name].version - log.verbose("resolving "+what+" to "+wrapTarget, "shrinkwrap") + log.verbose("shrinkwrap", "resolving %s to %s", wrapTarget, what) what = name + "@" + wrapTarget } else { - log.verbose("skipping "+what+" (not in shrinkwrap)", "shrinkwrap") + log.verbose("shrinkwrap", "skipping %s (not in shrinkwrap)", what) } } else if (deps[what]) { what = what + "@" + deps[what] @@ -559,8 +562,8 @@ function targetResolver (where, context, deps) { cache.add(what, function (er, data) { if (er && parent && parent.optionalDependencies && parent.optionalDependencies.hasOwnProperty(what.split("@")[0])) { - log.warn(what, "optional dependency failed, continuing") - log.verbose([what, er], "optional dependency failed, continuing") + log.warn("optional dep failed, continuing", what) + log.verbose("optional dep failed, continuing", [what, er]) return cb(null, []) } @@ -569,7 +572,7 @@ function targetResolver (where, context, deps) { !context.explicit && context.family[data.name] === data.version && !npm.config.get("force")) { - log.info(data.name + "@" + data.version, "already installed") + log.info("already installed", data.name + "@" + data.version) return cb(null, []) } @@ -594,8 +597,8 @@ function installOne (target, where, context, cb) { // check if this one is optional to its parent. if (er && context.parent && context.parent.optionalDependencies && context.parent.optionalDependencies.hasOwnProperty(target.name)) { - log.warn(target._id, "optional dependency failed, continuing") - log.verbose([target._id, er], "optional dependency failed, continuing") + log.warn("optional dep failed, continuing", target._id) + log.verbose("optional dep failed, continuing", [target._id, er]) er = null } @@ -605,7 +608,7 @@ function installOne (target, where, context, cb) { } function localLink (target, where, context, cb) { - log.verbose(target._id, "try to link") + log.verbose("localLink", target._id) var jsonFile = path.resolve( npm.globalDir, target.name , "package.json" ) , parent = context.parent @@ -623,13 +626,13 @@ function localLink (target, where, context, cb) { function thenLink () { npm.commands.link([target.name], function (er, d) { - log.silly([er, d], "back from link") + log.silly("localLink", "back from link", [er, d]) cb(er, [resultList(target, where, parent && parent._id)]) }) } } else { - log.verbose(target._id, "install locally (no link)") + log.verbose("localLink", "install locally (no link)", target._id) installOne_(target, where, context, cb) } }) @@ -785,7 +788,7 @@ function checkCycle (target, ancestors, cb) { tree.push(JSON.parse(JSON.stringify(t))) t = Object.getPrototypeOf(t) } - log.verbose(tree, "unresolvable dependency tree") + log.verbose("unresolvable dependency tree", tree) er.pkgid = target._id er.errno = npm.ECYCLE return cb(er) @@ -824,7 +827,7 @@ function write (target, targetFolder, context, cb_) { if (false === npm.config.get("rollback")) return cb_(er) npm.commands.unbuild([targetFolder], function (er2) { - if (er2) log.error(er2, "error rolling back "+target._id) + if (er2) log.error("error rolling back", target._id, er2) return cb_(er, data) }) } @@ -883,7 +886,7 @@ function write (target, targetFolder, context, cb_) { t = d + "@" + t return t }), targetFolder, newcontext, function (er, d) { - log.verbose(targetFolder, "about to build") + log.verbose("about to build", targetFolder) if (er) return cb(er) npm.commands.build( [targetFolder] , npm.config.get("global") diff --git a/lib/link.js b/lib/link.js index 3049884ca..c7bf6eafe 100644 --- a/lib/link.js +++ b/lib/link.js @@ -5,7 +5,7 @@ var npm = require("./npm.js") , symlink = require("./utils/link.js") , fs = require("graceful-fs") - , log = require("./utils/log.js") + , log = require("npmlog") , asyncMap = require("slide").asyncMap , chain = require("slide").chain , path = require("path") @@ -85,7 +85,7 @@ function linkInstall (pkgs, cb) { next() } else { return fs.realpath(pp, function (er, real) { - if (er) log.warn(pkg, "invalid symbolic link") + if (er) log.warn("invalid symbolic link", pkg) else rp = real next() }) @@ -95,7 +95,10 @@ function linkInstall (pkgs, cb) { function next () { chain ( [ [npm.commands, "unbuild", [target]] - , [log.verbose, "symlinking " + pp + " to "+target, "link"] + , [function (cb) { + log.verbose("link", "symlinking %s to %s", pp, target) + cb() + }] , [symlink, pp, target] // do run lifecycle scripts - full build here. , rp && [build, [target]] @@ -120,7 +123,7 @@ function linkPkg (folder, cb_) { if (er) return cb(er) symlink(me, target, function (er) { if (er) return cb(er) - log.verbose(target, "link: build target") + log.verbose("link", "build target", target) // also install missing dependencies. npm.commands.install(me, [], function (er, installed) { if (er) return cb(er) @@ -10,7 +10,7 @@ module.exports = exports = ls var npm = require("./npm.js") , readInstalled = require("./utils/read-installed.js") , output = require("./utils/output.js") - , log = require("./utils/log.js") + , log = require("npmlog") , relativize = require("./utils/relativize.js") , path = require("path") , archy = require("archy") @@ -21,6 +21,8 @@ function ls (args, silent, cb) { if (typeof cb !== "function") cb = silent, silent = false if (args.length) { + // TODO: it would actually be nice to maybe show the locally + // installed packages only matching the argument names. log.warn("ls doesn't take positional args. Try the 'search' command") } @@ -167,7 +169,7 @@ function makeArchy_ (data, long, dir, depth, parent, d) { if (depth < npm.config.get("depth")) { // just missing var p = parent.link || parent.path - log.warn("Unmet dependency in "+p, d+" "+data) + log.warn("unmet dependency", "%s in %s", d+" "+data, p) data = "\033[31;40mUNMET DEPENDENCY\033[0m " + d + " " + data } else { data = d+"@'"+ data +"' (max depth reached)" @@ -244,7 +246,7 @@ function makeParseable_ (data, long, dir, depth, parent, d) { if (typeof data === "string") { if (data.depth < npm.config.get("depth")) { var p = parent.link || parent.path - log.warn("Unmet dependency in "+p, d+" "+data) + log.warn("unmet dependency", "%s in %s", d+" "+data, p) data = npm.config.get("long") ? path.resolve(parent.path, "node_modules", d) + ":"+d+"@"+JSON.stringify(data)+":INVALID:MISSING" diff --git a/lib/npm.js b/lib/npm.js index 2db21e34d..1a7ae4b42 100644 --- a/lib/npm.js +++ b/lib/npm.js @@ -18,7 +18,7 @@ var EventEmitter = require("events").EventEmitter , npm = module.exports = new EventEmitter , config = require("./config.js") , ini = require("./utils/ini.js") - , log = require("./utils/log.js") + , log = require("npmlog") , fs = require("graceful-fs") , path = require("path") , abbrev = require("abbrev") @@ -64,17 +64,17 @@ try { npm.version = j.version npm.nodeVersionRequired = j.engines.node if (!semver.satisfies(process.version, j.engines.node)) { - log.error(["" + log.error("unsupported version", ["" ,"npm requires node version: "+j.engines.node ,"And you have: "+process.version ,"which is not satisfactory." ,"" ,"Bad things will likely happen. You have been warned." - ,""].join("\n"), "unsupported version") + ,""].join("\n")) } } catch (ex) { try { - log(ex, "error reading version") + log.info("error reading version", ex) } catch (er) {} npm.version = ex } @@ -250,7 +250,7 @@ npm.load = function (conf, cb_) { } } - log.waitForConfig() + log.pause() load(npm, conf, cb) } @@ -268,6 +268,14 @@ function load (npm, conf, cb) { //console.error("about to look up configs") ini.resolveConfigs(conf, function (er) { + log.level = npm.config.get("loglevel") + log.heading = "npm" + switch (npm.config.get("color")) { + case "always": log.enableColor(); break + case false: log.disableColor(); break + } + log.resume() + //console.error("back from config lookup", er && er.stack) if (er) return cb(er) @@ -352,7 +360,7 @@ function setUser (cl, dc, cb) { var prefix = path.resolve(cl.get("prefix")) mkdir(prefix, function (er) { if (er) { - log.error(prefix, "could not create prefix directory") + log.error("could not create prefix dir", prefix) return cb(er) } fs.stat(prefix, function (er, st) { diff --git a/lib/outdated.js b/lib/outdated.js index e883abd35..d87dc9ab6 100644 --- a/lib/outdated.js +++ b/lib/outdated.js @@ -24,7 +24,6 @@ var path = require("path") , 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") diff --git a/lib/owner.js b/lib/owner.js index 5f13d926f..ebad9ed10 100644 --- a/lib/owner.js +++ b/lib/owner.js @@ -67,7 +67,7 @@ owner.completion = function (opts, cb) { var registry = require("./utils/npm-registry-client/index.js") , get = registry.request.GET , put = registry.request.PUT - , log = require("./utils/log.js") + , log = require("npmlog") , output , npm = require("./npm.js") @@ -85,7 +85,10 @@ function ls (pkg, cb) { if (!pkg) return cb(owner.usage) get(pkg, function (er, data) { var msg = "" - if (er) return log.er(cb, "Couldn't get owner data for "+pkg)(er) + if (er) { + log.error("owner ls", "Couldn't get owner data", pkg) + return cb(er) + } var owners = data.maintainers if (!owners || !owners.length) msg = "admin party!" else msg = owners.map(function (o) { return o.name +" <"+o.email+">" }).join("\n") @@ -101,15 +104,14 @@ function add (user, pkg, cb) { add(user, pkg, cb) }) - log.verbose(user+" to "+pkg, "owner add") + log.verbose("owner add", "%s to %s", user, pkg) mutate(pkg, user, function (u, owners) { if (!owners) owners = [] for (var i = 0, l = owners.length; i < l; i ++) { var o = owners[i] if (o.name === u.name) { - log( "Already a package owner: "+o.name+" <"+o.email+">" - , "owner add" - ) + log.info( "owner add" + , "Already a package owner: "+o.name+" <"+o.email+">") return false } } @@ -125,7 +127,7 @@ function rm (user, pkg, cb) { rm(user, pkg, cb) }) - log.verbose(user+" from "+pkg, "owner rm") + log.verbose("owner rm", "%s from %s", user, pkg) mutate(pkg, null, function (u, owners) { var found = false , m = owners.filter(function (o) { @@ -134,7 +136,7 @@ function rm (user, pkg, cb) { return !match }) if (!found) { - log("Not a package owner: "+user, "owner rm") + log.info("owner rm", "Not a package owner: "+user) return false } if (!m.length) return new Error( @@ -151,12 +153,20 @@ function mutate (pkg, user, mutation, cb) { } function mutate_ (er, u) { - if (er) return log.er(cb, "Error getting user data for "+user)(er) - if (user && (!u || u.error)) return cb(new Error( - "Couldn't get user data for "+user+": "+JSON.stringify(u))) + if (!er && user && (!u || u.error)) er = new Error( + "Couldn't get user data for "+user+": "+JSON.stringify(u)) + + if (er) { + log.error("owner mutate", "Error getting user data for %s", user) + return cb(er) + } + if (u) u = { "name" : u.name, "email" : u.email } get("/"+pkg, function (er, data) { - if (er) return log.er(cb, "Couldn't get package data for "+pkg)(er) + if (er) { + log.error("owner mutate", "Error getting package data for %s", pkg) + return cb(er) + } var m = mutation(u, data.maintainers) if (!m) return cb() // handled if (m instanceof Error) return cb(m) // error @@ -165,10 +175,12 @@ function mutate (pkg, user, mutation, cb) { , maintainers : m } put("/"+pkg+"/-rev/"+data._rev, data, function (er, data) { - if (er) return log.er(cb, "Failed to update package metadata")(er) - if (data.error) return cb(new Error( - "Failed to update package metadata: "+JSON.stringify(data))) - cb(null, data) + if (!er && data.error) er = new Error( + "Failed to update package metadata: "+JSON.stringify(data)) + if (er) { + log.error("owner mutate", "Failed to update package metadata") + } + cb(er, data) }) }) } diff --git a/lib/publish.js b/lib/publish.js index 1cf59f01a..eed04cf2f 100644 --- a/lib/publish.js +++ b/lib/publish.js @@ -3,7 +3,7 @@ module.exports = publish var npm = require("./npm.js") , registry = require("./utils/npm-registry-client/index.js") - , log = require("./utils/log.js") + , log = require("npmlog") , tar = require("./utils/tar.js") , sha = require("./utils/sha.js") , path = require("path") @@ -29,7 +29,7 @@ function publish (args, isRetry, cb) { if (args.length === 0) args = ["."] if (args.length !== 1) return cb(publish.usage) - log.verbose(args, "publish") + log.verbose("publish", args) var arg = args[0] // if it's a local folder, then run the prepublish there, first. readJson(path.resolve(arg, "package.json"), function (er, data) { @@ -46,7 +46,7 @@ function publish (args, isRetry, cb) { function cacheAddPublish (arg, didPre, isRetry, cb) { npm.commands.cache.add(arg, function (er, data) { if (er) return cb(er) - log.silly(data, "publish") + log.silly("publish", data) var cachedir = path.resolve( npm.cache , data.name , data.version @@ -66,7 +66,7 @@ function publish_ (arg, data, isRetry, cachedir, cb) { // check for publishConfig hash if (data.publishConfig) { Object.keys(data.publishConfig).forEach(function (k) { - log.info(k + "=" + data.publishConfig[k], "publishConfig") + log.info("publishConfig", k + "=" + data.publishConfig[k]) npm.config.set(k, data.publishConfig[k]) }) } @@ -101,13 +101,13 @@ function preBuild (data, bd, cb) { , tb = path.resolve(cf, "package-"+bd+".tgz") , sourceBall = path.resolve(cf, "package.tgz") - log.verbose("about to cache unpack") - log.verbose(sourceBall, "the tarball") + log.verbose("preBuild", "about to cache unpack") + log.verbose("preBuild", "tarball = %s", sourceBall) npm.commands.install(pb, sourceBall, function (er) { - log.info(data._id, "prebuild done") + log.info("preBuild", "done", data._id) // build failure just means that we can't prebuild if (er) { - log.warn(er.message, "prebuild failed "+bd) + log.warn("preBuild", "failed (continuing without prebuild)", bd, er) return cb() } // now strip the preinstall/install scripts @@ -154,7 +154,7 @@ function regPublish (data, prebuilt, isRetry, arg, cachedir, cb) { registry.publish(data, prebuilt, readme, function (er) { if (er && er.errno === npm.EPUBLISHCONFLICT && npm.config.get("force") && !isRetry) { - log.warn("Forced publish over "+data._id, "publish") + log.warn("publish", "Forced publish over "+data._id) return npm.commands.unpublish([data._id], function (er) { // ignore errors. Use the force. Reach out with your feelings. publish([arg], true, cb) diff --git a/lib/rebuild.js b/lib/rebuild.js index 0e1d56a1d..a4a39f7b9 100644 --- a/lib/rebuild.js +++ b/lib/rebuild.js @@ -3,7 +3,7 @@ module.exports = rebuild var readInstalled = require("./utils/read-installed.js") , semver = require("semver") - , log = require("./utils/log.js") + , log = require("npmlog") , path = require("path") , npm = require("./npm.js") , output = require("./utils/output.js") @@ -17,14 +17,14 @@ rebuild.completion = require("./utils/completion/installed-deep.js") function rebuild (args, cb) { readInstalled(npm.prefix, function (er, data) { - log(typeof data, "read Installed") + log.info("readInstalled", typeof data) if (er) return cb(er) var set = filter(data, args) , folders = Object.keys(set).filter(function (f) { return f !== npm.prefix }) if (!folders.length) return cb() - log.silly(folders, "rebuild set") + log.silly("rebuild set", folders) cleanBuild(folders, set, cb) }) } @@ -79,7 +79,7 @@ function filter (data, args, set, seen) { } } if (pass && data._id) { - log.verbose([data.path, data._id], "path id") + log.verbose("rebuild", "path, id", [data.path, data._id]) set[data.path] = data._id } // need to also dive through kids, always. diff --git a/lib/root.js b/lib/root.js index 6062ec220..59ccc0b08 100644 --- a/lib/root.js +++ b/lib/root.js @@ -2,7 +2,6 @@ module.exports = root var npm = require("./npm.js") , output = require("./utils/output.js") - , log = require("./utils/log.js") root.usage = "npm root\nnpm root -g\n(just prints the root folder)" diff --git a/lib/run-script.js b/lib/run-script.js index 4a4d2dc61..17b48abf8 100644 --- a/lib/run-script.js +++ b/lib/run-script.js @@ -5,7 +5,7 @@ var lifecycle = require("./utils/lifecycle.js") , npm = require("./npm.js") , path = require("path") , readJson = require("./utils/read-json.js") - , log = require("./utils/log.js") + , log = require("npmlog") , chain = require("slide").chain , fs = require("graceful-fs") , asyncMap = require("slide").asyncMap @@ -92,7 +92,7 @@ function run (pkg, wd, cmd, cb) { if (!cmd.match(/^(pre|post)/)) { cmds = ["pre"+cmd].concat(cmds).concat("post"+cmd) } - log.verbose(cmds, "run-script") + log.verbose("run-script", cmds) chain(cmds.map(function (c) { // when running scripts explicitly, assume that they're trusted. return [lifecycle, pkg, c, wd, true] diff --git a/lib/search.js b/lib/search.js index 213390eb0..ba27bdb52 100644 --- a/lib/search.js +++ b/lib/search.js @@ -5,7 +5,6 @@ var npm = require("./npm.js") , registry = require("./utils/npm-registry-client/index.js") , semver = require("semver") , output - , log = require("./utils/log.js") search.usage = "npm search [some search terms ...]" diff --git a/lib/shrinkwrap.js b/lib/shrinkwrap.js index 59942d586..cdad89abc 100644 --- a/lib/shrinkwrap.js +++ b/lib/shrinkwrap.js @@ -5,7 +5,7 @@ module.exports = exports = shrinkwrap var npm = require("./npm.js") , output = require("./utils/output.js") - , log = require("./utils/log.js") + , log = require("npmlog") , fs = require("fs") , path = require("path") @@ -15,7 +15,7 @@ function shrinkwrap (args, silent, cb) { if (typeof cb !== "function") cb = silent, silent = false if (args.length) { - log.warn("shrinkwrap doesn't take positional args.") + log.warn("shrinkwrap", "doesn't take positional args") } npm.commands.ls([], true, function (er, _, pkginfo) { @@ -33,7 +33,7 @@ function shrinkwrap_ (pkginfo, silent, cb) { try { var swdata = JSON.stringify(pkginfo, null, 2) + "\n" } catch (er) { - log.error("Error converting package info to json") + log.error("shrinkwrap", "Error converting package info to json") return cb(er) } diff --git a/lib/star.js b/lib/star.js index d84fa02ed..2ad818479 100644 --- a/lib/star.js +++ b/lib/star.js @@ -3,7 +3,7 @@ module.exports = star var npm = require("./npm.js") , registry = require("./utils/npm-registry-client/index.js") - , log = require("./utils/log.js") + , log = require("npmlog") , asyncMap = require("slide").asyncMap , output = require("./utils/output.js") @@ -26,7 +26,7 @@ function star (args, cb) { registry.star(pkg, using, function (er, data, raw, req) { if (!er) { output.write(s + " "+pkg, npm.config.get("outfd")) - log.verbose(data, "back from star/unstar") + log.verbose("star", data) } cb(er, data, raw, req) }) diff --git a/lib/substack.js b/lib/substack.js index 95a90f824..1929f1873 100644 --- a/lib/substack.js +++ b/lib/substack.js @@ -1,9 +1,19 @@ module.exports = substack var npm = require("./npm.js") - , log = require("./utils/log.js") + +var isms = + [ "\033[32mbeep \033[35mboop\033[m" + , "Replace your configs with services" + , "SEPARATE ALL THE CONCERNS!" + , "MODULE ALL THE THINGS!" + , "\\o/" + , "but first, burritos" + , "full time mad scientist here" + , "c/,,\\" ] function substack (args, cb) { - console.log("\033[32mbeep \033[35mboop\033[m") + var i = Math.floor(Math.random() * isms.length) + console.log(isms[i]) var c = args.shift() if (c) npm.commands[c](args, cb) else cb() diff --git a/lib/unbuild.js b/lib/unbuild.js index 771eddf7d..c5ef21f22 100644 --- a/lib/unbuild.js +++ b/lib/unbuild.js @@ -10,7 +10,7 @@ var readJson = require("./utils/read-json.js") , lifecycle = require("./utils/lifecycle.js") , asyncMap = require("slide").asyncMap , chain = require("slide").chain - , log = require("./utils/log.js") + , log = require("npmlog") , build = require("./build.js") // args is a list of folders. diff --git a/lib/uninstall.js b/lib/uninstall.js index 655e5eb96..a1998e7fe 100644 --- a/lib/uninstall.js +++ b/lib/uninstall.js @@ -9,7 +9,7 @@ uninstall.usage = "npm uninstall <name>[@<version> [<name>[@<version>] ...]" uninstall.completion = require("./utils/completion/installed-shallow.js") var fs = require("graceful-fs") - , log = require("./utils/log.js") + , log = require("npmlog") , readJson = require("./utils/read-json.js") , path = require("path") , npm = require("./npm.js") @@ -43,12 +43,12 @@ function uninstall_ (args, nm, cb) { // uninstall .. should not delete /usr/local/lib/node_modules/.. var p = path.join(path.resolve(nm), path.join("/", arg)) if (path.resolve(p) === nm) { - log.warn(arg, "uninstall: invalid argument") + log.warn("uninstall", "invalid argument: %j", arg) return cb(null, []) } fs.lstat(p, function (er) { if (er) { - log.warn(arg, "Not installed in "+nm) + log.warn("uninstall", "not installed in %s: %j", nm, arg) return cb(null, []) } cb(null, p) diff --git a/lib/unpublish.js b/lib/unpublish.js index b7f6cbec8..46c91d1ef 100644 --- a/lib/unpublish.js +++ b/lib/unpublish.js @@ -2,7 +2,7 @@ module.exports = unpublish var registry = require("./utils/npm-registry-client/index.js") - , log = require("./utils/log.js") + , log = require("npmlog") , npm = require("./npm.js") , readJson = require("./utils/read-json.js") , path = require("path") @@ -72,7 +72,11 @@ function gotProject (project, version, cb_) { // remove from the cache first npm.commands.cache(["clean", project, version], function (er) { - if (er) return log.er(cb, "Failed to clean cache")(er) + if (er) { + log.error("unpublish", "Failed to clean cache") + return cb(er) + } + registry.unpublish(project, version, cb) }) } diff --git a/lib/update.js b/lib/update.js index 69b9f98e8..46d32678e 100644 --- a/lib/update.js +++ b/lib/update.js @@ -12,7 +12,7 @@ update.usage = "npm update [pkg]" var npm = require("./npm.js") , lifecycle = require("./utils/lifecycle.js") , asyncMap = require("slide").asyncMap - , log = require("./utils/log.js") + , log = require("npmlog") // load these, just so that we know that they'll be available, in case // npm itself is getting overwritten. @@ -23,7 +23,7 @@ update.completion = npm.commands.outdated.completion function update (args, cb) { npm.commands.outdated(args, true, function (er, outdated) { - log(outdated, "outdated updating") + log.info("outdated", "updating", outdated) if (er) return cb(er) asyncMap(outdated, function (ww, cb) { diff --git a/lib/utils/cmd-shim.js b/lib/utils/cmd-shim.js index e24da36f6..a31af6801 100644 --- a/lib/utils/cmd-shim.js +++ b/lib/utils/cmd-shim.js @@ -16,7 +16,7 @@ var fs = require("graceful-fs") , chain = require("slide").chain , mkdir = require("mkdirp") , rm = require("rimraf") - , log = require("./log.js") + , log = require("npmlog") , path = require("path") , relativize = require("./relativize.js") , npm = require("../npm.js") @@ -122,12 +122,12 @@ function writeShim_ (from, to, prog, args, cb) { fs.writeFile(to + ".cmd", cmd, "utf8", function (er) { if (er) { - log.warn("Could not write "+to+".cmd", "cmdShim") + log.warn("cmdShim", "Could not write "+to+".cmd") return cb(er) } fs.writeFile(to, sh, "utf8", function (er) { if (er) { - log.warn("Could not write "+to, "shShim") + log.warn("shShim", "Could not write "+to) return cb(er) } fs.chmod(to, 0755, cb) diff --git a/lib/utils/completion/users.js b/lib/utils/completion/users.js index f77312c94..2c62fc6ec 100644 --- a/lib/utils/completion/users.js +++ b/lib/utils/completion/users.js @@ -4,16 +4,16 @@ module.exports = users var registry = require("../npm-registry-client/index.js") , containsSingleMatch = require("./contains-single-match.js") , getCompletions = require("./get-completions.js") - , log = require("../log.js") + , log = require("npmlog") function users (args, index, cb) { var name = (args.length + 1 === index) ? args[args.length - 1] : "" if (name === undefined) name = "" // use up-to 1 day stale cache. doesn't change much - log.warn("About to fetch", "users completion") + log.warn("users completion", "About to fetch") registry.get("/-/users", null, 24*60*60, function (er, d) { - log.warn(d, "userdata") - log.warn(name, "name") + log.warn("userdata", d) + log.warn("name", name) if (er) return cb(er) var remoteList = Object.keys(d) , simpleMatches = getCompletions(name, remoteList) diff --git a/lib/utils/config-defs.js b/lib/utils/config-defs.js index 18b47ecdb..4542e8fd6 100644 --- a/lib/utils/config-defs.js +++ b/lib/utils/config-defs.js @@ -8,7 +8,7 @@ var path = require("path") , stableFamily = semver.parse(process.version) , os = require("os") , nopt = require("nopt") - , log = require("./log.js") + , log = require("npmlog") , npm = require("../npm.js") function Octal () {} @@ -32,7 +32,7 @@ nopt.typeDefs.semver = { type: semver, validate: validateSemver } nopt.typeDefs.Octal = { type: Octal, validate: validateOctal } nopt.invalidHandler = function (k, val, type, data) { - log.warn(k + "=" + JSON.stringify(val), "invalid config") + log.warn("invalid config", k + "=" + JSON.stringify(val)) if (Array.isArray(type)) { if (type.indexOf(url) !== -1) type = url @@ -41,16 +41,16 @@ nopt.invalidHandler = function (k, val, type, data) { switch (type) { case Octal: - log.warn("Must be octal number, starting with 0", "invalid config") + log.warn("invalid config", "Must be octal number, starting with 0") break case url: - log.warn("Must be a full url with 'http://'", "invalid config") + log.warn("invalid config", "Must be a full url with 'http://'") break case path: - log.warn("Must be a valid filesystem path", "invalid config") + log.warn("invalid config", "Must be a valid filesystem path") break case Number: - log.warn("Must be a numeric value", "invalid config") + log.warn("invalid config", "Must be a numeric value") break } } @@ -58,9 +58,6 @@ nopt.invalidHandler = function (k, val, type, data) { if (!stableFamily || (+stableFamily[2] % 2)) stableFamily = null else stableFamily = stableFamily[1] + "." + stableFamily[2] -var httpsOk = semver.satisfies(process.version, ">=0.4.9") -var winColor = semver.satisfies(process.version, ">=0.5.9") - var defaults var temp = process.env.TMPDIR @@ -143,7 +140,7 @@ Object.defineProperty(exports, "defaults", {get: function () { , "cache-max": Infinity , "cache-min": 0 - , color : process.platform !== "win32" || winColor + , color : true , coverage: false , depth: Infinity , description : true @@ -166,9 +163,7 @@ Object.defineProperty(exports, "defaults", {get: function () { , "init.author.url" : "" , json: false , link: false - , logfd : 2 , loglevel : "http" - , logprefix : process.platform !== "win32" || winColor , long : false , message : "%s" , "node-version" : process.version @@ -186,7 +181,7 @@ Object.defineProperty(exports, "defaults", {get: function () { process.env.HTTP_PROXY || process.env.http_proxy || null , "user-agent" : "npm/" + npm.version + " node/" + process.version , "rebuild-bundle" : true - , registry : "http" + (httpsOk ? "s" : "") + "://registry.npmjs.org/" + , registry : "https://registry.npmjs.org/" , rollback : true , save : false , "save-dev" : false @@ -251,9 +246,7 @@ exports.types = , "init.author.url" : ["", url] , json: Boolean , link: Boolean - , logfd : [Number, Stream] , loglevel : ["silent","win","error","warn","http","info","verbose","silly"] - , logprefix : Boolean , long : Boolean , message: String , "node-version" : [null, semver] diff --git a/lib/utils/error-handler.js b/lib/utils/error-handler.js index f7fdf165f..3ee337bb1 100644 --- a/lib/utils/error-handler.js +++ b/lib/utils/error-handler.js @@ -2,7 +2,7 @@ module.exports = errorHandler var cbCalled = false - , log = require("./log.js") + , log = require("npmlog") , npm = require("../npm.js") , rm = require("rimraf") , constants = require("constants") @@ -20,16 +20,17 @@ process.on("exit", function (code) { if (itWorked) log.info("ok") else { if (!cbCalled) { - log.error("cb() never called!\n ") + log.error("", "cb() never called!") } + if (wroteLogFile) { - log.error(["" + log.error("", ["" ,"Additional logging details can be found in:" ," " + path.resolve("npm-debug.log") ].join("\n")) wroteLogFile = false } - log.win("not ok") + log.error("not ok", "code", code) } var doExit = npm.config.get("_exit") @@ -48,13 +49,16 @@ function exit (code, noLog) { exitCode = exitCode || code var doExit = npm.config.get("_exit") - log.verbose([code, doExit], "exit") - if (log.level === log.LEVEL.silent) noLog = true + log.verbose("exit", [code, doExit]) + if (log.level === "silent") noLog = true if (code && !noLog) writeLogFile(reallyExit) else rm("npm-debug.log", function () { rm(npm.tmp, reallyExit) }) function reallyExit() { + // truncate once it's been written. + log.record.length = 0 + itWorked = !code // just emit a fake exit event. @@ -80,7 +84,7 @@ function errorHandler (er) { cbCalled = true if (!er) return exit(0) if (!(er instanceof Error)) { - log.error(er) + log.error("weird error", er) return exit(1, true) } @@ -95,8 +99,8 @@ function errorHandler (er) { switch (er.code || er.errno) { case "ECONNREFUSED": case constants.ECONNREFUSED: - log.error(er) - log.error(["\nIf you are behind a proxy, please make sure that the" + log.error("", er) + log.error("", ["\nIf you are behind a proxy, please make sure that the" ,"'proxy' config is set properly. See: 'npm help config'" ].join("\n")) break @@ -105,15 +109,15 @@ function errorHandler (er) { case "EPERM": case constants.EACCES: case constants.EPERM: - log.error(er) - log.error(["\nPlease try running this command again as root/Administrator." + log.error("", er) + log.error("", ["\nPlease try running this command again as root/Administrator." ].join("\n")) break case npm.ELIFECYCLE: er.code = "ELIFECYCLE" - log.error(er.message) - log.error(["","Failed at the "+er.pkgid+" "+er.stage+" script." + log.error("", er.message) + log.error("", ["","Failed at the "+er.pkgid+" "+er.stage+" script." ,"This is most likely a problem with the "+er.pkgname+" package," ,"not with npm itself." ,"Tell the author that this fails on your system:" @@ -126,9 +130,9 @@ function errorHandler (er) { case npm.EJSONPARSE: er.code = "EJSONPARSE" - log.error(er.message) - log.error("File: "+er.file) - log.error(["Failed to parse package.json data." + log.error("", er.message) + log.error("", "File: "+er.file) + log.error("", ["Failed to parse package.json data." ,"package.json must be actual JSON, not just JavaScript." ,"","This is not a bug in npm." ,"Tell the package author to fix their package.json file." @@ -149,31 +153,31 @@ function errorHandler (er) { } msg.push("\nNote that you can also install from a" ,"tarball, folder, or http url, or git url.") - log.error(msg.join("\n"), "404") + log.error("404", msg.join("\n")) } break case npm.EPUBLISHCONFLICT: er.code = "EPUBLISHCONFLICT" - log.error(["Cannot publish over existing version." + log.error("publish fail", ["Cannot publish over existing version." ,"Bump the 'version' field, set the --force flag, or" ," npm unpublish '"+er.pkgid+"'" ,"and try again" - ].join("\n"), "publish fail" ) + ].join("\n")) break case npm.EISGIT: er.code = "EISGIT" - log.error([er.message + log.error("git", [er.message ," "+er.path ,"Refusing to remove it. Update manually," ,"or move it out of the way first." - ].join("\n"), "git" ) + ].join("\n")) break case npm.ECYCLE: er.code = "ECYCLE" - log.error([er.message + log.error("cycle", [er.message ,"While installing: "+er.pkgid ,"Found a pathological dependency case that npm cannot solve." ,"Please report this to the package author." @@ -182,7 +186,7 @@ function errorHandler (er) { case npm.ENOTSUP: er.code = "ENOTSUP" - log.error([er.message + log.error("notsup", [er.message ,"Not compatible with your version of node/npm: "+er.pkgid ,"Required: "+JSON.stringify(er.required) ,"Actual: " @@ -193,7 +197,7 @@ function errorHandler (er) { case npm.EBADPLATFORM: er.code = "EBADPLATFORM" - log.error([er.message + log.error("notsup", [er.message ,"Not compatible with your operating system or architecture: "+er.pkgid ,"Valid OS: "+er.os.join(",") ,"Valid Arch: "+er.cpu.join(",") @@ -210,8 +214,8 @@ function errorHandler (er) { break default: - log.error(er) - log.error(["You may report this log at:" + log.error("", er) + log.error("", ["You may report this log at:" ," <http://github.com/isaacs/npm/issues>" ,"or email it to:" ," <npm-@googlegroups.com>" @@ -220,13 +224,14 @@ function errorHandler (er) { } var os = require("os") - log.error("") - log.error(os.type() + " " + os.release(), "System") - log.error(process.argv - .map(JSON.stringify).join(" "), "command") - log.error(process.cwd(), "cwd") - log.error(process.version, "node -v") - log.error(npm.version, "npm -v") + // just a line break + console.error("") + log.error("System", os.type() + " " + os.release()) + log.error("command", process.argv + .map(JSON.stringify).join(" ")) + log.error("cwd", process.cwd()) + log.error("node -v", process.version) + log.error("npm -v", npm.version) ; [ "file" , "path" @@ -243,11 +248,11 @@ function errorHandler (er) { , "message" , "errno" ].forEach(function (k) { - if (er[k]) log.error(er[k], k) + if (er[k]) log.error(k, er[k]) }) if (er.fstream_stack) { - log.error(er.fstream_stack.join("\n"), "fstream_stack") + log.error("fstream_stack", er.fstream_stack.join("\n")) } if (er.errno && typeof er.errno !== "object") log.error(er.errno, "errno") @@ -263,19 +268,21 @@ function writeLogFile (cb) { var fs = require("graceful-fs") , fstr = fs.createWriteStream("npm-debug.log") , util = require("util") - - log.history.forEach(function (m) { - var lvl = log.LEVEL[m.level] - , pref = m.pref ? " " + m.pref : "" - , b = lvl + pref + " " - , eol = process.platform === "win32" ? "\r\n" : "\n" - , msg = typeof m.msg === "string" ? m.msg - : msg instanceof Error ? msg.stack || msg.message - : util.inspect(m.msg, 0, 4) - fstr.write(new Buffer(b - +(msg.split(/\r?\n+/).join(eol+b)) - + eol)) + , eol = process.platform === "win32" ? "\r\n" : "\n" + , out = "" + + log.record.forEach(function (m) { + var pref = [m.id, m.level] + if (m.prefix) pref.push(m.prefix) + pref = pref.join(' ') + + m.message.trim().split(/\r?\n/).map(function (line) { + return (pref + ' ' + line).trim() + }).forEach(function (line) { + out += line + eol + }) }) - fstr.end() + + fstr.end(out) fstr.on("close", cb) } diff --git a/lib/utils/exec.js b/lib/utils/exec.js index b9a5b6911..56d331a67 100644 --- a/lib/utils/exec.js +++ b/lib/utils/exec.js @@ -1,8 +1,7 @@ module.exports = exec exec.spawn = spawn -exec.pipe = pipe -var log = require("./log.js") +var log = require("npmlog") , child_process = require("child_process") , util = require("util") , npm = require("../npm.js") @@ -31,8 +30,7 @@ function exec (cmd, args, env, takeOver, cwd, uid, gid, cb) { } } if (uid !== myUID) { - log.verbose(uid, "Setting uid from "+myUID) - log.verbose(new Error().stack, "stack at uid setting") + log.verbose("set uid", "from=%s to=%s", myUID, uid) } if (uid && gid && (isNaN(uid) || isNaN(gid))) { @@ -43,7 +41,7 @@ function exec (cmd, args, env, takeOver, cwd, uid, gid, cb) { }) } - log.silly(cmd+" "+args.map(JSON.stringify).join(" "), "exec") + log.silly("exec", cmd+" "+args.map(JSON.stringify).join(" ")) var stdout = "" , stderr = "" , cp = spawn(cmd, args, env, takeOver, cwd, uid, gid) @@ -65,38 +63,6 @@ function exec (cmd, args, env, takeOver, cwd, uid, gid, cb) { return cp } -function logger (d) { if (d) process.stderr.write(d+"") } -function pipe (cp1, cp2, cb) { - util.pump(cp1.stdout, cp2.stdin) - var errState = null - , buff1 = "" - , buff2 = "" - if (log.level <= log.LEVEL.silly) { - cp1.stderr.on("data", logger) - cp2.stderr.on("data", logger) - } else { - cp1.stderr.on("data", function (d) { buff1 += d }) - cp2.stderr.on("data", function (d) { buff2 += d }) - } - - cp1.on("exit", function (code) { - if (!code) return log.verbose(cp1.name || "<unknown>", "success") - if (!cp2._exited) cp2.kill() - log.error(buff1, cp1.name || "<unknown>") - cb(errState = new Error( - "Failed "+(cp1.name || "<unknown>")+"\nexited with "+code)) - }) - - cp2.on("exit", function (code) { - cp2._exited = true - if (errState) return - if (!code) return log.verbose(cp2.name || "<unknown>", "success", cb) - log.error(buff2, cp2.name || "<unknown>") - cb(new Error( "Failed " - + (cp2.name || "<unknown>") - + "\nexited with " + code )) - }) -} function spawn (c, a, env, takeOver, cwd, uid, gid) { var fds = [ 0, 1, 2 ] diff --git a/lib/utils/fetch.js b/lib/utils/fetch.js index bc1c095cd..f69975ba6 100644 --- a/lib/utils/fetch.js +++ b/lib/utils/fetch.js @@ -6,7 +6,7 @@ var request = require("request") , fs = require("graceful-fs") , npm = require("../npm.js") , url = require("url") - , log = require("./log.js") + , log = require("npmlog") , path = require("path") , mkdir = require("mkdirp") , chownr = require("chownr") @@ -16,7 +16,7 @@ module.exports = fetch function fetch (remote, local, headers, cb) { if (typeof cb !== "function") cb = headers, headers = {} - log.verbose(local, "fetch to") + log.verbose("fetch", "to=", local) mkdir(path.dirname(local), function (er, made) { if (er) return cb(er) fetch_(remote, local, headers, cb) @@ -41,7 +41,7 @@ function fetch_ (remote, local, headers, cb) { function makeRequest (remote, fstr, headers) { remote = url.parse(remote) - log.http(remote.href, "GET") + log.http("GET", remote.href) regHost = regHost || url.parse(npm.config.get("registry")).host if (remote.host === regHost && npm.config.get("always-auth")) { @@ -63,6 +63,6 @@ function makeRequest (remote, fstr, headers) { , onResponse: onResponse }).pipe(fstr) function onResponse (er, res) { if (er) return fstr.emit("error", er) - log.http(res.statusCode + " " + remote.href) + log.http(res.statusCode, remote.href) } } diff --git a/lib/utils/ini.js b/lib/utils/ini.js index b033b6a04..aa4f43180 100644 --- a/lib/utils/ini.js +++ b/lib/utils/ini.js @@ -39,7 +39,7 @@ var fs = require("graceful-fs") , mkdir = require("mkdirp") , npm = require("../npm.js") - , log = require("./log.js") + , log = require("npmlog") , configDefs = require("./config-defs.js") , myUid = process.env.SUDO_UID !== undefined @@ -66,7 +66,6 @@ exports.configList = configList // just put this here for a moment, so that the logs // in the config-loading phase don't cause it to blow up. -configList.push({loglevel:"warn"}) function resolveConfigs (cli, cb_) { defaultConfig = defaultConfig || configDefs.defaults @@ -108,7 +107,8 @@ function resolveConfigs (cli, cb_) { if (er) return cb(er) if (conf.hasOwnProperty("prefix")) { - log.warn("Cannot set prefix in globalconfig file" + log.warn( "globalconfig" + , "Cannot set prefix in globalconfig file" , cl.get("globalconfig")) delete conf.prefix } @@ -196,7 +196,7 @@ function parseField (f, k, emptyIsFalse) { function parseFile (file, cb) { if (!file) return cb(null, {}) - log.verbose(file, "config file") + log.verbose("config file", file) fs.readFile(file, function (er, data) { // treat all errors as just an empty file if (er) return cb(null, {}) diff --git a/lib/utils/lifecycle.js b/lib/utils/lifecycle.js index c5ebbbee1..69935b9b1 100644 --- a/lib/utils/lifecycle.js +++ b/lib/utils/lifecycle.js @@ -2,7 +2,7 @@ exports = module.exports = lifecycle exports.cmd = cmd -var log = require("./log.js") +var log = require("npmlog") , exec = require("./exec.js") , npm = require("../npm.js") , path = require("path") @@ -31,7 +31,7 @@ function lifecycle (pkg, stage, wd, unsafe, failOk, cb) { while (pkg && pkg._data) pkg = pkg._data if (!pkg) return cb(new Error("Invalid package data")) - log(pkg._id, stage) + log.info(stage, pkg._id) if (!pkg.scripts) pkg.scripts = {} validWd(wd || path.resolve(npm.dir, pkg.name), function (er, wd) { @@ -41,7 +41,8 @@ function lifecycle (pkg, stage, wd, unsafe, failOk, cb) { if ((wd.indexOf(npm.dir) !== 0 || path.basename(wd) !== pkg.name) && !unsafe && pkg.scripts[stage]) { - log.warn(pkg._id+" "+pkg.scripts[stage], "skipping, cannot run in "+wd) + log.warn( "cannot run in wd", "%s %s (wd=%s)" + , pkg._id, pkg.scripts[stage], wd) return cb() } @@ -98,14 +99,14 @@ function lifecycle_ (pkg, stage, wd, env, unsafe, failOk, cb) { if (failOk) { cb = (function (cb_) { return function (er) { - if (er) log.warn(er.message, "continuing anyway") + if (er) log.warn("continuing anyway", er.message) cb_() }})(cb) } if (npm.config.get("force")) { cb = (function (cb_) { return function (er) { - if (er) log(er, "forced, continuing") + if (er) log.info("forced, continuing", er) cb_() }})(cb) } @@ -143,7 +144,7 @@ function runPackageLifecycle (pkg, env, wd, unsafe, cb) { shFlag = "/c" } - log.verbose(unsafe, "unsafe-perm in lifecycle") + log.verbose("unsafe-perm in lifecycle", unsafe) var note = "\n> " + pkg._id + " " + stage + " " + wd + "\n> " + cmd + "\n" @@ -155,7 +156,7 @@ function runPackageLifecycle (pkg, env, wd, unsafe, cb) { , user, group , function (er, code, stdout, stderr) { if (er && !npm.ROLLBACK) { - log("Failed to exec "+stage+" script", pkg._id) + log.info(pkg._id, "Failed to exec "+stage+" script") er.message = pkg._id + " " + stage + ": `" + env.npm_lifecycle_script+"`\n" + er.message @@ -168,8 +169,8 @@ function runPackageLifecycle (pkg, env, wd, unsafe, cb) { er.pkgname = pkg.name return cb(er) } else if (er) { - log.error(er, pkg._id+"."+stage) - log.error("failed, but continuing anyway", pkg._id+"."+stage) + log.error(pkg._id+"."+stage, er) + log.error(pkg._id+"."+stage, "continuing anyway") return cb() } cb(er) @@ -193,7 +194,7 @@ function runHookLifecycle (pkg, env, wd, unsafe, cb) { , function (er) { if (er) { er.message += "\nFailed to exec "+stage+" hook script" - log(er, pkg._id) + log.info(pkg._id, er) } if (npm.ROLLBACK) return cb() cb(er) @@ -260,10 +261,6 @@ function makeEnv (data, prefix, env) { return } var value = ini.get(i) - if (/^(log|out)fd$/.test(i) && typeof value === "object") { - // not an fd, a stream - return - } if (!value) value = "" else if (typeof value !== "string") value = JSON.stringify(value) diff --git a/lib/utils/link.js b/lib/utils/link.js index 7fa80d5e1..17a02e5ba 100644 --- a/lib/utils/link.js +++ b/lib/utils/link.js @@ -6,7 +6,6 @@ var fs = require("graceful-fs") , chain = require("slide").chain , mkdir = require("mkdirp") , rm = require("./gently-rm.js") - , log = require("./log.js") , path = require("path") , relativize = require("./relativize.js") , npm = require("../npm.js") diff --git a/lib/utils/load-package-defaults.js b/lib/utils/load-package-defaults.js index 180507a44..8a72ade30 100644 --- a/lib/utils/load-package-defaults.js +++ b/lib/utils/load-package-defaults.js @@ -2,7 +2,7 @@ module.exports = loadPackageDefaults var path = require("path") - , log = require("./log.js") + , log = require("npmlog") , find = require("./find.js") , asyncMap = require("slide").asyncMap , npm = require("../npm.js") @@ -21,7 +21,7 @@ function loadPackageDefaults (pkg, pkgDir, cb) { pkg._defaultsLoaded = true asyncMap ( [pkg] - , function (pkg, cb) { log.verbose(pkg._id, "loadDefaults", cb) } + , function (pkg, cb) { log.verbose("loadDefaults", pkg._id); cb() } , readDefaultBins(pkgDir) , readDefaultMans(pkgDir) , function (er) { cb(er, pkg) } ) @@ -54,7 +54,7 @@ function readDefaultBins (pkgDir) { return function (pkg, cb) { var bin = pkg.directories && pkg.directories.bin if (pkg.bins) pkg.bin = pkg.bins, delete pkg.bins if (pkg.bin || !bin) return cb(null, pkg) - log.verbose("linking default bins", pkg._id) + log.verbose("loadDefaults", pkg._id, "linking default bins") var binDir = path.join(pkgDir, bin) pkg.bin = {} find(binDir, function (er, filenames) { @@ -69,7 +69,7 @@ function readDefaultBins (pkgDir) { return function (pkg, cb) { , val = filename.substr(cut) if (key.length && val.length) pkg.bin[key] = val }) - log.silly(pkg.bin, pkg._id+".bin") + log.silly("loadDefaults", pkg._id, "bin", pkg.bin) cb(null, pkg) }) }} diff --git a/lib/utils/log.js b/lib/utils/log.js deleted file mode 100644 index 07867e3e9..000000000 --- a/lib/utils/log.js +++ /dev/null @@ -1,170 +0,0 @@ - -module.exports = log - -var output = require("./output.js") - -function colorize (msg, color) { - return msg ? "\033["+color+"m"+msg+"\033[0m" : "" -} - -var l = -1 - , LEVEL = { silly : l++ - , verbose : l++ - , info : l++ - , "http" : l++ - , WARN : l++ - , "ERR!" : l++ - , ERROR : "ERR!" - , ERR : "ERR!" - , win : 0x15AAC5 - , paused : 0x19790701 - , silent : 0xDECAFBAD - } - , COLOR = {} - , SHOWLEVEL = null - , normalNames = {} -log.LEVEL = LEVEL -normalNames[LEVEL["ERR!"]] = "error" -normalNames[LEVEL.WARN] = "warn" -normalNames[LEVEL.info] = "info" -normalNames[LEVEL.verbose] = "verbose" -normalNames[LEVEL.silly] = "silly" -normalNames[LEVEL.win] = "win" - -Object.keys(LEVEL).forEach(function (l) { - if (typeof LEVEL[l] === "string") LEVEL[l] = LEVEL[LEVEL[l]] - else LEVEL[LEVEL[l]] = l - LEVEL[l.toLowerCase()] = LEVEL[l] - if (l === "silent" || l === "paused") return - log[l] = log[l.toLowerCase()] = - function (msg, pref, cb) { return log(msg, pref, l, cb) } -}) - -COLOR[LEVEL.silly] = 30 -COLOR[LEVEL.verbose] = "34;40" -COLOR[LEVEL.info] = 32 -COLOR[LEVEL.http] = "32;40" -COLOR[LEVEL.warn] = "30;41" -COLOR[LEVEL.error] = "31;40" -for (var c in COLOR) COLOR[LEVEL[c]] = COLOR[c] -COLOR.npm = "37;40" -COLOR.pref = 35 - -var logBuffer = [] - , ini = require("./ini.js") - , waitForConfig -log.waitForConfig = function () { waitForConfig = true } - -// now the required stuff has been loaded, -// so the transitive module dep will work -var util = require("util") - , npm = require("../npm.js") - , net = require("net") - -Object.defineProperty(log, "level", - { get : function () { - if (SHOWLEVEL !== null) return SHOWLEVEL - var show = npm.config && npm.config.get("loglevel") || '' - show = show.split(",")[0] - if (!isNaN(show)) show = +show - else if (!LEVEL.hasOwnProperty(show)) { - util.error("Invalid loglevel config: "+JSON.stringify(show)) - show = "info" - } - if (isNaN(show)) show = LEVEL[show] - else show = +show - if (!waitForConfig || ini.resolved) SHOWLEVEL = show - return show - } - , set : function (l) { - SHOWLEVEL = null - npm.config.set("showlevel", l) - } - }) - -function log (msg, pref, level, cb) { - if (typeof level === "function") cb = level, level = null - var show = log.level - if (show === LEVEL.silent || show === LEVEL.paused) return cb && cb() - if (level == null) level = LEVEL.info - if (isNaN(level)) level = LEVEL[level] - else level = +level - - // logging just undefined is almost never the right thing. - // a lot of these are kicking around throughout the codebase - // with relatively unhelpful prefixes. - if (msg === undefined && level > LEVEL.silly) { - msg = new Error("undefined log message") - } - if (typeof msg === "object" && (msg instanceof Error)) level = LEVEL.error - if (!ini.resolved && waitForConfig || level === LEVEL.paused) { - return logBuffer.push([msg, pref, level, cb]) - } - if (logBuffer.length && !logBuffer.discharging) { - logBuffer.push([msg, pref, level, cb]) - logBuffer.discharging = true - logBuffer.forEach(function (l) { log.apply(null, l) }) - logBuffer.length = 0 - delete logBuffer.discharging - return - } - log.level = show - npm.emit("log", { level : level, msg : msg, pref : pref, cb : cb }) - npm.emit("log."+normalNames[level], { msg : msg, pref : pref, cb : cb }) -} - -var loglog = log.history = [] - , loglogLen = 0 -npm.on("log", function (logData) { - var level = logData.level - , msg = logData.msg - , pref = logData.pref - , cb = logData.cb || function () {} - , show = log.level - , spaces = " " - , logFD = npm.config.get("logfd") - if (msg instanceof Error) { - msg = logData.msg = msg.stack || msg.toString() - } - loglog.push(logData) - loglogLen ++ - if (loglogLen > 2000) { - loglog = loglog.slice(loglogLen - 1000) - loglogLen = 1000 - } - if (!isFinite(level) || level < show) return cb() - if (typeof msg !== "string" && !(msg instanceof Error)) { - msg = util.inspect(msg, 0, 4, true) - } - - // console.error("level, showlevel, show", level, show, (level >= show)) - if (pref && COLOR.pref) { - pref = colorize(pref, COLOR.pref) - } - if (!pref) pref = "" - - if (npm.config.get("logprefix")) { - pref = colorize("npm", COLOR.npm) - + (COLOR[level] ? " "+colorize( - (LEVEL[level]+spaces).substr(0,4), COLOR[level]) : "") - + (pref ? (" " + pref) : "") - } - if (pref) pref += " " - - - - if (msg.indexOf("\n") !== -1) { - msg = msg.split(/\n/).join("\n"+pref) - } - msg = pref+msg - return output.write(msg, logFD, cb) -}) - -log.er = function (cb, msg) { - if (!msg) throw new Error( - "Why bother logging it if you're not going to print a message?") - return function (er) { - if (er) log.error(msg) - cb.apply(this, arguments) - } -} diff --git a/lib/utils/npm-registry-client/adduser.js b/lib/utils/npm-registry-client/adduser.js index 5e6794a75..0dc582395 100644 --- a/lib/utils/npm-registry-client/adduser.js +++ b/lib/utils/npm-registry-client/adduser.js @@ -3,7 +3,7 @@ module.exports = adduser var uuid = require("node-uuid") , request = require("./request.js") - , log = require("../log.js") + , log = require("npmlog") , npm = require("../../npm.js") , crypto @@ -43,7 +43,7 @@ function adduser (username, password, email, cb) { , date: new Date().toISOString() } cb = done(cb) - log.verbose(userobj, "before first PUT") + log.verbose("adduser", "before first PUT", userobj) request.PUT ( '/-/user/org.couchdb.user:'+encodeURIComponent(username) , userobj @@ -61,13 +61,13 @@ function adduser (username, password, email, cb) { if (!error || !response || response.statusCode !== 409) { return cb(error, data, json, response) } - log.verbose("update existing user", "adduser") + log.verbose("adduser", "update existing user") return request.GET ( '/-/user/org.couchdb.user:'+encodeURIComponent(username) , function (er, data, json, response) { userobj._rev = data._rev userobj.roles = data.roles - log.verbose(userobj, "userobj") + log.verbose("adduser", "userobj", userobj) request.PUT ( '/-/user/org.couchdb.user:'+encodeURIComponent(username) + "/-rev/" + userobj._rev @@ -83,14 +83,14 @@ function done (cb) { return function (error, data, json, response) { if (!error && (!response || response.statusCode === 201)) { return cb(error, data, json, response) } - log.verbose([error, data, json], "back from adduser") + log.verbose("adduser", "back", [error, data, json]) if (!error) { error = new Error( (response && response.statusCode || "") + " "+ "Could not create user\n"+JSON.stringify(data)) } if (response && (response.statusCode === 401 || response.statusCode === 403)) { - log.warn("Incorrect username or password\n" + log.warn("adduser", "Incorrect username or password\n" +"You can reset your account by visiting:\n" +"\n" +" http://admin.npmjs.org/reset\n") diff --git a/lib/utils/npm-registry-client/get.js b/lib/utils/npm-registry-client/get.js index e0902f027..89a3d7cbc 100644 --- a/lib/utils/npm-registry-client/get.js +++ b/lib/utils/npm-registry-client/get.js @@ -5,7 +5,7 @@ var GET = require("./request.js").GET , fs = require("graceful-fs") , npm = require("../../npm.js") , path = require("path") - , log = require("../log.js") + , log = require("npmlog") , mkdir = require("mkdirp") , cacheStat = null , chownr = require("chownr") @@ -83,7 +83,7 @@ function requestAll_ (c, data, cb) { var uri = "/-/all/since?stale=update_after&startkey=" + c if (c === 0) { - log.warn("Building the local index for the first time, please be patient") + log.warn("", "Building the local index for the first time, please be patient") uri = "/-/all" } @@ -109,12 +109,12 @@ function get_ (uri, timeout, cache, stat, data, nofollow, staleOk, cb) { if (data && data._etag) etag = data._etag if (timeout && timeout > 0 && stat && data) { if ((Date.now() - stat.mtime.getTime())/1000 < timeout) { - log.verbose("not expired, no request", "registry.get " +uri) + log.verbose("registry.get", uri, "not expired, no request") delete data._etag return cb(null, data, JSON.stringify(data), {statusCode:304}) } if (staleOk) { - log.verbose("staleOk, background update", "registry.get " +uri) + log.verbose("registry.get", uri, "staleOk, background update") delete data._etag process.nextTick(cb.bind( null, null, data, JSON.stringify(data) , {statusCode: 304} )) @@ -131,10 +131,10 @@ function get_ (uri, timeout, cache, stat, data, nofollow, staleOk, cb) { } if (response) { - log.silly([response.statusCode, response.headers], "get cb") + log.silly("registry.get", "cb", [response.statusCode, response.headers]) if (response.statusCode === 304 && etag) { remoteData = data - log.verbose(uri+" from cache", "etag") + log.verbose("etag", uri+" from cache") } } diff --git a/lib/utils/npm-registry-client/publish.js b/lib/utils/npm-registry-client/publish.js index a196a3c07..7df65fa50 100644 --- a/lib/utils/npm-registry-client/publish.js +++ b/lib/utils/npm-registry-client/publish.js @@ -7,7 +7,7 @@ var request = require("./request.js") , DELETE = request.DELETE , reg = request.reg , upload = request.upload - , log = require("../log.js") + , log = require("npmlog") , path = require("path") , npm = require("../../npm.js") , url = require("url") @@ -70,8 +70,9 @@ function publish (data, prebuilt, readme, cb) { && !( parsed && parsed.reason === "must supply latest _rev to update existing package" )) { - return log.er(cb, "Failed PUT response " - +(response && response.statusCode))(er) + log.error("publish", "Failed PUT response " + +(response && response.statusCode)) + return cb(er) } var dataURI = encodeURIComponent(data.name) + "/" + encodeURIComponent(data.version) @@ -88,13 +89,13 @@ function publish (data, prebuilt, readme, cb) { var exists = fullData.versions && fullData.versions[data.version] if (exists) { - log(exists._id, "Already published") + log.info("already published", exists._id) var ebin = exists.dist.bin || {} , nbin = data.dist.bin || {} , needs = Object.keys(nbin).filter(function (bd) { return !ebin.hasOwnProperty(bd) }) - log.verbose(needs, "uploading bin dists") + log.verbose("upload bindist", needs) if (!needs.length) return cb(conflictError(data._id)) // attach the needed bindists, upload the new metadata exists.dist.bin = ebin @@ -115,7 +116,8 @@ function publish (data, prebuilt, readme, cb) { if (er.message.indexOf("conflict Document update conflict.") === 0) { return cb(conflictError(data._id)) } - return log.er(cb, "Error sending version data")(er) + log.error("publish", "Error sending version data") + return cb(er) } var c = path.resolve(npm.cache, data.name, data.version) @@ -123,9 +125,9 @@ function publish (data, prebuilt, readme, cb) { cb = rollbackFailure(data, cb) - log.verbose([data.name, tb, tbName], "attach 2") + log.verbose("publish", "attach 2", [data.name, tb, tbName]) attach(data.name, tb, tbName, function (er) { - log.verbose([er, data.name, prebuilt, pbName], "attach 3") + log.verbose("publish", "attach 3", [er, data.name, prebuilt, pbName]) if (er || !prebuilt) return cb(er) attach(data.name, prebuilt, pbName, cb) }) @@ -149,7 +151,7 @@ function attach (doc, file, filename, cb) { "Attempting to upload to invalid doc "+doc)) var rev = "-rev/"+d._rev , attURI = doc + "/-/" + encodeURIComponent(filename) + "/" + rev - log.verbose([attURI, file], "uploading") + log.verbose("uploading", [attURI, file]) upload(attURI, file, cb) }) } @@ -157,14 +159,14 @@ function attach (doc, file, filename, cb) { function rollbackFailure (data, cb) { return function (er) { if (!er) return cb() npm.ROLLBACK = true - log.error(er, "publish failed") - log("rollback", "publish failed") + log.error("publish failed", er) + log.info("publish failed", "rollback") npm.commands.unpublish([data.name+"@"+data.version], function (er_) { if (er_) { - log.error(er_, "rollback failed") - log.error( "Invalid data in registry! Please report this." - , "rollback failed" ) - } else log("rolled back", "publish failed") + log.error("rollback failed", er_) + log.error( "rollback failed" + , "Invalid data in registry! Please report this.") + } else log.info("publish failed", "rolled back") cb(er) }) }} diff --git a/lib/utils/npm-registry-client/request.js b/lib/utils/npm-registry-client/request.js index d5122629d..2ecae9386 100644 --- a/lib/utils/npm-registry-client/request.js +++ b/lib/utils/npm-registry-client/request.js @@ -7,7 +7,7 @@ regRequest.upload = upload var npm = require("../../npm.js") , url = require("url") - , log = require("../log.js") + , log = require("npmlog") , fs = require("graceful-fs") , rm = require("rimraf") , asyncMap = require("slide").asyncMap @@ -47,7 +47,7 @@ function regRequest (method, where, what, etag, nofollow, cb_) { // resolve to a full url on the registry if (!where.match(/^https?:\/\//)) { - log.verbose(where, "raw, before any munging") + log.verbose("url raw", where) var q = where.split("?") where = q.shift() @@ -62,9 +62,9 @@ function regRequest (method, where, what, etag, nofollow, cb_) { return encodeURIComponent(p) }).join("/") if (q) where += "?" + q - log.verbose([registry, where], "url resolving") + log.verbose("url resolving", [registry, where]) where = url.resolve(registry, where) - log.verbose(where, "url resolved") + log.verbose("url resolved", where) } var remote = url.parse(where) @@ -88,7 +88,7 @@ function makeRequest (method, remote, where, what, etag, nofollow, cb) { , strictSSL: npm.config.get("strict-ssl") } , headers = opts.headers = {} if (etag) { - log.verbose(etag, "etag") + log.verbose("etag", etag) headers[method === "GET" ? "if-none-match" : "if-match"] = etag } @@ -118,7 +118,7 @@ function makeRequest (method, remote, where, what, etag, nofollow, cb) { opts.followRedirect = false } - log.http(remote.href || "/", method) + log.http(method, remote.href || "/") var req = request(opts, requestDone(method, where, cb)) var r = npm.config.get("registry") @@ -137,7 +137,7 @@ function makeRequest (method, remote, where, what, etag, nofollow, cb) { function requestDone (method, where, cb) { return function (er, response, data) { if (er) return cb(er) - log.http(response.statusCode + " " + url.parse(where).href) + log.http(response.statusCode, url.parse(where).href) var parsed @@ -150,8 +150,8 @@ function requestDone (method, where, cb) { return function (er, response, data) parsed = JSON.parse(data) } catch (ex) { ex.message += "\n" + data - log.verbose(data, "bad json") - log.error("error parsing json", "registry") + log.verbose("bad json", data) + log.error("registry", "error parsing json") return cb(ex, null, data, response) } } else if (data) { diff --git a/lib/utils/npm-registry-client/star.js b/lib/utils/npm-registry-client/star.js index 474a1786d..eeaca14ef 100644 --- a/lib/utils/npm-registry-client/star.js +++ b/lib/utils/npm-registry-client/star.js @@ -4,7 +4,7 @@ module.exports = star var request = require("./request.js") , GET = request.GET , PUT = request.PUT - , log = require("../log.js") + , log = require("npmlog") , npm = require("../../npm.js") function star (package, starred, cb) { @@ -20,11 +20,11 @@ function star (package, starred, cb) { if (starred) { log.info("starring", fullData._id) fullData.users[npm.config.get("username")] = true - log.verbose(fullData) + log.verbose("starring", fullData) } else { delete fullData.users[npm.config.get("username")] log.info("unstarring", fullData._id) - log.verbose(fullData) + log.verbose("unstarring", fullData) } return PUT(package, fullData, cb) diff --git a/lib/utils/npm-registry-client/unpublish.js b/lib/utils/npm-registry-client/unpublish.js index 0c7c44991..4e4982c6b 100644 --- a/lib/utils/npm-registry-client/unpublish.js +++ b/lib/utils/npm-registry-client/unpublish.js @@ -8,7 +8,7 @@ module.exports = unpublish var request = require("./request.js") - , log = require("../log.js") + , log = require("npmlog") , get = require("./get.js") , semver = require("semver") , url = require("url") @@ -20,26 +20,29 @@ function unpublish (name, ver, cb) { "Not enough arguments for registry unpublish") get(name, null, -1, true, function (er, data) { - if (er) return log(name+" not published", "unpublish", cb) + if (er) { + log.info("unpublish", name+" not published") + return cb() + } // remove all if no version specified if (!ver) { - log("No version specified, removing all", "unpublish") + log.info("unpublish", "No version specified, removing all") return request("DELETE", name+'/-rev/'+data._rev, cb) } var versions = data.versions || {} , versionPublic = versions.hasOwnProperty(ver) - if (!versionPublic) log(name+"@"+ver+" not published", "unpublish") + if (!versionPublic) log.info("unpublish", name+"@"+ver+" not published") else { var dist = versions[ver].dist - log.verbose(dist, "removing attachments") + log.verbose("unpublish", "removing attachments", dist) } delete versions[ver] // if it was the only version, then delete the whole package. if (!Object.keys(versions).length) { - log("No versions remain, removing entire package", "unpublish") + log.info("unpublish", "No versions remain, removing entire package") return request("DELETE", name+"/-rev/"+data._rev, cb) } @@ -58,9 +61,13 @@ function unpublish (name, ver, cb) { var rev = data._rev delete data._revisions delete data._attachments - // log(data._rev, "rev") - request.PUT(name+"/-rev/"+rev, data, - log.er(detacher(data, dist, cb), "Failed to update the data")) + var cb_ = detacher(data, dist, cb) + request.PUT(name+"/-rev/"+rev, data, function (er) { + if (er) { + log.error("unpublish", "Failed to update data") + } + cb_(er) + }) }) } @@ -86,7 +93,7 @@ function detacher (data, dist, cb) { return function (er) { function detach (data, path, rev, cb) { if (rev) { path += "/-rev/" + rev - log(path, "detach") + log.info("detach", path) return request("DELETE", path, cb) } get(data.name, function (er, data) { diff --git a/lib/utils/read-installed.js b/lib/utils/read-installed.js index ff220943d..d298f1c86 100644 --- a/lib/utils/read-installed.js +++ b/lib/utils/read-installed.js @@ -93,7 +93,7 @@ var npm = require("../npm.js") , asyncMap = require("slide").asyncMap , semver = require("semver") , readJson = require("./read-json.js") - , log = require("./log.js") + , log = require("npmlog") , url = require("url") module.exports = readInstalled @@ -259,17 +259,17 @@ function findUnmet (obj) { && !url.parse(deps[d]).protocol && !semver.satisfies(found.version, deps[d])) { // the bad thing will happen - log.warn(obj.path + " requires "+d+"@'"+deps[d] + log.warn("unmet dependency", obj.path + " requires "+d+"@'"+deps[d] +"' but will load\n" +found.path+",\nwhich is version "+found.version - ,"unmet dependency") + ) found.invalid = true } deps[d] = found } }) - log.verbose([obj._id], "returning") + log.verbose("readInstalled", "returning", obj._id) return obj } diff --git a/lib/utils/read-json.js b/lib/utils/read-json.js index d1bba10f5..68153ab21 100644 --- a/lib/utils/read-json.js +++ b/lib/utils/read-json.js @@ -8,7 +8,7 @@ readJson.clearCache = clearCache var fs = require("graceful-fs") , semver = require("semver") , path = require("path") - , log = require("./log.js") + , log = require("npmlog") , npm = require("../npm.js") , cache = {} , timers = {} @@ -17,7 +17,7 @@ var fs = require("graceful-fs") function readJson (jsonFile, opts, cb) { if (typeof cb !== "function") cb = opts, opts = {} if (cache.hasOwnProperty(jsonFile)) { - log.verbose(jsonFile, "from cache") + log.verbose("json from cache", jsonFile) return cb(null, cache[jsonFile]) } opts.file = jsonFile @@ -180,8 +180,7 @@ function processJsonString (opts, cb) { return function (er, jsonString) { if (opts.file && opts.file.indexOf(npm.dir) === 0) { try { json = require("vm").runInNewContext("(\n"+jsonString+"\n)") - log.error(opts.file, "Error parsing json") - log.error(ex, "parse error ") + log.error("Error parsing json", opts.file, ex) } catch (ex2) { return jsonParseFail(ex, opts.file, cb) } @@ -209,7 +208,7 @@ function typoWarn (json) { typoWarned[json._id] = true if (json.modules) { - log.warn("package.json: 'modules' object is deprecated", json._id) + log.verbose("package.json", "'modules' object is deprecated", json._id) delete json.modules } @@ -235,8 +234,8 @@ function typoWarn (json) { Object.keys(typos).forEach(function (d) { if (json.hasOwnProperty(d)) { - log.warn( "package.json: '" + d + "' should probably be '" - + typos[d] + "'", json._id) + log.warn( json._id, "package.json: '" + d + "' should probably be '" + + typos[d] + "'" ) } }) @@ -259,8 +258,9 @@ function typoWarn (json) { var scriptTypos = { "server": "start" } if (json.scripts) Object.keys(scriptTypos).forEach(function (d) { if (json.scripts.hasOwnProperty(d)) { - log.warn( "package.json: scripts['" + d + "'] should probably be " - + "scripts['" + scriptTypos[d] + "']", json._id) + log.warn( json._id + , "package.json: scripts['" + d + "'] should probably be " + + "scripts['" + scriptTypos[d] + "']" ) } }) } @@ -268,7 +268,6 @@ function typoWarn (json) { function processObject (opts, cb) { return function (er, json) { // json._npmJsonOpts = opts - // log.warn(json, "processing json") if (npm.config.get("username")) { json._npmUser = { name: npm.config.get("username") , email: npm.config.get("email") } @@ -310,7 +309,7 @@ function processObject (opts, cb) { return function (er, json) { // uncomment once this is no longer an issue. // if (cb) return cb(e) // throw e - log.error(msg, "incorrect json: "+json.name) + log.error("json", "incorrect json: "+json.name, msg) json.repostory = json.repositories[0] delete json.repositories } @@ -335,14 +334,14 @@ function processObject (opts, cb) { return function (er, json) { } if (repo.match(/github\.com\/[^\/]+\/[^\/]+\/?$/) && repo.match(/\.git\.git$/)) { - log.warn(repo, "Probably broken git url") + log.warn(json._id, "Probably broken git url", repo) } json.repository.url = repo } var files = json.files if (files && !Array.isArray(files)) { - log.warn(files, "Invalid 'files' member. See 'npm help json'") + log.warn(json._id, "Invalid 'files' member. See 'npm help json'", files) delete json.files } @@ -361,7 +360,7 @@ function processObject (opts, cb) { return function (er, json) { // if it has a bindings.gyp, then build with node-gyp if (opts.gypfile && !json.prebuilt) { - log.verbose([json.prebuilt, opts], "has bindings.gyp") + log.verbose(json._id, "has bindings.gyp", [json.prebuilt, opts]) if (!scripts.install && !scripts.preinstall) { scripts.install = "node-gyp rebuild" json.scripts = scripts @@ -370,7 +369,7 @@ function processObject (opts, cb) { return function (er, json) { // if it has a wscript, then build it. if (opts.wscript && !json.prebuilt) { - log.verbose([json.prebuilt, opts], "has wscript") + log.verbose(json._id, "has wscript", [json.prebuilt, opts]) if (!scripts.install && !scripts.preinstall) { // don't fail if it was unexpected, just try. scripts.preinstall = "node-waf clean || (exit 0); node-waf configure build" @@ -460,7 +459,7 @@ function processObject (opts, cb) { return function (er, json) { json._npmVersion = npm.version json._nodeVersion = process.version if (opts.file) { - log.verbose(opts.file, "caching") + log.verbose("caching json", opts.file) cache[opts.file] = json // arbitrary var keys = Object.keys(cache) @@ -522,8 +521,9 @@ function testEngine (json) { } if (json.engines.node === "") json.engines.node = "*" if (json.engines.node && null === semver.validRange(json.engines.node)) { - log.warn( json.engines.node - , "Invalid range in engines.node. Please see `npm help json`" ) + log.warn( json._id + , "Invalid range in engines.node. Please see `npm help json`" + , json.engines.node ) } if (nodeVer) { diff --git a/lib/utils/sha.js b/lib/utils/sha.js index 17b8c38f9..d3cd83a93 100644 --- a/lib/utils/sha.js +++ b/lib/utils/sha.js @@ -1,7 +1,7 @@ var fs = require("graceful-fs") , crypto = require("crypto") - , log = require("./log.js") + , log = require("npmlog") , binding try { binding = process.binding("crypto") } @@ -12,11 +12,14 @@ exports.get = get function check (file, sum, cb) { if (!binding) { - log.warn("crypto binding not found. Cannot verify shasum.", "shasum") + log.warn("shasum", "crypto binding not found. Cannot verify shasum.") return cb() } get(file, function (er, actual) { - if (er) return log.er(cb, "Error getting shasum")(er) + if (er) { + log.error("shasum", "error getting shasum") + return cb(er) + } var expected = sum.toLowerCase().trim() , ok = actual === expected cb(ok ? null : new Error( @@ -28,7 +31,7 @@ function check (file, sum, cb) { function get (file, cb) { if (!binding) { - log.warn("crypto binding not found. Cannot verify shasum.", "shasum") + log.warn("shasum", "crypto binding not found. Cannot verify shasum.") return cb() } var h = crypto.createHash("sha1") @@ -36,16 +39,16 @@ function get (file, cb) { , errState = null s.on("error", function (er) { if (errState) return - log.silly(er.stack || er.message, "sha error") + log.silly("shasum", "error", er) return cb(errState = er) }).on("data", function (chunk) { if (errState) return - log.silly(chunk.length, "updated sha bytes") + log.silly("shasum", "updated bytes", chunk.length) h.update(chunk) }).on("end", function () { if (errState) return var actual = h.digest("hex").toLowerCase().trim() - log(actual+"\n"+file, "shasum") + log.info("shasum", actual+"\n"+file) cb(null, actual) }) } diff --git a/lib/utils/tar.js b/lib/utils/tar.js index 76ef6ea92..22a4a852c 100644 --- a/lib/utils/tar.js +++ b/lib/utils/tar.js @@ -4,7 +4,7 @@ var npm = require("../npm.js") , fs = require("graceful-fs") , path = require("path") - , log = require("./log.js") + , log = require("npmlog") , uidNumber = require("uid-number") , rm = require("rimraf") , readJson = require("./read-json.js") @@ -27,11 +27,11 @@ exports.pack = pack exports.unpack = unpack function pack (targetTarball, folder, pkg, dfc, cb) { - log.verbose([targetTarball, folder], "tar.pack") + log.verbose("tar pack", [targetTarball, folder]) if (typeof cb !== "function") cb = dfc, dfc = false - log.verbose(targetTarball, "tarball") - log.verbose(folder, "folder") + log.verbose("tarball", targetTarball) + log.verbose("folder", folder) if (dfc) { // do fancy crap @@ -46,7 +46,10 @@ function pack (targetTarball, folder, pkg, dfc, cb) { function pack_ (targetTarball, folder, pkg, cb) { new Packer({ path: folder, type: "Directory", isDirectory: true }) - .on("error", log.er(cb, "error reading "+folder)) + .on("error", function (er) { + if (er) log.error("tar pack", "Error reading " + folder) + return cb(er) + }) // By default, npm includes some proprietary attributes in the // package tarball. This is sane, and allowed by the spec. @@ -54,19 +57,26 @@ function pack_ (targetTarball, folder, pkg, cb) { // so that it can be more easily bootstrapped using old and // non-compliant tar implementations. .pipe(tar.Pack({ noProprietary: !npm.config.get("proprietary-attribs") })) - .on("error", log.er(cb, "tar creation error "+targetTarball)) + .on("error", function (er) { + if (er) log.error("tar.pack", "tar creation error", targetTarball) + cb(er) + }) .pipe(zlib.Gzip()) - .on("error", log.er(cb, "gzip error "+targetTarball)) + .on("error", function (er) { + if (er) log.error("tar.pack", "gzip error "+targetTarball) + cb(er) + }) .pipe(fstream.Writer({ type: "File", path: targetTarball })) - .on("error", log.er(cb, "Could not write "+targetTarball)) - .on("close", function () { - cb() + .on("error", function (er) { + if (er) log.error("tar.pack", "Could not write "+targetTarball) + cb(er) }) + .on("close", cb) } function unpack (tarball, unpackTarget, dMode, fMode, uid, gid, cb) { - log.verbose(tarball, "unpack") + log.verbose("tar unpack", tarball) if (typeof cb !== "function") cb = gid, gid = null if (typeof cb !== "function") cb = uid, uid = null if (typeof cb !== "function") cb = fMode, fMode = npm.modes.file @@ -101,7 +111,7 @@ function unpack_ ( tarball, unpackTarget, dMode, fMode, uid, gid, cb ) { function gunzTarPerm (tarball, target, dMode, fMode, uid, gid, cb_) { if (!dMode) dMode = npm.modes.exec if (!fMode) fMode = npm.modes.file - log.silly([dMode.toString(8), fMode.toString(8)], "gunzTarPerm modes") + log.silly("gunzTarPerm", "modes", [dMode.toString(8), fMode.toString(8)]) var cbCalled = false function cb (er) { @@ -120,7 +130,7 @@ function gunzTarPerm (tarball, target, dMode, fMode, uid, gid, cb_) { } function extractEntry (entry) { - log.silly(entry.path, "extracting entry") + log.silly("gunzTarPerm", "extractEntry", entry.path) // never create things that are user-unreadable, // or dirs that are user-un-listable. Only leads to headaches. var originalMode = entry.mode = entry.mode || entry.props.mode @@ -128,7 +138,8 @@ function gunzTarPerm (tarball, target, dMode, fMode, uid, gid, cb_) { entry.mode = entry.mode & (~npm.modes.umask) entry.props.mode = entry.mode if (originalMode !== entry.mode) { - log.silly([entry.path, originalMode, entry.mode], "modified mode") + log.silly( "gunzTarPerm", "modified mode" + , [entry.path, originalMode, entry.mode]) } // if there's a specific owner uid/gid that we want, then set that @@ -152,16 +163,19 @@ function gunzTarPerm (tarball, target, dMode, fMode, uid, gid, cb_) { extractOpts.filter = function () { // symbolic links are not allowed in packages. if (this.type.match(/^.*Link$/)) { - log.warn( this.path.substr(target.length + 1) - + ' -> ' + this.linkpath - , "excluding symbolic link") + log.warn( "excluding symbolic link" + , this.path.substr(target.length + 1) + + ' -> ' + this.linkpath ) return false } return true } - fst.on("error", log.er(cb, "error reading "+tarball)) + fst.on("error", function (er) { + if (er) log.error("tar.unpack", "error reading "+tarball) + cb(er) + }) fst.on("data", function OD (c) { // detect what it is. // Then, depending on that, we'll figure out whether it's @@ -172,17 +186,26 @@ function gunzTarPerm (tarball, target, dMode, fMode, uid, gid, cb_) { c[2] === 0x08) { fst .pipe(zlib.Unzip()) - .on("error", log.er(cb, "unzip error "+tarball)) + .on("error", function (er) { + if (er) log.error("tar.unpack", "unzip error "+tarball) + cb(er) + }) .pipe(tar.Extract(extractOpts)) .on("entry", extractEntry) - .on("error", log.er(cb, "untar error "+tarball)) + .on("error", function (er) { + if (er) log.error("tar.unpack", "untar error "+tarball) + cb(er) + }) .on("close", cb) } else if (c.toString().match(/^package\//)) { // naked tar fst .pipe(tar.Extract(extractOpts)) .on("entry", extractEntry) - .on("error", log.er(cb, "untar error "+tarball)) + .on("error", function (er) { + if (er) log.error("tar.unpack", "untar error "+tarball) + cb(er) + }) .on("close", cb) } else { // naked js file @@ -197,12 +220,15 @@ function gunzTarPerm (tarball, target, dMode, fMode, uid, gid, cb_) { fst .pipe(fstream.Writer(jsOpts)) - .on("error", log.er(cb, "copy error "+tarball)) + .on("error", function (er) { + if (er) log.error("tar.unpack", "copy error "+tarball) + cb(er) + }) .on("close", function () { var j = path.resolve(target, "package.json") readJson(j, function (er, d) { if (er) { - log.error(tarball, "Not a package") + log.error("not a package", tarball) return cb(er) } fs.writeFile(j, JSON.stringify(d) + "\n", cb) diff --git a/lib/version.js b/lib/version.js index febb56d73..35329760e 100644 --- a/lib/version.js +++ b/lib/version.js @@ -8,7 +8,7 @@ var exec = require("./utils/exec.js") , path = require("path") , fs = require("graceful-fs") , chain = require("slide").chain - , log = require("./utils/log.js") + , log = require("npmlog") , npm = require("./npm.js") version.usage = "npm version <newversion> [--message commit-message]" @@ -22,7 +22,10 @@ version.usage = "npm version <newversion> [--message commit-message]" function version (args, cb) { if (args.length !== 1) return cb(version.usage) readJson(path.join(process.cwd(), "package.json"), function (er, data) { - if (er) return log.er(cb, "No package.json found")(er) + if (er) { + log.error("version", "No package.json found") + return cb(er) + } var newVer = semver.valid(args[0]) if (!newVer) newVer = semver.inc(data.version, args[0]) if (!newVer) return cb(version.usage) diff --git a/lib/view.js b/lib/view.js index 33a5d0df8..646b6377f 100644 --- a/lib/view.js +++ b/lib/view.js @@ -41,7 +41,7 @@ view.completion = function (opts, cb) { var registry = require("./utils/npm-registry-client/index.js") , ini = require("ini") - , log = require("./utils/log.js") + , log = require("npmlog") , util = require("util") , output , npm = require("./npm.js") @@ -94,7 +94,7 @@ function view (args, silent, cb) { if (args.length === 1 && args[0] === "") { retval = cleanBlanks(retval) - log.silly(retval, "cleanup") + log.silly("cleanup", retval) } if (error || silent) cb(error, retval) diff --git a/lib/whoami.js b/lib/whoami.js index c48f04b1d..b6e495253 100644 --- a/lib/whoami.js +++ b/lib/whoami.js @@ -2,7 +2,6 @@ module.exports = whoami var npm = require("./npm.js") , output = require("./utils/output.js") - , log = require("./utils/log.js") whoami.usage = "npm whoami\n(just prints the 'username' config)" diff --git a/lib/xmas.js b/lib/xmas.js index 90282d0f7..bf838a87a 100644 --- a/lib/xmas.js +++ b/lib/xmas.js @@ -1,9 +1,8 @@ // happy xmas var npm = require("./npm.js") - , log = require("./utils/log.js") + , log = require("npmlog") module.exports = function (args, cb) { -npm.config.set("loglevel", "win") var s = process.platform === "win32" ? " *" : " \u2605" , f = "\uFF0F" , b = "\uFF3C" @@ -44,7 +43,10 @@ w("\n") } })(20) w("\n\n") -log.win("Happy Xmas, Noders!", "loves you", cb) +log.heading = '' +log.addLevel('npm', 100000, log.headingStyle) +log.npm("loves you", "Happy Xmas, Noders!") +cb() } var dg=false Object.defineProperty(module.exports, "usage", {get:function () { |