git-gui: cleanup git-bash menu item

git-gui on Git for Windows creates a menu item to start a git-bash session for the current repository. This menu-item works as desired when git-gui is installed in the Git for Windows (g4w) distribution, but not when run from a different location such as normally done in development. The reason is that git-bash's location is known to be '/git-bash' in the Unix pathname space known to MSYS, but this is not known in the Windows pathname space. Instead, git-gui derives a pathname for git-bash assuming it is at a known relative location. If git-gui is run from a different directory than assumed in g4w, the relative location changes, and git-gui resorts to running a generic bash login session in a Windows console. But, the MSYS system underlying Git for Windows includes the 'cygpath' utility to convert between Unix and Windows pathnames. Let's use this so git-bash's Windows pathname is determined directly from /git-bash. Signed-off-by: Mark Levedahl <mlevedahl@gmail.com> Signed-off-by: Johannes Sixt <j6t@kdbg.org> Signed-off-by: Taylor Blau <me@ttaylorr.com>

Mark Levedahl committed Apr 7, 2025 at 17:12 UTC 676c49583f063c6cb92e5b38eb6576929cebf1ff
1 file changed +6 -7
git-gui.sh
+6 -7
@@ -2759,17 +2759,16 @@ if {![is_bare]} {
2759
2760 if {[is_Windows]} {
2761 # Use /git-bash.exe if available
2762 - set normalized [file normalize $::argv0]
2763 - regsub "/mingw../libexec/git-core/git-gui$" \
2764 - $normalized "/git-bash.exe" cmdLine
2765 - if {$cmdLine != $normalized && [file exists $cmdLine]} {
2766 - set cmdLine [list "Git Bash" $cmdLine &]
2762 + set _git_bash [exec cygpath -m /git-bash.exe]
2763 + if {[file executable $_git_bash]} {
2764 + set _bash_cmdline [list "Git Bash" $_git_bash &]
2765 } else {
2768 - set cmdLine [list "Git Bash" bash --login -l &]
2766 + set _bash_cmdline [list "Git Bash" bash --login -l &]
2767 }
2768 .mbar.repository add command \
2769 -label [mc "Git Bash"] \
2772 - -command {eval exec [list [_which cmd] /c start] $cmdLine}
2770 + -command {eval exec [list [_which cmd] /c start] $_bash_cmdline}
2771 + unset _git_bash
2772 }
2773
2774 if {[is_Windows] || ![is_bare]} {