git-gui: Improve the Windows and Mac OS X shortcut creators

We now embed any GIT_* and SSH_* environment variables as well as
the path to the git wrapper executable into the Mac OS X .app file.
This should allow us to restore the environment properly when
we restart.

We also try to use proper Bourne shell single quoting when we can,
as this avoids any sort of problems that might occur due to a path
containing shell metacharacters.

Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
This commit is contained in:
Shawn O. Pearce 2007-07-09 03:28:41 -04:00
parent 74c4763c76
commit 7eafa2f157
2 changed files with 31 additions and 21 deletions

View File

@ -475,6 +475,11 @@ proc git_write {args} {
return [open [concat $opt $cmdp $args] w] return [open [concat $opt $cmdp $args] w]
} }
proc sq {value} {
regsub -all ' $value "'\\''" value
return "'$value'"
}
proc load_current_branch {} { proc load_current_branch {} {
global current_branch is_detached global current_branch is_detached

View File

@ -13,10 +13,11 @@ proc do_windows_shortcut {} {
set fn ${fn}.bat set fn ${fn}.bat
} }
if {[catch { if {[catch {
set ge [file normalize [file dirname $::_git]]
set fd [open $fn w] set fd [open $fn w]
puts $fd "@ECHO Entering [reponame]" puts $fd "@ECHO Entering [reponame]"
puts $fd "@ECHO Starting git-gui... please wait..." puts $fd "@ECHO Starting git-gui... please wait..."
puts $fd "@SET PATH=[file normalize [gitexec]];%PATH%" puts $fd "@SET PATH=$ge;%PATH%"
puts $fd "@SET GIT_DIR=[file normalize [gitdir]]" puts $fd "@SET GIT_DIR=[file normalize [gitdir]]"
puts -nonewline $fd "@\"[info nameofexecutable]\"" puts -nonewline $fd "@\"[info nameofexecutable]\""
puts $fd " \"[file normalize $argv0]\"" puts $fd " \"[file normalize $argv0]\""
@ -62,17 +63,11 @@ proc do_cygwin_shortcut {} {
--unix \ --unix \
--absolute \ --absolute \
[gitdir]] [gitdir]]
set gw [exec cygpath \ puts $fd "@ECHO Entering [reponame]"
--windows \
--absolute \
[file dirname [gitdir]]]
regsub -all ' $me "'\\''" me
regsub -all ' $gd "'\\''" gd
puts $fd "@ECHO Entering $gw"
puts $fd "@ECHO Starting git-gui... please wait..." puts $fd "@ECHO Starting git-gui... please wait..."
puts -nonewline $fd "@\"$sh\" --login -c \"" puts -nonewline $fd "@\"$sh\" --login -c \""
puts -nonewline $fd "GIT_DIR='$gd'" puts -nonewline $fd "GIT_DIR=[sq [$gd]]"
puts -nonewline $fd " '$me'" puts -nonewline $fd " [sq $me]"
puts $fd "&\"" puts $fd "&\""
close $fd close $fd
} err]} { } err]} {
@ -90,6 +85,9 @@ proc do_macosx_app {} {
-initialdir [file join $env(HOME) Desktop] \ -initialdir [file join $env(HOME) Desktop] \
-initialfile "Git [reponame].app"] -initialfile "Git [reponame].app"]
if {$fn != {}} { if {$fn != {}} {
if {[file extension $fn] ne {.app}} {
set fn ${fn}.app
}
if {[catch { if {[catch {
set Contents [file join $fn Contents] set Contents [file join $fn Contents]
set MacOS [file join $Contents MacOS] set MacOS [file join $Contents MacOS]
@ -123,20 +121,27 @@ proc do_macosx_app {} {
close $fd close $fd
set fd [open $exe w] set fd [open $exe w]
set gd [file normalize [gitdir]]
set ep [file normalize [gitexec]]
regsub -all ' $gd "'\\''" gd
regsub -all ' $ep "'\\''" ep
puts $fd "#!/bin/sh" puts $fd "#!/bin/sh"
foreach name [array names env] { foreach name [lsort [array names env]] {
if {[string match GIT_* $name]} { set value $env($name)
regsub -all ' $env($name) "'\\''" v switch -- $name {
puts $fd "export $name='$v'" GIT_DIR { set value [file normalize [gitdir]] }
}
switch -glob -- $name {
SSH_* -
GIT_* {
puts $fd "if test \"z\$$name\" = z; then"
puts $fd " export $name=[sq $value]"
puts $fd "fi &&"
}
} }
} }
puts $fd "export PATH='$ep':\$PATH" puts $fd "export PATH=[sq [file dirname $::_git]]:\$PATH &&"
puts $fd "export GIT_DIR='$gd'" puts $fd "cd [sq [file normalize [pwd]]] &&"
puts $fd "exec [file normalize $argv0]" puts $fd "exec \\"
puts $fd " [sq [info nameofexecutable]] \\"
puts $fd " [sq [file normalize $argv0]]"
close $fd close $fd
file attributes $exe -permissions u+x,g+x,o+x file attributes $exe -permissions u+x,g+x,o+x