git-gui (Windows): use git-bash.exe if it is available
cover git-gui (Windows): use git-bash.exe if it is available
... and yet another patch that is carried in Git for Windows for quite a long time.
This commit was contributed as https://github.com/patthoyts/git/gui/pull/6
which was ignored for almost three years, and then as
https://github.com/prati0100/git-gui/pull/2 which was rejected in favor of a mailing list-centric workflow.
The patch is based on Git GUI's master branch at
https://github.com/prati0100/git-gui/.
Thomas Klaeger (1):
git-gui (Windows): use git-bash.exe if it is available
git-gui.sh | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-)
base-commit: 12d29c326551a6570594db525bea42ad9cea8028
Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-360%2Fdscho%2Fgit-gui-git-bash-v1
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-360/dscho/git-gui-git-bash-v1
Pull-Request: https://github.com/gitgitgadget/git/pull/360
Signature · 1 line
gitgitgadget
PATCH 1/1 git-gui (Windows): use git-bash.exe if it is available
From: Thomas Klaeger <[email protected]>
Git for Windows 2.x ships with an executable that starts the Git Bash with all the environment variables and what not properly set up. It is also adjusted according to the Terminal emulator option chosen when installing Git for Windows (while bash.exe --login -i would always launch with Windows' default console).
So let's use that executable (usually C:\Program Files\Git\git-bash.exe) instead of bash.exe --login -i if its presence was detected.
This fixes https://github.com/git-for-windows/git/issues/490
--- git-gui.sh | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-)
git-gui.sh +10 -2
@@ -2700,10 +2700,18 @@ if {![is_bare]} { } if {[is_Windows]} { + # Use /git-bash.exe if available + set normalized [file normalize $::argv0] + regsub "/mingw../libexec/git-core/git-gui$" \ + $normalized "/git-bash.exe" cmdLine + if {$cmdLine != $normalized && [file exists $cmdLine]} { + set cmdLine [list "Git Bash" $cmdLine &] + } else { + set cmdLine [list "Git Bash" bash --login -l &] + } .mbar.repository add command \ -label [mc "Git Bash"] \ - -command {eval exec [auto_execok start] \ - [list "Git Bash" bash --login -l &]} + -command {eval exec [auto_execok start] $cmdLine} } if {[is_Windows] || ![is_bare]} {
Signature · 1 line
gitgitgadget
Quoted 24 lines · Thomas Klaeger via GitGitGadget
From: Thomas Klaeger <[email protected]>
Git for Windows 2.x ships with an executable that starts the Git Bash with all the environment variables and what not properly set up. It is also adjusted according to the Terminal emulator option chosen when installing Git for Windows (while
bash.exe --login -iwould always launch with Windows' default console).So let's use that executable (usually C:\Program Files\Git\git-bash.exe) instead of
bash.exe --login -iif its presence was detected.This fixes https://github.com/git-for-windows/git/issues/490
Signed-off-by Thomas Kläger <[email protected]>Signed-off-by Johannes Schindelin <[email protected]>--- git-gui.sh | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-)git-gui.sh +0
-0
git-gui.sh if {![is_bare]} { · line 2700
Quoted 1 line
git-gui.sh +0
-0@@ -2700,10 +2700,18 @@ if {![is_bare]} { }
This hunk is kind of hard to understand. I'm writing what I make of it. Please correct me if I read it wrong.
Since this is a 4 year old commit not even authored by you, you might not have all the answers. That's OK. But I'd still like to point these things out. I do have a question at the end so please read the entire thing :)
git-gui.sh if {![is_bare]} { · line 2704
Quoted 3 lines
git-gui.sh +2
-0if {[is_Windows]} { + # Use /git-bash.exe if available + set normalized [file normalize $::argv0]
argv0 would be the location of git-gui. We get an absolute path for the git-gui executable in the variable normalized.
git-gui.sh if {![is_bare]} { · line 2706
Quoted 2 lines
git-gui.sh +2
-0+ regsub "/mingw../libexec/git-core/git-gui$" \ + $normalized "/git-bash.exe" cmdLine
This finds the install location of git-bash by doing a string substitution. I'm assuming the path before /mingw.. is the installation directory of git, and so that's where git-bash would reside. We put that directory in cmdLine.
Nitpick: most of the code here uses snake case. So s/cmdLine/cmd_line/
git-gui.sh if {![is_bare]} { · line 2707
Quoted 1 line
git-gui.sh +1
-0+ if {$cmdLine != $normalized && [file exists $cmdLine]} {
Why the $cmdLine != $normalized? When would they be equal? The string substitution should always change $cmdLine.
git-gui.sh if {![is_bare]} { · line 2717
Quoted 12 lines
git-gui.sh +5
-2+ set cmdLine [list "Git Bash" $cmdLine &] + } else { + set cmdLine [list "Git Bash" bash --login -l &] + } .mbar.repository add command \ -label [mc "Git Bash"] \ - -command {eval exec [auto_execok start] \ - [list "Git Bash" bash --login -l &]} + -command {eval exec [auto_execok start] $cmdLine} } if {[is_Windows] || ![is_bare]} {
The way of finding the path of git-bash is very hacky and would break as soon as there are any changes in the install locations. Plus, it is not at all easy to understand what's going on at first look.
Is there no better way of finding out git-bash's location? Is there something like the PATH environment variable in Windows that we can use to locate git-bash's executable? I have never developed in Windows so I have no idea how things work there.
On Linux for example, the exec() family of functions look into the PATH environment variable for the executable, so it is a pretty clean mechanism to execute programs.
Signature · 2 lines
Regards, Pratyush Yadav
Hi,
Quoted 50 lines · Pratyush Yadav
Quoted 24 lines · Thomas Klaeger via GitGitGadget
From: Thomas Klaeger <[email protected]>
Git for Windows 2.x ships with an executable that starts the Git Bash with all the environment variables and what not properly set up. It is also adjusted according to the Terminal emulator option chosen when installing Git for Windows (while
bash.exe --login -iwould always launch with Windows' default console).So let's use that executable (usually C:\Program Files\Git\git-bash.exe) instead of
bash.exe --login -iif its presence was detected.This fixes https://github.com/git-for-windows/git/issues/490
Signed-off-by Thomas Kläger <[email protected]>Signed-off-by Johannes Schindelin <[email protected]>--- git-gui.sh | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-)git-gui.sh +0
-0git-gui.sh if {![is_bare]} { · line 2700
Quoted 1 line
git-gui.sh +0
-0@@ -2700,10 +2700,18 @@ if {![is_bare]} { }This hunk is kind of hard to understand. I'm writing what I make of it. Please correct me if I read it wrong.
Since this is a 4 year old commit not even authored by you, you might not have all the answers. That's OK. But I'd still like to point these things out. I do have a question at the end so please read the entire thing :)
git-gui.sh if {![is_bare]} { · line 2704
Quoted 3 lines
git-gui.sh +2
-0if {[is_Windows]} { + # Use /git-bash.exe if available + set normalized [file normalize $::argv0]argv0 would be the location of git-gui. We get an absolute path for the git-gui executable in the variable normalized.
git-gui.sh if {![is_bare]} { · line 2706
Quoted 2 lines
git-gui.sh +2
-0+ regsub "/mingw../libexec/git-core/git-gui$" \ + $normalized "/git-bash.exe" cmdLineThis finds the install location of git-bash by doing a string substitution. I'm assuming the path before /mingw.. is the installation directory of git, and so that's where git-bash would reside. We put that directory in cmdLine.
Quoted 6 lines
Nitpick: most of the code here uses snake case. So s/cmdLine/cmd_line/
git-gui.sh if {![is_bare]} { · line 2707
Quoted 1 line
git-gui.sh +1
-0+ if {$cmdLine != $normalized && [file exists $cmdLine]} {Why the $cmdLine != $normalized? When would they be equal? The string substitution should always change $cmdLine.
Except when Git GUI is installed in an unexpected location. This check is purely defensive programming.
Quoted 18 lines
git-gui.sh if {![is_bare]} { · line 2717
Quoted 13 lines
git-gui.sh +5
-2+ set cmdLine [list "Git Bash" $cmdLine &] + } else { + set cmdLine [list "Git Bash" bash --login -l &] + } .mbar.repository add command \ -label [mc "Git Bash"] \ - -command {eval exec [auto_execok start] \ - [list "Git Bash" bash --login -l &]} + -command {eval exec [auto_execok start] $cmdLine} } if {[is_Windows] || ![is_bare]} {The way of finding the path of git-bash is very hacky and would break as soon as there are any changes in the install locations. Plus, it is not at all easy to understand what's going on at first look.
Quoted 8 lines
Is there no better way of finding out git-bash's location? Is there something like the PATH environment variable in Windows that we can use to locate git-bash's executable? I have never developed in Windows so I have no idea how things work there.
On Linux for example, the
exec()family of functions look into the PATH environment variable for the executable, so it is a pretty clean mechanism to execute programs.
That's not an option on Windows. git-bash.exe is not intended to be in the PATH, specifically not.
The implemented method is the best approach we found to determine the location of git-bash.exe.
Ciao,
Johannes
Am 30.09.19 um 12:27 schrieb Johannes Schindelin:
Quoted 8 lines · Pratyush Yadav
Quoted 4 lines
git-gui.sh if {![is_bare]} { · line 2707
Quoted 1 line
git-gui.sh +1
-0+ if {$cmdLine != $normalized && [file exists $cmdLine]} {Why the $cmdLine != $normalized? When would they be equal? The string substitution should always change $cmdLine.
Except when Git GUI is installed in an unexpected location. This check is purely defensive programming.
Thanks for being considerate. This case would occur in my setting.
-- Hannes
Quoted 91 lines · Johannes Schindelin
Hi,
Quoted 50 lines · Pratyush Yadav
Quoted 24 lines · Thomas Klaeger via GitGitGadget
From: Thomas Klaeger <[email protected]>
Git for Windows 2.x ships with an executable that starts the Git Bash with all the environment variables and what not properly set up. It is also adjusted according to the Terminal emulator option chosen when installing Git for Windows (while
bash.exe --login -iwould always launch with Windows' default console).So let's use that executable (usually C:\Program Files\Git\git-bash.exe) instead of
bash.exe --login -iif its presence was detected.This fixes https://github.com/git-for-windows/git/issues/490
Signed-off-by Thomas Kläger <[email protected]>Signed-off-by Johannes Schindelin <[email protected]>--- git-gui.sh | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-)git-gui.sh +0
-0git-gui.sh if {![is_bare]} { · line 2700
Quoted 1 line
git-gui.sh +0
-0@@ -2700,10 +2700,18 @@ if {![is_bare]} { }This hunk is kind of hard to understand. I'm writing what I make of it. Please correct me if I read it wrong.
Since this is a 4 year old commit not even authored by you, you might not have all the answers. That's OK. But I'd still like to point these things out. I do have a question at the end so please read the entire thing :)
git-gui.sh if {![is_bare]} { · line 2704
Quoted 3 lines
git-gui.sh +2
-0if {[is_Windows]} { + # Use /git-bash.exe if available + set normalized [file normalize $::argv0]argv0 would be the location of git-gui. We get an absolute path for the git-gui executable in the variable normalized.
git-gui.sh if {![is_bare]} { · line 2706
Quoted 2 lines
git-gui.sh +2
-0+ regsub "/mingw../libexec/git-core/git-gui$" \ + $normalized "/git-bash.exe" cmdLineThis finds the install location of git-bash by doing a string substitution. I'm assuming the path before /mingw.. is the installation directory of git, and so that's where git-bash would reside. We put that directory in cmdLine.
Quoted 6 lines
Nitpick: most of the code here uses snake case. So s/cmdLine/cmd_line/
git-gui.sh if {![is_bare]} { · line 2707
Quoted 1 line
git-gui.sh +1
-0+ if {$cmdLine != $normalized && [file exists $cmdLine]} {Why the $cmdLine != $normalized? When would they be equal? The string substitution should always change $cmdLine.
Except when Git GUI is installed in an unexpected location. This check is purely defensive programming.
Quoted 18 lines
git-gui.sh if {![is_bare]} { · line 2717
Quoted 13 lines
git-gui.sh +5
-2+ set cmdLine [list "Git Bash" $cmdLine &] + } else { + set cmdLine [list "Git Bash" bash --login -l &] + } .mbar.repository add command \ -label [mc "Git Bash"] \ - -command {eval exec [auto_execok start] \ - [list "Git Bash" bash --login -l &]} + -command {eval exec [auto_execok start] $cmdLine} } if {[is_Windows] || ![is_bare]} {The way of finding the path of git-bash is very hacky and would break as soon as there are any changes in the install locations. Plus, it is not at all easy to understand what's going on at first look.
Quoted 8 lines
Is there no better way of finding out git-bash's location? Is there something like the PATH environment variable in Windows that we can use to locate git-bash's executable? I have never developed in Windows so I have no idea how things work there.
On Linux for example, the
exec()family of functions look into the PATH environment variable for the executable, so it is a pretty clean mechanism to execute programs.
Quoted 5 lines
That's not an option on Windows.
git-bash.exeis not intended to be in thePATH, specifically not.The implemented method is the best approach we found to determine the location of
git-bash.exe.
Thanks for explaining. Unfortunate that there is no universal way of finding the install location, and we have to rely on educated guesses.
Will queue. Thanks.
Signature · 2 lines
Regards, Pratyush Yadav
Quoted 8 lines · Thomas Klaeger via GitGitGadget
From: Thomas Klaeger <[email protected]>
Git for Windows 2.x ships with an executable that starts the Git Bash with all the environment variables and what not properly set up. It is also adjusted according to the Terminal emulator option chosen when installing Git for Windows (while
bash.exe --login -iwould always launch with Windows' default console).
Quoted 6 lines
So let's use that executable (usually C:\Program Files\Git\git-bash.exe) instead of
bash.exe --login -iif its presence was detected.This fixes https://github.com/git-for-windows/git/issues/490
Signed-off-by Thomas Kläger <[email protected]>
While applying the patch, my patch check script complained that the author did not sign off.
Well, they did... but with a slightly different name (Kläger vs Klaeger) and a completely different email address.
I'm not sure if I can do something about it, just thought it was something worth mentioning.
Signature · 2 lines
Regards, Pratyush Yadav