]> git.ipfire.org Git - thirdparty/git.git/commitdiff
git-gui: make _shellpath usable on startup
authorMark Levedahl <mlevedahl@gmail.com>
Tue, 1 Apr 2025 15:45:06 +0000 (11:45 -0400)
committerTaylor Blau <me@ttaylorr.com>
Fri, 23 May 2025 21:04:23 +0000 (17:04 -0400)
Since commit d5257fb3c1de (git-gui: handle textconv filter on
Windows and in development, 2010-08-07), git-gui will search for a
usable shell if _shellpath is not configured, and on Windows may
resort to using auto_execok to find 'sh'. While this was intended for
development use, checks are insufficient to assure a proper
configuration when deployed where _shellpath is always set, but might
not give a usable shell.

Let's make this more robust by only searching if _shellpath was not
defined, and then using only our restricted search functions.
Furthermore, we should convert to a Windows path on Windows.  Always
check for a valid shell on startup, meaning an absolute path to an
executable, aborting if these conditions are not met.

Signed-off-by: Mark Levedahl <mlevedahl@gmail.com>
Signed-off-by: Johannes Sixt <j6t@kdbg.org>
Signed-off-by: Taylor Blau <me@ttaylorr.com>
git-gui.sh

index 3135116169f8ffdfe849731a578d6946840f79c1..d56610c8922fd85b716f2993299aa88fce8c3987 100755 (executable)
@@ -307,15 +307,37 @@ if {$_trace >= 0} {
 # branches).
 set _last_merged_branch {}
 
-proc shellpath {} {
-       global _shellpath env
-       if {[string match @@* $_shellpath]} {
-               if {[info exists env(SHELL)]} {
-                       return $env(SHELL)
-               } else {
-                       return /bin/sh
-               }
+# for testing, allow unconfigured _shellpath
+if {[string match @@* $_shellpath]} {
+       if {[info exists env(SHELL)]} {
+               set _shellpath $env(SHELL)
+       } else {
+               set _shellpath /bin/sh
        }
+}
+
+if {[is_Windows]} {
+       set _shellpath [exec cygpath -m $_shellpath]
+}
+
+if {![file executable $_shellpath] || \
+       !([file pathtype $_shellpath] eq {absolute})} {
+       set errmsg "The defined shell ('$_shellpath') is not usable, \
+               it must be an absolute path to an executable."
+       puts stderr $errmsg
+
+       catch {wm withdraw .}
+       tk_messageBox \
+               -icon error \
+               -type ok \
+               -title "git-gui: configuration error" \
+               -message $errmsg
+       exit 1
+}
+
+
+proc shellpath {} {
+       global _shellpath
        return $_shellpath
 }