guppy-cli
Version:
Commandline functionality for git-guppy
79 lines (67 loc) • 1.71 kB
JavaScript
/* global chmod */
;
require('shelljs/global');
var fs = require('vinyl-fs');
var map = require('map-stream');
var async = require('async');
var path = require('path');
var hooks = [
'applypatch-msg',
'commit-msg',
'post-applypatch',
'post-checkout',
'post-commit',
'post-merge',
'post-receive',
'post-rewrite',
'post-update',
'pre-applypatch',
'pre-auto-gc',
'pre-commit',
'pre-push',
'pre-rebase',
'pre-receive',
'prepare-commit-msg',
'update'
];
function install(hook, dest, cb) {
cb = cb || dest;
if (!cb) cb(new Error('Callback must be supplied.'));
if (typeof cb !== 'function') cb(new Error('Callback must be a function.'));
if (hooks.indexOf(hook) === -1) cb(new Error('Invalid hook name.'));
dest = ((typeof dest === 'function' ? null : dest) ||
exec('git rev-parse --show-toplevel')
.output.slice(0, -1) + '/.git/hooks/');
var destHook = path.join(dest, hook);
if (test('-f', destHook)) {
var bakDest = destHook + '.guppy';
if (!test('-f', bakDest)) {
mv(destHook, bakDest);
}
}
return fs.src(path.join(__dirname, 'scripts/hookfile'))
.pipe(map(function(file, next) {
file.path = file.path.replace('hookfile', hook);
next(null, file);
}))
.pipe(fs.dest(dest))
.on('finish', function () {
chmod('u+x', destHook);
cb(null, destHook);
})
.on('error', function (err) {
cb(err);
});
}
function installAll(dest, cb) {
async.parallel(
hooks.map(function (hook) {
return function (next) {
return install(hook, dest, next);
};
}),
cb
);
}
module.exports.install = install;
module.exports.installAll = installAll;