1- # Requires AutoHotkey v2.0
2-
3- ; This script is an integration test for the following scenario:
4- ; A Git hook spawns a background process that outputs some text
5- ; to the console even after Git has exited.
6-
7- ; At some point in time, the Cygwin/MSYS2 runtime left the console
8- ; in a state where it was not possible to navigate the history via
9- ; CursorUp/Down, as reported in https://github.com/microsoft/git/issues/730.
10- ; This was fixed in the Cygwin/MSYS2 runtime, but then regressed again.
11- ; This test is meant to verify that the issue is fixed and remains so.
12-
13- ; First, set the worktree path; This path will be reused
14- ; for the `.log` file).
15- if A_Args.Length > 0
16- workTree := A_Args[1 ]
17- else
18- {
19- ; Create a unique worktree path in the TEMP directory.
20- workTree := EnvGet ('TEMP') . '\git- test- background - hook'
21- if FileExist (workTree)
22- {
23- counter := 0
24- while FileExist (workTree '- ' counter)
25- counter++
26- workTree := workTree '- ' counter
27- }
28- }
29-
30- Info (text ) {
31- FileAppend text '`n', workTree '.log'
32- }
33-
34- closeWindow := false
35- childPid := 0
36- ExitWithError (error ) {
37- Info 'Error : ' error
38- if closeWindow
39- WinClose " A"
40- else if childPid ! = 0
41- ProcessClose childPid
42- ExitApp 1
43- }
44-
45- RunWaitOne (command ) {
46- shell := ComObject(" WScript.Shell" )
47- ; Execute a single command via cmd.exe
48- exec := shell.Exec(A_ComSpec " /C " command)
49- ; Read and return the command's output
50- return exec.StdOut.ReadAll()
51- }
52-
53- SetWorkingDir (EnvGet ('TEMP'))
54- Info 'uname: ' RunWaitOne('uname - a')
55- Info RunWaitOne('git version -- build- options')
56-
57- RunWait ('git init " ' workTree '" ', '', 'Hide ')
58- if A_LastError
59- ExitWithError 'Could not initialize Git worktree at: ' workTree
60-
61- SetWorkingDir (workTree)
62- if A_LastError
63- ExitWithError 'Could not set working directory to: ' workTree
64-
65- if not FileExist ('.git/ hooks') and not DirCreate('.git/ hooks')
66- ExitWithError 'Could not create hooks directory: ' workTree
67-
68- FileAppend ("#!/bin/sh`npowershell -command 'for ($i = 0; $i -lt 50; $i++ ) { echo $i; sleep -milliseconds 10 }' &`n", '.git/hooks/pre-commit')
69- if A_LastError
70- ExitWithError 'Could not create pre- commit hook: ' A_LastError
71-
72- Run 'wt.exe - d . ' A_ComSpec ' / d', , , & childPid
73- if A_LastError
74- ExitWithError 'Error launching CMD: ' A_LastError
75- Info 'Launched CMD: ' childPid
76- if not WinWait (A_ComSpec, , 9 )
77- ExitWithError 'CMD window did not appear'
78- Info 'Got window'
79- WinActivate
80- CloseWindow := true
81- WinMove 0 , 0
82- Info 'Moved window to top left (so that the bottom is not cut off )'
83-
84- CaptureText () {
85- ControlGetPos & cx, & cy, & cw, & ch, 'Windows.UI.Composition.DesktopWindowContentBridge1', " A"
86- titleBarHeight := 54
87- scrollBarWidth := 28
88- pad := 8
89-
90- SavedClipboard := ClipboardAll
91- A_Clipboard := ''
92- SendMode ('Event')
93- MouseMove cx + pad, cy + titleBarHeight + pad
94- MouseClickDrag 'Left ', , , cx + cw - scrollBarWidth, cy + ch - pad, , ''
95- MouseClick 'Right '
96- ClipWait ()
97- Result := A_Clipboard
98- Clipboard := SavedClipboard
99- return Result
100- }
101-
102- Info('Setting committer identity')
103- Send ('git config user.
name Test{
Enter }git config user.email
[email protected] {
Enter }')
104-
105- Info('Committing')
106- Send ('git commit -- allow- empty - m zOMG{Enter }')
107- ; Wait for the hook to finish printing
108- While not RegExMatch (CaptureText(), '`n49$')
109- {
110- Sleep 100
111- if A_Index > 1000
112- ExitWithError 'Timed out waiting for commit to finish'
113- MouseClick 'WheelDown ', , , 20
114- }
115- Info('Hook finished')
116-
117- ; Verify that CursorUp shows the previous command
118- Send ('{Up }')
119- Sleep 150
120- Text := CaptureText()
121- if not RegExMatch (Text , 'git commit -- allow- empty - m zOMG * $')
122- ExitWithError 'Cursor Up did not work: ' Text
123- Info('Match! ')
124-
125- Send ('^ C')
126- Send ('exit{Enter }')
127- Sleep 50
128- SetWorkingDir (EnvGet ('TEMP'))
1+ # Requires AutoHotkey v2.0
2+
3+ ; This script is an integration test for the following scenario:
4+ ; A Git hook spawns a background process that outputs some text
5+ ; to the console even after Git has exited.
6+
7+ ; At some point in time, the Cygwin/MSYS2 runtime left the console
8+ ; in a state where it was not possible to navigate the history via
9+ ; CursorUp/Down, as reported in https://github.com/microsoft/git/issues/730.
10+ ; This was fixed in the Cygwin/MSYS2 runtime, but then regressed again.
11+ ; This test is meant to verify that the issue is fixed and remains so.
12+
13+ ; First, set the worktree path; This path will be reused
14+ ; for the `.log` file).
15+ if A_Args.Length > 0
16+ workTree := A_Args[1 ]
17+ else
18+ {
19+ ; Create a unique worktree path in the TEMP directory.
20+ workTree := EnvGet ('TEMP') . '\git- test- background - hook'
21+ if FileExist (workTree)
22+ {
23+ counter := 0
24+ while FileExist (workTree '- ' counter)
25+ counter++
26+ workTree := workTree '- ' counter
27+ }
28+ }
29+
30+ Info (text ) {
31+ FileAppend text '`n', workTree '.log'
32+ }
33+
34+ closeWindow := false
35+ childPid := 0
36+ ExitWithError (error ) {
37+ Info 'Error : ' error
38+ if closeWindow
39+ WinClose " A"
40+ else if childPid ! = 0
41+ ProcessClose childPid
42+ ExitApp 1
43+ }
44+
45+ RunWaitOne (command ) {
46+ shell := ComObject(" WScript.Shell" )
47+ ; Execute a single command via cmd.exe
48+ exec := shell.Exec(A_ComSpec " /C " command)
49+ ; Read and return the command's output
50+ return exec.StdOut.ReadAll()
51+ }
52+
53+ SetWorkingDir (EnvGet ('TEMP'))
54+ Info 'uname: ' RunWaitOne('uname - a')
55+ Info RunWaitOne('git version -- build- options')
56+
57+ RunWait ('git init " ' workTree '" ', '', 'Hide ')
58+ if A_LastError
59+ ExitWithError 'Could not initialize Git worktree at: ' workTree
60+
61+ SetWorkingDir (workTree)
62+ if A_LastError
63+ ExitWithError 'Could not set working directory to: ' workTree
64+
65+ if not FileExist ('.git/ hooks') and not DirCreate('.git/ hooks')
66+ ExitWithError 'Could not create hooks directory: ' workTree
67+
68+ FileAppend ("#!/bin/sh`npowershell -command 'for ($i = 0; $i -lt 50; $i++ ) { echo $i; sleep -milliseconds 10 }' &`n", '.git/hooks/pre-commit')
69+ if A_LastError
70+ ExitWithError 'Could not create pre- commit hook: ' A_LastError
71+
72+ Run 'wt.exe - d . ' A_ComSpec ' / d', , , & childPid
73+ if A_LastError
74+ ExitWithError 'Error launching CMD: ' A_LastError
75+ Info 'Launched CMD: ' childPid
76+ if not WinWait (A_ComSpec, , 9 )
77+ ExitWithError 'CMD window did not appear'
78+ Info 'Got window'
79+ WinActivate
80+ CloseWindow := true
81+ WinMove 0 , 0
82+ Info 'Moved window to top left (so that the bottom is not cut off )'
83+
84+ CaptureText () {
85+ ControlGetPos & cx, & cy, & cw, & ch, 'Windows.UI.Composition.DesktopWindowContentBridge1', " A"
86+ titleBarHeight := 54
87+ scrollBarWidth := 28
88+ pad := 8
89+
90+ SavedClipboard := ClipboardAll
91+ A_Clipboard := ''
92+ SendMode ('Event')
93+ MouseMove cx + pad, cy + titleBarHeight + pad
94+ MouseClickDrag 'Left ', , , cx + cw - scrollBarWidth, cy + ch - pad, , ''
95+ MouseClick 'Right '
96+ ClipWait ()
97+ Result := A_Clipboard
98+ Clipboard := SavedClipboard
99+ return Result
100+ }
101+
102+ Info('Setting committer identity')
103+ Send ('git config user.
name Test{
Enter }git config user.email
[email protected] {
Enter }')
104+
105+ Info('Committing')
106+ Send ('git commit -- allow- empty - m zOMG{Enter }')
107+ ; Wait for the hook to finish printing
108+ While not RegExMatch (CaptureText(), '`n49$')
109+ {
110+ Sleep 100
111+ if A_Index > 1000
112+ ExitWithError 'Timed out waiting for commit to finish'
113+ MouseClick 'WheelDown ', , , 20
114+ }
115+ Info('Hook finished')
116+
117+ ; Verify that CursorUp shows the previous command
118+ Send ('{Up }')
119+ Sleep 150
120+ Text := CaptureText()
121+ if not RegExMatch (Text , 'git commit -- allow- empty - m zOMG * $')
122+ ExitWithError 'Cursor Up did not work: ' Text
123+ Info('Match! ')
124+
125+ Send ('^ C')
126+ Send ('exit{Enter }')
127+ Sleep 50
128+ SetWorkingDir (EnvGet ('TEMP'))
129129DirDelete(workTree, true )
0 commit comments