git-gui: provide question helper for retry fallback on Windows

Make use of the new environment variable GIT_ASK_YESNO to support the recently implemented fallback in case unlink, rename or rmdir fail for files in use on Windows. The added dialog will present a yes/no question to the the user which will currently be used by the windows compat layer to let the user retry a failed file operation. Signed-off-by: Heiko Voigt <hvoigt@hvoigt.net> Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de> Signed-off-by: Johannes Sixt <j6t@kdbg.org>

Heiko Voigt committed Aug 28, 2025 at 08:58 UTC e749c87e75f925540d1bf362b754fc7adf342960
3 files changed +47
Makefile
+2
@@ -185,6 +185,7 @@ install: all
185 $(QUIET)$(INSTALL_D0)'$(DESTDIR_SQ)$(gitexecdir_SQ)' $(INSTALL_D1)
186 $(QUIET)$(INSTALL_X0)git-gui $(INSTALL_X1) '$(DESTDIR_SQ)$(gitexecdir_SQ)'
187 $(QUIET)$(INSTALL_X0)git-gui--askpass $(INSTALL_X1) '$(DESTDIR_SQ)$(gitexecdir_SQ)'
188 + $(QUIET)$(INSTALL_X0)git-gui--askyesno $(INSTALL_X1) '$(DESTDIR_SQ)$(gitexecdir_SQ)'
189 $(QUIET)$(foreach p,$(GITGUI_BUILT_INS), $(INSTALL_L0)'$(DESTDIR_SQ)$(gitexecdir_SQ)/$p' $(INSTALL_L1)'$(DESTDIR_SQ)$(gitexecdir_SQ)/git-gui' $(INSTALL_L2)'$(DESTDIR_SQ)$(gitexecdir_SQ)/$p' $(INSTALL_L3) &&) true
190 ifdef GITGUI_WINDOWS_WRAPPER
191 $(QUIET)$(INSTALL_R0)git-gui.tcl $(INSTALL_R1) '$(DESTDIR_SQ)$(gitexecdir_SQ)'
@@ -199,6 +200,7 @@ uninstall:
200 $(QUIET)$(CLEAN_DST) '$(DESTDIR_SQ)$(gitexecdir_SQ)'
201 $(QUIET)$(REMOVE_F0)'$(DESTDIR_SQ)$(gitexecdir_SQ)'/git-gui $(REMOVE_F1)
202 $(QUIET)$(REMOVE_F0)'$(DESTDIR_SQ)$(gitexecdir_SQ)'/git-gui--askpass $(REMOVE_F1)
203 + $(QUIET)$(REMOVE_F0)'$(DESTDIR_SQ)$(gitexecdir_SQ)'/git-gui--askyesno $(REMOVE_F1)
204 $(QUIET)$(foreach p,$(GITGUI_BUILT_INS), $(REMOVE_F0)'$(DESTDIR_SQ)$(gitexecdir_SQ)'/$p $(REMOVE_F1) &&) true
205 ifdef GITGUI_WINDOWS_WRAPPER
206 $(QUIET)$(REMOVE_F0)'$(DESTDIR_SQ)$(gitexecdir_SQ)'/git-gui.tcl $(REMOVE_F1)
git-gui--askyesno new
+42
@@ -0,0 +1,42 @@
1 +#!/bin/sh
2 +# Tcl ignores the next line -*- tcl -*- \
3 +exec wish "$0" -- "$@"
4 +
5 +# This is an implementation of a simple yes no dialog
6 +# which is injected into the git commandline by git gui
7 +# in case a yesno question needs to be answered.
8 +
9 +set NS {}
10 +set use_ttk [package vsatisfies [package provide Tk] 8.5]
11 +if {$use_ttk} {
12 + set NS ttk
13 +}
14 +
15 +if {$argc < 1} {
16 + puts stderr "Usage: $argv0 <question>"
17 + exit 1
18 +} else {
19 + set prompt [join $argv " "]
20 +}
21 +
22 +${NS}::frame .t
23 +${NS}::label .t.m -text $prompt -justify center -width 40
24 +.t.m configure -wraplength 400
25 +pack .t.m -side top -fill x -padx 20 -pady 20 -expand 1
26 +pack .t -side top -fill x -ipadx 20 -ipady 20 -expand 1
27 +
28 +${NS}::frame .b
29 +${NS}::frame .b.left -width 200
30 +${NS}::button .b.yes -text Yes -command {exit 0}
31 +${NS}::button .b.no -text No -command {exit 1}
32 +
33 +pack .b.left -side left -expand 1 -fill x
34 +pack .b.yes -side left -expand 1
35 +pack .b.no -side right -expand 1 -ipadx 5
36 +pack .b -side bottom -fill x -ipadx 20 -ipady 15
37 +
38 +bind . <Key-Return> {exit 0}
39 +bind . <Key-Escape> {exit 1}
40 +
41 +wm title . "Question?"
42 +tk::PlaceWindow .
git-gui.sh
+3
@@ -1130,6 +1130,9 @@ set argv0dir [file dirname [file normalize $::argv0]]
1130 if {![info exists env(SSH_ASKPASS)]} {
1131 set env(SSH_ASKPASS) [file join $argv0dir git-gui--askpass]
1132 }
1133 +if {![info exists env(GIT_ASK_YESNO)]} {
1134 + set env(GIT_ASK_YESNO) [file join $argv0dir git-gui--askyesno]
1135 +}
1136 unset argv0dir
1137
1138 ######################################################################