Skip to content

Commit

Permalink
git-gui: Improve the Windows and Mac OS X shortcut creators
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Shawn O. Pearce committed Jul 9, 2007
1 parent 74c4763 commit 7eafa2f
Show file tree
Hide file tree
Showing 2 changed files with 31 additions and 21 deletions.
5 changes: 5 additions & 0 deletions git-gui.sh
Original file line number Diff line number Diff line change
Expand Up @@ -475,6 +475,11 @@ proc git_write {args} {
return [open [concat $opt $cmdp $args] w]
}

proc sq {value} {
regsub -all ' $value "'\\''" value
return "'$value'"
}

proc load_current_branch {} {
global current_branch is_detached

Expand Down
47 changes: 26 additions & 21 deletions lib/shortcut.tcl
Original file line number Diff line number Diff line change
Expand Up @@ -13,10 +13,11 @@ proc do_windows_shortcut {} {
set fn ${fn}.bat
}
if {[catch {
set ge [file normalize [file dirname $::_git]]
set fd [open $fn w]
puts $fd "@ECHO Entering [reponame]"
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 -nonewline $fd "@\"[info nameofexecutable]\""
puts $fd " \"[file normalize $argv0]\""
Expand Down Expand Up @@ -62,17 +63,11 @@ proc do_cygwin_shortcut {} {
--unix \
--absolute \
[gitdir]]
set gw [exec cygpath \
--windows \
--absolute \
[file dirname [gitdir]]]
regsub -all ' $me "'\\''" me
regsub -all ' $gd "'\\''" gd
puts $fd "@ECHO Entering $gw"
puts $fd "@ECHO Entering [reponame]"
puts $fd "@ECHO Starting git-gui... please wait..."
puts -nonewline $fd "@\"$sh\" --login -c \""
puts -nonewline $fd "GIT_DIR='$gd'"
puts -nonewline $fd " '$me'"
puts -nonewline $fd "GIT_DIR=[sq [$gd]]"
puts -nonewline $fd " [sq $me]"
puts $fd "&\""
close $fd
} err]} {
Expand All @@ -90,6 +85,9 @@ proc do_macosx_app {} {
-initialdir [file join $env(HOME) Desktop] \
-initialfile "Git [reponame].app"]
if {$fn != {}} {
if {[file extension $fn] ne {.app}} {
set fn ${fn}.app
}
if {[catch {
set Contents [file join $fn Contents]
set MacOS [file join $Contents MacOS]
Expand Down Expand Up @@ -123,20 +121,27 @@ proc do_macosx_app {} {
close $fd

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"
foreach name [array names env] {
if {[string match GIT_* $name]} {
regsub -all ' $env($name) "'\\''" v
puts $fd "export $name='$v'"
foreach name [lsort [array names env]] {
set value $env($name)
switch -- $name {
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 GIT_DIR='$gd'"
puts $fd "exec [file normalize $argv0]"
puts $fd "export PATH=[sq [file dirname $::_git]]:\$PATH &&"
puts $fd "cd [sq [file normalize [pwd]]] &&"
puts $fd "exec \\"
puts $fd " [sq [info nameofexecutable]] \\"
puts $fd " [sq [file normalize $argv0]]"
close $fd

file attributes $exe -permissions u+x,g+x,o+x
Expand Down

0 comments on commit 7eafa2f

Please sign in to comment.