Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/npm/cli.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJordan Harband <ljharb@gmail.com>2015-01-31 23:47:11 +0300
committerForrest L Norvell <forrest@npmjs.com>2015-02-13 07:07:58 +0300
commit6fd0fbd8a0347fd47cb7ee0064e0902a2f8a087c (patch)
tree697f9f2dbfb8f911a03fb6145ffbe6975623fc7f
parent3568764cd69277d708f0623a01fd0c46cc59792e (diff)
config: ensure etc dir exists before writing to it
When editing config, if the `globalconfig` directory doesn't exist, create it so that the editor doesn't explode when trying to edit a file in a nonexistent path.
-rw-r--r--lib/config/core.js11
-rw-r--r--test/common-tap.js2
-rw-r--r--test/tap/config-edit.js72
3 files changed, 82 insertions, 3 deletions
diff --git a/lib/config/core.js b/lib/config/core.js
index 59f7cf556..ddd851cf7 100644
--- a/lib/config/core.js
+++ b/lib/config/core.js
@@ -152,10 +152,17 @@ function load_(builtin, rc, cli, cb) {
// annoying humans and their expectations!
if (conf.get("prefix")) {
var etc = path.resolve(conf.get("prefix"), "etc")
- defaults.globalconfig = path.resolve(etc, "npmrc")
- defaults.globalignorefile = path.resolve(etc, "npmignore")
+ mkdirp(etc, function (err) {
+ defaults.globalconfig = path.resolve(etc, "npmrc")
+ defaults.globalignorefile = path.resolve(etc, "npmignore")
+ afterUserContinuation()
+ })
+ } else {
+ afterUserContinuation()
}
+ }
+ function afterUserContinuation() {
conf.addFile(conf.get("globalconfig"), "global")
// move the builtin into the conf stack now.
diff --git a/test/common-tap.js b/test/common-tap.js
index 7dcfc35cc..403670828 100644
--- a/test/common-tap.js
+++ b/test/common-tap.js
@@ -18,7 +18,7 @@ exports.npm = function (cmd, opts, cb) {
cmd = [bin].concat(cmd)
opts = opts || {}
- opts.env = opts.env ? opts.env : process.env
+ opts.env = opts.env || process.env
if (!opts.env.npm_config_cache) {
opts.env.npm_config_cache = npm_config_cache
}
diff --git a/test/tap/config-edit.js b/test/tap/config-edit.js
new file mode 100644
index 000000000..97a54d2ec
--- /dev/null
+++ b/test/tap/config-edit.js
@@ -0,0 +1,72 @@
+var fs = require("fs")
+var path = require("path")
+
+var mkdirp = require("mkdirp")
+var rimraf = require("rimraf")
+var test = require("tap").test
+var common = require("../common-tap.js")
+
+var pkg = path.resolve(__dirname, "npm-global-edit")
+
+var editorSrc = function () {/*
+#!/usr/bin/env node
+var fs = require("fs")
+if (fs.existsSync(process.argv[2])) {
+ console.log("success")
+} else {
+ console.log("error")
+ process.exit(1)
+}
+*/}.toString().split("\n").slice(1, -1).join("\n")
+var editorPath = path.join(pkg, "editor")
+
+test("setup", function (t) {
+ cleanup(function (er) {
+ t.ifError(er, "old directory removed")
+
+ mkdirp(pkg, "0777", function (er) {
+ fs.writeFileSync(editorPath, editorSrc)
+ fs.chmodSync(editorPath, "0777")
+ t.ifError(er, "created package directory correctly")
+ t.end()
+ })
+ })
+})
+
+test("saving configs", function (t) {
+ var opts = {
+ cwd: pkg,
+ env: {
+ PATH: process.env.PATH,
+ EDITOR: editorPath
+ }
+ }
+ common.npm(
+ [
+ "config",
+ "--prefix", pkg,
+ "--global",
+ "edit"
+ ],
+ opts,
+ function (err, code, stdout, stderr) {
+ t.ifError(err, "command ran without issue")
+
+ t.equal(stderr, "", "got nothing on stderr")
+ t.equal(code, 0, "exit ok")
+ t.equal(stdout, "success\n", "got success message")
+ t.end()
+ }
+ )
+})
+
+test("cleanup", function (t) {
+ cleanup(function (er) {
+ t.ifError(er, "test directory removed OK")
+ t.end()
+ })
+})
+
+function cleanup (cb) {
+ rimraf(pkg, cb)
+}