| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283 |
- var exec = require('sync-exec');
- var exit = 0;
- var glob = require("glob");
- var globOptions = {
- ignore: [
- 'bower_components/**/*',
- 'node_modules/**/*'
- ]
- };
- var pkg = require('../../package');
- // Change to \{{ hook }} once that variable is available.
- // @see https://github.com/wecodemore/grunt-githooks/pull/40
- var hooks = pkg.githooks && pkg.githooks['{{ task }}'];
- if (hooks) {
- var ret, hook, files, commands, staged, matchAll;
- var filesMatched = [];
- // Iterate over all hook definitions.
- for (var h in hooks) {
- hook = hooks[h];
- commands = hook.commands || [];
- staged = hook.staged === void 0 ? false : !!hook.staged;
- matchAll = hook.matchAll === void 0 ? true : !!hook.matchAll;
- // Iterate over all files in a hook definition.
- if (hook.files) {
- // Expand all file paths using glob (for pattern matching).
- if (typeof hook.files === 'string') {
- files = glob.sync(hook.files, globOptions) || [];
- }
- if (Array.isArray(hook.files)) {
- files = [];
- for (var f = 0; f < hook.files.length; f++) {
- files = [].concat(files, glob.sync(hook.files[f], globOptions) || []);
- }
- }
- // All files must either be staged or modified for the entire
- // hook definition command(s) to be executed.
- for (f in files) {
- var file = files[f];
- if (file) {
- // Only continue if file has been staged or modified.
- ret = exec((staged ? 'git diff --name-only --cached ' + file : 'git diff HEAD@{1} --stat -- ' + file));
- exit = ret.status;
- if (exit === 0 && ret.stdout !== '') {
- filesMatched.push(file);
- }
- else if (matchAll && (exit > 0 || ret.stdout === '')) {
- console.log(ret.stdout);
- filesMatched = [];
- break;
- }
- }
- }
- }
- // Iterate over all commands that should be executed for matched files.
- if (filesMatched.length) {
- if (typeof commands === 'string') {
- commands = [commands];
- }
- for (var c in commands) {
- var command = commands[c];
- console.log("\033[4;35mgit: {{ task }}\033[0;35m\n>> " + command + "\033[0m\n");
- ret = exec(command);
- console.log(ret.stdout);
- exit = ret.status;
- if (exit > 0) {
- break;
- }
- }
- }
- // Display any errors.
- if (exit > 0 && ret && ret.stderr) {
- console.log(ret.stderr);
- }
- }
- }
- process.exit(exit);
|