var path = require('path') var proc = require('child_process') var mktemp = require('mktemp') var rimraf = require('rimraf') var fs = require('fs') var tape = require('tape') var tmpDirTemplate = path.join(require('os').tmpdir(), 'XXXXXXX') var tmpDirs = [] tape.onFinish(function () { tmpDirs.forEach(function (dir) { rimraf.sync(dir) }) }) function Git(cb) { var env = Object.create(process.env) env.PATH = path.join(__dirname, 'bin') + ':' + env.PATH var tmpDir = mktemp.createDirSync(tmpDirTemplate) tmpDirs.push(tmpDir) function git() { var args = [].slice.call(arguments) var doneCb = args.pop() return proc.spawn('git', args, { env: env, cwd: tmpDir, stdio: ['ignore', 'inherit', 'inherit'] }) .on('close', doneCb) } git('init', function (code) { if (code) return cb(new Error('git failed: ' + code)) git('config', 'user.name', 'name', function (code) { if (code) return cb(new Error('git failed: ' + code)) git('config', 'user.email', 'email', function (code) { if (code) return cb(new Error('git failed: ' + code)) cb(null, git) }) }) }) } tape('clone empty repo', function (t) { Git(function (err, git) { t.error(err, 'init') git('clone', '.', '1', function (code) { t.equals(code, 0, 'clone') t.end() }) }) }) tape('clone empty repo with airpaste', function (t) { t.plan(3) Git(function (err, git) { t.error(err, 'init') var ns = 'test-' + Math.random() git('airpaste', ns, function (code) { t.equals(code, 0, 'served') }) git('clone', 'airpaste://' + ns, '2', function (code) { t.equals(code, 0, 'cloned') }) }) }) tape('push', function (t) { t.plan(5) Git(function (err, git1) { t.error(err, 'init1') Git(function (err, git2) { t.error(err, 'init2') var ns = 'test-' + Math.random() git2('commit', '--allow-empty', '-m', 'first', function (code) { t.equals(code, 0, 'commit') git2('push', 'airpaste://' + ns, 'master', function (code) { // this fails for some reason but still woks // t.equals(code, 0, 'push') }) git1('airpaste', ns, function (code) { t.equals(code, 0, 'served') git1('log', '-1', function (code) { t.equals(code, 0, 'got the commit') }) }) }) }) }) })