@@ -3,6 +3,7 @@ var util = require('util');
33var spawn = require ( 'child_process' ) . spawn ;
44var fs = require ( 'fs' ) ;
55var fsHelpers = require ( './fs-helpers' ) ;
6+ var exec = require ( 'child_process' ) . exec ;
67
78var HOOKS_DIRNAME = 'hooks' ;
89var HOOKS_OLD_DIRNAME = 'hooks.old' ;
@@ -25,6 +26,19 @@ var HOOKS = [
2526 'update'
2627] ;
2728
29+ /**
30+ * @param {String[] } hooks List of hook's paths with possible excludes(.gitignore files)
31+ * @param {function } callback Filtered hooks will be passed in the callback
32+ */
33+ function excludeIgnoredPaths ( hooks , callback ) {
34+ exec ( 'git check-ignore ' + hooks . join ( ' ' ) , function ( error , output ) {
35+ // intentionally ignore errors
36+ callback ( hooks . filter ( function ( hookName ) {
37+ return output . indexOf ( hookName ) === - 1 ;
38+ } ) ) ;
39+ } ) ;
40+ }
41+
2842module . exports = {
2943 /**
3044 * Installs git hooks.
@@ -112,8 +126,9 @@ module.exports = {
112126 var hooks = list . map ( function ( hookName ) {
113127 return path . resolve ( hooksDirname , hookName ) ;
114128 } ) ;
115-
116- runHooks ( hooks , [ arg ] , callback ) ;
129+ excludeIgnoredPaths ( hooks , function ( filteredHooks ) {
130+ runHooks ( filteredHooks , [ arg ] , callback ) ;
131+ } ) ;
117132 } else {
118133 callback ( 0 ) ;
119134 }
@@ -133,14 +148,18 @@ function runHooks(hooks, args, callback) {
133148 return ;
134149 }
135150
136- var hook = spawnHook ( hooks . shift ( ) , args ) ;
137- hook . on ( 'close' , function ( code ) {
138- if ( code === 0 ) {
139- runHooks ( hooks , args , callback ) ;
140- } else {
141- callback ( code ) ;
142- }
143- } ) ;
151+ try {
152+ var hook = spawnHook ( hooks . shift ( ) , args ) ;
153+ hook . on ( 'close' , function ( code ) {
154+ if ( code === 0 ) {
155+ runHooks ( hooks , args , callback ) ;
156+ } else {
157+ callback ( code ) ;
158+ }
159+ } ) ;
160+ } catch ( e ) {
161+ callback ( 1 , e ) ;
162+ }
144163}
145164
146165/**
0 commit comments