--- /dev/null
+var cat = require("graceful-fs").writeFileSync
+var exec = require("child_process").exec
+var readdir = require("graceful-fs").readdirSync
+var resolve = require("path").resolve
+
+var mkdirp = require("mkdirp")
+var rimraf = require("rimraf")
+var test = require("tap").test
+var tmpdir = require("osenv").tmpdir
+var which = require("which")
+
+var common = require("../common-tap.js")
+
+var pkg = resolve(__dirname, "git-npmignore")
+var dep = resolve(pkg, "deps", "gitch")
+var packname = "gitch-1.0.0.tgz"
+var packed = resolve(pkg, packname)
+var modules = resolve(pkg, "node_modules")
+var installed = resolve(modules, "gitch")
+var expected = [
+ "a.js",
+ "package.json",
+ ".npmignore"
+].sort()
+
+var EXEC_OPTS = {
+ cwd : pkg
+}
+
+var gitignore = "node_modules/\n"
+var npmignore = "t.js\n"
+
+var a = "console.log('hi');"
+var t = "require('tap').test(function (t) { t.pass('I am a test!'); t.end(); });"
+var fixture = {
+ "name" : "gitch",
+ "version" : "1.0.0",
+ "private" : true,
+ "main" : "a.js"
+}
+
+
+test("setup", function (t) {
+ setup(function (er) {
+ t.ifError(er, "setup ran OK")
+
+ t.end()
+ })
+})
+
+test("npm pack directly from directory", function (t) {
+ packInstallTest(dep, t)
+})
+
+test("npm pack via git", function (t) {
+ packInstallTest("git+file://"+dep, t)
+})
+
+test("cleanup", function (t) {
+ cleanup()
+
+ t.end()
+})
+
+function packInstallTest (spec, t) {
+ common.npm(
+ [
+ "--loglevel", "silent",
+ "pack", spec
+ ],
+ EXEC_OPTS,
+ function (err, code, stdout, stderr) {
+ t.ifError(err, "npm pack ran without error")
+ t.notOk(code, "npm pack exited cleanly")
+ t.notOk(stderr, "npm pack ran silently")
+ t.equal(stdout.trim(), packname, "got expected package name")
+
+ common.npm(
+ [
+ "--loglevel", "silent",
+ "install", packed
+ ],
+ EXEC_OPTS,
+ function (err, code, stdout, stderr) {
+ t.ifError(err, "npm install ran without error")
+ t.notOk(code, "npm install exited cleanly")
+ t.notOk(stderr, "npm install ran silently")
+
+ var actual = readdir(installed).sort()
+ t.same(actual, expected, "no unexpected files in packed directory")
+
+ rimraf(packed, function () {
+ t.end()
+ })
+ }
+ )
+ }
+ )
+}
+
+function cleanup () {
+ process.chdir(tmpdir())
+ rimraf.sync(pkg)
+}
+
+function setup (cb) {
+ cleanup()
+
+ mkdirp.sync(modules)
+ mkdirp.sync(dep)
+
+ process.chdir(dep)
+
+ cat(resolve(dep, ".npmignore"), npmignore)
+ cat(resolve(dep, ".gitignore"), gitignore)
+ cat(resolve(dep, "a.js"), a)
+ cat(resolve(dep, "t.js"), t)
+ cat(resolve(dep, "package.json"), JSON.stringify(fixture))
+
+ common.npm(
+ [
+ "--loglevel", "silent",
+ "cache", "clean"
+ ],
+ EXEC_OPTS,
+ function (er, code, _, stderr) {
+ if (er) return cb(er)
+ if (code) return cb(new Error("npm cache nonzero exit: "+code))
+ if (stderr) return cb(new Error("npm cache clean error: "+stderr))
+
+ which("git", function found (er, git) {
+ if (er) return cb(er)
+
+ exec(git+" init", init)
+
+ function init (er, _, stderr) {
+ if (er) return cb(er)
+ if (stderr) return cb(new Error("git init error: "+stderr))
+
+ exec(git+" config user.name 'Phantom Faker'", user)
+ }
+
+ function user (er, _, stderr) {
+ if (er) return cb(er)
+ if (stderr) return cb(new Error("git config error: "+stderr))
+
+ exec(git+" config user.email nope@not.real", email)
+ }
+
+ function email (er, _, stderr) {
+ if (er) return cb(er)
+ if (stderr) return cb(new Error("git config error: "+stderr))
+
+ exec(git+" add .", addAll)
+ }
+
+ function addAll (er, _, stderr) {
+ if (er) return cb(er)
+ if (stderr) return cb(new Error("git add . error: "+stderr))
+
+ exec(git+" commit -m boot", commit)
+ }
+
+ function commit (er, _, stderr) {
+ if (er) return cb(er)
+ if (stderr) return cb(new Error("git commit error: "+stderr))
+
+ cb()
+ }
+ })
+ }
+ )
+}