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
######################################################################