@@ -3,7 +3,6 @@ var util = require('util');
3
3
var spawn = require ( 'child_process' ) . spawn ;
4
4
var fs = require ( 'fs' ) ;
5
5
var fsHelpers = require ( './fs-helpers' ) ;
6
- var exec = require ( 'child_process' ) . exec ;
7
6
8
7
var HOOKS_DIRNAME = 'hooks' ;
9
8
var HOOKS_OLD_DIRNAME = 'hooks.old' ;
@@ -26,19 +25,6 @@ var HOOKS = [
26
25
'update'
27
26
] ;
28
27
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
-
42
28
module . exports = {
43
29
/**
44
30
* Installs git hooks.
@@ -123,12 +109,22 @@ module.exports = {
123
109
124
110
if ( fsHelpers . exists ( hooksDirname ) ) {
125
111
var list = fs . readdirSync ( hooksDirname ) ;
126
- var hooks = list . map ( function ( hookName ) {
127
- return path . resolve ( hooksDirname , hookName ) ;
128
- } ) ;
129
- excludeIgnoredPaths ( hooks , function ( filteredHooks ) {
130
- runHooks ( filteredHooks , args , callback ) ;
131
- } ) ;
112
+ var hooks = list
113
+ . map ( function ( hookName ) {
114
+ return path . resolve ( hooksDirname , hookName ) ;
115
+ } )
116
+ . filter ( function ( hookPath ) {
117
+ var isFile = fs . lstatSync ( hookPath ) . isFile ( ) ;
118
+ var isExecutable = fs . lstatSync ( hookPath ) . isFile ( ) && fsHelpers . isExecutable ( hookPath ) ;
119
+
120
+ if ( isFile && ! isExecutable ) {
121
+ console . warn ( '[GIT-HOOKS WARNING] Non-executable file ' + hookPath + ' is skipped' ) ;
122
+ }
123
+
124
+ return isFile && isExecutable ;
125
+ } ) ;
126
+
127
+ runHooks ( hooks , args , callback ) ;
132
128
} else {
133
129
callback ( 0 ) ;
134
130
}
@@ -162,16 +158,6 @@ function runHooks(hooks, args, callback) {
162
158
}
163
159
}
164
160
165
- /**
166
- * @param {fs.Stats } stats
167
- * @returns {Boolean }
168
- */
169
- function isExecutable ( stats ) {
170
- return ( stats . mode & 1 ) ||
171
- ( stats . mode & 8 ) && process . getgid && stats . gid === process . getgid ( ) ||
172
- ( stats . mode & 64 ) && process . getuid && stats . uid === process . getuid ( ) ;
173
- }
174
-
175
161
/**
176
162
* Spawns hook as a separate process.
177
163
*
@@ -180,11 +166,6 @@ function isExecutable(stats) {
180
166
* @returns {ChildProcess }
181
167
*/
182
168
function spawnHook ( hookName , args ) {
183
- var stats = fs . statSync ( hookName ) ;
184
- var isHookExecutable = stats && stats . isFile ( ) && isExecutable ( stats ) ;
185
- if ( ! isHookExecutable ) {
186
- throw new Error ( 'Cannot execute hook: ' + hookName + '. Please check file permissions.' ) ;
187
- }
188
169
args = args || [ ] ;
189
170
return spawn ( hookName , args , { stdio : 'inherit' } ) ;
190
171
}
0 commit comments