1
0
mirror of https://github.com/git/git synced 2024-07-05 00:58:49 +00:00
git/git-gui/lib/shortcut.tcl

141 lines
3.5 KiB
Tcl
Raw Permalink Normal View History

# git-gui desktop icon creators
# Copyright (C) 2006, 2007 Shawn Pearce
proc do_windows_shortcut {} {
global _gitworktree
set fn [tk_getSaveFile \
-parent . \
-title [mc "%s (%s): Create Desktop Icon" [appname] [reponame]] \
-initialfile "Git [reponame].lnk"]
if {$fn != {}} {
if {[file extension $fn] ne {.lnk}} {
set fn ${fn}.lnk
}
# Use git-gui.exe if available (ie: git-for-windows)
set cmdLine [auto_execok git-gui.exe]
if {$cmdLine eq {}} {
set cmdLine [list [info nameofexecutable] \
[file normalize $::argv0]]
}
if {[catch {
win32_create_lnk $fn $cmdLine \
[file normalize $_gitworktree]
} err]} {
error_popup [strcat [mc "Cannot write shortcut:"] "\n\n$err"]
}
}
}
proc do_cygwin_shortcut {} {
git-gui - use mkshortcut on Cygwin git-gui enables the "Repository->Create Desktop Icon" item on Cygwin, offering to create a shortcut that starts git-gui on the current repository. The code in do_cygwin_shortcut invokes function win32_create_lnk to create the shortcut. This latter function is shared between Cygwin and Git For Windows and expects Windows rather than unix pathnames, though do_cygwin_shortcut provides unix pathnames. Also, this function tries to invoke the Windows Script Host to run a javascript snippet, but this fails under Cygwin's Tcl. So, win32_create_lnk just does not support Cygwin. However, Cygwin's default installation provides /bin/mkshortcut for creating desktop shortcuts. This is compatible with exec under Cygwin's Tcl, understands Cygwin's unix pathnames, and avoids the need for shell escapes to encode troublesome paths. So, teach git-gui to use mkshortcut on Cygwin, leaving win32_create_lnk unchanged and for exclusive use by Git For Windows. Notes: "CHERE_INVOKING=1" is recognized by Cygwin's /etc/profile and prevents a "chdir $HOME", leaving the shell in the working directory specified by the shortcut. That directory is written directly by mkshortcut eliminating any problems with shell escapes and quoting. The code being replaced includes the full pathname of the git-gui creating the shortcut, but that git-gui might not be compatible with the git found after /etc/profile sets the path, and might have a pathname that defies encoding using shell escapes that can survive the multiple incompatible interpreters involved in the chain of creating and using this shortcut. The new code uses bare "git gui" as the command to execute, thus using the system git to launch the system git-gui, and avoiding both issues. Signed-off-by: Mark Levedahl <mlevedahl@gmail.com> Acked-by: Johannes Schindelin <johannes.schindelin@gmx.de> Signed-off-by: Pratyush Yadav <me@yadavpratyush.com>
2023-06-26 16:53:05 +00:00
global argv0 _gitworktree oguilib
if {[catch {
set desktop [exec cygpath \
--desktop]
}]} {
set desktop .
}
set fn [tk_getSaveFile \
-parent . \
-title [mc "%s (%s): Create Desktop Icon" [appname] [reponame]] \
-initialdir $desktop \
-initialfile "Git [reponame].lnk"]
if {$fn != {}} {
if {[file extension $fn] ne {.lnk}} {
set fn ${fn}.lnk
}
if {[catch {
git-gui - use mkshortcut on Cygwin git-gui enables the "Repository->Create Desktop Icon" item on Cygwin, offering to create a shortcut that starts git-gui on the current repository. The code in do_cygwin_shortcut invokes function win32_create_lnk to create the shortcut. This latter function is shared between Cygwin and Git For Windows and expects Windows rather than unix pathnames, though do_cygwin_shortcut provides unix pathnames. Also, this function tries to invoke the Windows Script Host to run a javascript snippet, but this fails under Cygwin's Tcl. So, win32_create_lnk just does not support Cygwin. However, Cygwin's default installation provides /bin/mkshortcut for creating desktop shortcuts. This is compatible with exec under Cygwin's Tcl, understands Cygwin's unix pathnames, and avoids the need for shell escapes to encode troublesome paths. So, teach git-gui to use mkshortcut on Cygwin, leaving win32_create_lnk unchanged and for exclusive use by Git For Windows. Notes: "CHERE_INVOKING=1" is recognized by Cygwin's /etc/profile and prevents a "chdir $HOME", leaving the shell in the working directory specified by the shortcut. That directory is written directly by mkshortcut eliminating any problems with shell escapes and quoting. The code being replaced includes the full pathname of the git-gui creating the shortcut, but that git-gui might not be compatible with the git found after /etc/profile sets the path, and might have a pathname that defies encoding using shell escapes that can survive the multiple incompatible interpreters involved in the chain of creating and using this shortcut. The new code uses bare "git gui" as the command to execute, thus using the system git to launch the system git-gui, and avoiding both issues. Signed-off-by: Mark Levedahl <mlevedahl@gmail.com> Acked-by: Johannes Schindelin <johannes.schindelin@gmx.de> Signed-off-by: Pratyush Yadav <me@yadavpratyush.com>
2023-06-26 16:53:05 +00:00
set repodir [file normalize $_gitworktree]
set shargs {-c \
"CHERE_INVOKING=1 \
source /etc/profile; \
git gui"}
exec /bin/mkshortcut.exe \
--arguments $shargs \
--desc "git-gui on $repodir" \
--icon $oguilib/git-gui.ico \
--name $fn \
--show min \
--workingdir $repodir \
/bin/sh.exe
} err]} {
error_popup [strcat [mc "Cannot write shortcut:"] "\n\n$err"]
}
}
}
proc do_macosx_app {} {
global argv0 env
set fn [tk_getSaveFile \
-parent . \
-title [mc "%s (%s): Create Desktop Icon" [appname] [reponame]] \
-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]
set exe [file join $MacOS git-gui]
file mkdir $MacOS
set fd [open [file join $Contents Info.plist] w]
puts $fd {<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>English</string>
<key>CFBundleExecutable</key>
<string>git-gui</string>
<key>CFBundleIdentifier</key>
<string>org.spearce.git-gui</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>1.0</string>
<key>NSPrincipalClass</key>
<string>NSApplication</string>
</dict>
</plist>}
close $fd
set fd [open $exe w]
puts $fd "#!/bin/sh"
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=[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
} err]} {
error_popup [strcat [mc "Cannot write icon:"] "\n\n$err"]
}
}
}