@@ -8,6 +8,7 @@ import { GIT_HOOKS, GITHOOKS_DIRNAME, GITHOOKS_UNDERSCORED_DIRNAME } from '../sr
88import { NotGitDirectoryError } from '../src/errors.ts' ;
99import { init } from '../src/init.ts' ;
1010import { git } from '../src/git.ts' ;
11+ import { GITHOOKS_SCRIPT_NAME } from '../src/constants.ts' ;
1112
1213Deno . test ( {
1314 name : 'run "init" in non-git directory' ,
@@ -193,6 +194,23 @@ Deno.test({
193194 } ,
194195} ) ;
195196
197+ async function expectCommonCommit ( ) {
198+ // write
199+ await Deno . writeTextFile ( 'main.ts' , 'console.log("hello")' ) ;
200+
201+ // add
202+ const { success } = await git ( Deno . cwd ( ) , 'add' , 'main.ts' ) . output ( ) ;
203+ expect ( success ) . toBe ( true ) ;
204+
205+ // commit
206+ return await git (
207+ Deno . cwd ( ) ,
208+ 'commit' ,
209+ '-m' ,
210+ 'test pre-commit hook' ,
211+ ) . output ( ) ;
212+ }
213+
196214Deno . test ( {
197215 name : 'git commit should trigger pre-commit hook' ,
198216 permissions : {
@@ -207,21 +225,75 @@ Deno.test({
207225 await expectCommonGitInit ( Deno . cwd ( ) , true ) ;
208226 await expectCommonInit ( Deno . cwd ( ) ) ;
209227
210- await Deno . writeTextFile ( 'main.ts' , 'console.log("hello")' ) ;
228+ const { success, stderr } = await expectCommonCommit ( ) ;
229+ expect ( new TextDecoder ( ) . decode ( stderr ) ) . toContain ( 'Checked 1 file' ) ;
230+ expect ( success ) . toBe ( true ) ;
231+ } finally {
232+ await sbox [ Symbol . asyncDispose ] ( ) ;
233+ }
234+ } ,
235+ } ) ;
236+
237+ Deno . test ( {
238+ name : 'GITHOOKS=0 should skip hook' ,
239+ permissions : {
240+ read : true ,
241+ write : true ,
242+ run : true ,
243+ env : true ,
244+ } ,
245+ async fn ( ) {
246+ await using sbox = await sandbox ( ) ;
247+
248+ try {
249+ await expectCommonGitInit ( Deno . cwd ( ) , true ) ;
250+ await expectCommonInit ( Deno . cwd ( ) ) ;
211251
212- // add
213- const { success } = await git ( Deno . cwd ( ) , 'add' , 'main.ts' ) . output ( ) ;
252+ Deno . env . set ( 'GITHOOKS' , '0' ) ;
253+ const { success, stderr } = await expectCommonCommit ( ) ;
254+ expect ( new TextDecoder ( ) . decode ( stderr ) ) . not . toContain ( 'Checked 1 file' ) ;
214255 expect ( success ) . toBe ( true ) ;
256+ } finally {
257+ await sbox [ Symbol . asyncDispose ] ( ) ;
258+ Deno . env . delete ( 'GITHOOKS' ) ;
259+ }
260+ } ,
261+ } ) ;
215262
216- // commit
217- const { success : commitSuccess , stderr } = await git (
218- Deno . cwd ( ) ,
219- 'commit' ,
220- '-m' ,
221- 'test pre-commit hook' ,
222- ) . output ( ) ;
223- expect ( new TextDecoder ( ) . decode ( stderr ) ) . toContain ( 'Checked 1 file' ) ;
224- expect ( commitSuccess ) . toBe ( true ) ;
263+ Deno . test ( {
264+ name : 'unset GITHOOKS_CURRENT_HOOK should warn user' ,
265+ permissions : {
266+ read : true ,
267+ write : true ,
268+ run : true ,
269+ env : true ,
270+ } ,
271+ async fn ( ) {
272+ await using sbox = await sandbox ( ) ;
273+
274+ try {
275+ await expectCommonGitInit ( Deno . cwd ( ) , true ) ;
276+ await expectCommonInit ( Deno . cwd ( ) ) ;
277+
278+ await Deno . writeTextFile ( 'main.ts' , 'console.log("hello")' ) ;
279+
280+ // overwrite pre-commit
281+ const script = `\
282+ #!/usr/bin/env sh
283+ . "$(dirname "$0")/${ GITHOOKS_SCRIPT_NAME } " $@
284+ ` ;
285+ await Deno . writeTextFile (
286+ path . join ( Deno . cwd ( ) , GITHOOKS_UNDERSCORED_DIRNAME , 'pre-commit' ) ,
287+ script ,
288+ ) ;
289+
290+ const { success, stderr } = await expectCommonCommit ( ) ;
291+ const err = new TextDecoder ( ) . decode ( stderr ) ;
292+ expect ( err ) . toContain ( 'Checked 1 file' ) ;
293+ expect ( err ) . toContain (
294+ 'unset GITHOOKS_CURRENT_HOOK. Hook may not function properly.' ,
295+ ) ;
296+ expect ( success ) . toBe ( true ) ;
225297 } finally {
226298 await sbox [ Symbol . asyncDispose ] ( ) ;
227299 }
0 commit comments