]> git.ipfire.org Git - thirdparty/git.git/commitdiff
git-gui: use dashless 'git cmd' form for read/write
authorMark Levedahl <mlevedahl@gmail.com>
Sat, 5 Apr 2025 03:08:35 +0000 (23:08 -0400)
committerMark Levedahl <mlevedahl@gmail.com>
Mon, 21 Jul 2025 22:22:33 +0000 (18:22 -0400)
git-gui implements its own approach to locating and running various git
subcommands, bypassing git's capabilities for running git-*.  This was
written in 2007: at that time, many git commands were shell-scripts
stored in $(git --exec-path), git's run-command api was not well adapted
to Windows and had serious performance issues when it worked at all, and
running subcommand 'git foo' as 'git-foo' was common and fully supported.

On Windows, git-gui searches $(git --exec-path) for builtin commands,
then attempts to find an interpreter on PATH to run those, invoking
these differently than on other platforms. For instance, the explicit
shebang #!/usr/bin/perl found in a script will be run by the first Perl
interpreter found on $PATH, which might not be at that specific location
so could be different than what git would run.

The various issues leading to the current implemention no longer exist.
Most git commands are now builtins, links to run those are not installed
in $(git --exec-path) by default (the "dashless" form is recommended
instead), and git's run-command api works well everywhere.

So, let's use git to launch its subcommands on all platforms.  Do so by
modifying procs git_read and git_write to use the "dashless" form for
invoking git commands, avoiding the search for git-<foo>. This leaves
_git_cmd unused with cleanup in a later patch.

Signed-off-by: Mark Levedahl <mlevedahl@gmail.com>
git-gui.sh

index 89e1729d1a3a5e0f1d8243ea2bfb1f6c46df200f..8c60bdb8cd81d7e989dc29feb3f83d8d8901c73c 100755 (executable)
@@ -681,30 +681,30 @@ proc safe_open_command {cmd {redir {}}} {
 }
 
 proc git_read {cmd {redir {}}} {
-       set cmdp [_git_cmd [lindex $cmd 0]]
-       set cmd [lrange $cmd 1 end]
+       global _git
+       set cmdp [concat [list $_git] $cmd]
 
-       return [safe_open_command [concat $cmdp $cmd] $redir]
+       return [safe_open_command $cmdp $redir]
 }
 
 proc git_read_nice {cmd} {
+       global _git
        set opt [list]
 
        _lappend_nice opt
 
-       set cmdp [_git_cmd [lindex $cmd 0]]
-       set cmd [lrange $cmd 1 end]
+       set cmdp [concat [list $_git] $cmd]
 
-       return [safe_open_command [concat $opt $cmdp $cmd]]
+       return [safe_open_command [concat $opt $cmdp]]
 }
 
 proc git_write {cmd} {
+       global _git
        set cmd [make_arglist_safe $cmd]
-       set cmdp [_git_cmd [lindex $cmd 0]]
-       set cmd [lrange $cmd 1 end]
+       set cmdp [concat [list $_git] $cmd]
 
-       _trace_exec [concat $cmdp $cmd]
-       return [open [concat [list | ] $cmdp $cmd] w]
+       _trace_exec $cmdp
+       return [open [concat [list | ] $cmdp] w]
 }
 
 proc githook_read {hook_name args} {