set _appname [lindex [file split $argv0] end]
set _gitdir {}
+set _gitexec {}
set _reponame {}
+set _iscygwin {}
proc appname {} {
global _appname
return [eval [concat [list file join $_gitdir] $args]]
}
+proc gitexec {args} {
+ global _gitexec
+ if {$_gitexec eq {}} {
+ if {[catch {set _gitexec [exec git --exec-path]} err]} {
+ error "Git not installed?\n\n$err"
+ }
+ }
+ if {$args eq {}} {
+ return $_gitexec
+ }
+ return [eval [concat [list file join $_gitexec] $args]]
+}
+
proc reponame {} {
global _reponame
return $_reponame
}
+proc is_MacOSX {} {
+ global tcl_platform tk_library
+ if {[tk windowingsystem] eq {aqua}} {
+ return 1
+ }
+ return 0
+}
+
+proc is_Windows {} {
+ global tcl_platform
+ if {$tcl_platform(platform) eq {windows}} {
+ return 1
+ }
+ return 0
+}
+
+proc is_Cygwin {} {
+ global tcl_platform _iscygwin
+ if {$_iscygwin eq {}} {
+ if {$tcl_platform(platform) eq {windows}} {
+ if {[catch {set p [exec cygpath --windir]} err]} {
+ set _iscygwin 0
+ } else {
+ set _iscygwin 1
+ }
+ } else {
+ set _iscygwin 0
+ }
+ }
+ return $_iscygwin
+}
+
######################################################################
##
## config
error_popup "Cannot find the git directory:\n\n$err"
exit 1
}
+if {![file isdirectory $_gitdir] && [is_Cygwin]} {
+ catch {set _gitdir [exec cygpath --unix $_gitdir]}
+}
if {![file isdirectory $_gitdir]} {
catch {wm withdraw .}
error_popup "Git directory not found:\n\n$_gitdir"
}
if {[lindex [file split $_gitdir] end] ne {.git}} {
catch {wm withdraw .}
- error_popup "Cannot use funny .git directory:\n\n$gitdir"
+ error_popup "Cannot use funny .git directory:\n\n$_gitdir"
exit 1
}
if {[catch {cd [file dirname $_gitdir]} err]} {
# On Cygwin [file executable] might lie so we need to ask
# the shell if the hook is executable. Yes that's annoying.
#
- if {[is_Windows] && [file isfile $pchook]} {
+ if {[is_Cygwin] && [file isfile $pchook]} {
set pchook [list sh -c [concat \
"if test -x \"$pchook\";" \
"then exec \"$pchook\" 2>&1;" \
# -- Run the post-commit hook.
#
set pchook [gitdir hooks post-commit]
- if {[is_Windows] && [file isfile $pchook]} {
+ if {[is_Cygwin] && [file isfile $pchook]} {
set pchook [list sh -c [concat \
"if test -x \"$pchook\";" \
"then exec \"$pchook\";" \
##
## util
-proc is_MacOSX {} {
- global tcl_platform tk_library
- if {[tk windowingsystem] eq {aqua}} {
- return 1
- }
- return 0
-}
-
-proc is_Windows {} {
- global tcl_platform
- if {$tcl_platform(platform) eq {windows}} {
- return 1
- }
- return 0
-}
-
proc bind_button3 {w cmd} {
bind $w <Any-Button-3> $cmd
if {[is_MacOSX]} {
}
proc console_exec {w cmd after} {
- # -- Windows tosses the enviroment when we exec our child.
+ # -- Cygwin's Tcl tosses the enviroment when we exec our child.
# But most users need that so we have to relogin. :-(
#
- if {[is_Windows]} {
+ if {[is_Cygwin]} {
set cmd [list sh --login -c "cd \"[pwd]\" && [join $cmd { }]"]
}
set starting_gitk_msg {Starting gitk... please wait...}
proc do_gitk {revs} {
- global ui_status_value starting_gitk_msg
+ global env ui_status_value starting_gitk_msg
+
+ # -- On Windows gitk is severly broken, and right now it seems like
+ # nobody cares about fixing it. The only known workaround is to
+ # always delete ~/.gitk before starting the program.
+ #
+ if {[is_Windows]} {
+ catch {file delete [file join $env(HOME) .gitk]}
+ }
- set cmd gitk
+ # -- Always start gitk through whatever we were loaded with. This
+ # lets us bypass using shell process on Windows systems.
+ #
+ set cmd [info nameofexecutable]
+ lappend cmd [gitexec gitk]
if {$revs ne {}} {
append cmd { }
append cmd $revs
}
- if {[is_Windows]} {
- set cmd "sh -c \"exec $cmd\""
- }
- append cmd { &}
- if {[catch {eval exec $cmd} err]} {
+ if {[catch {eval exec $cmd &} err]} {
error_popup "Failed to start gitk:\n\n$err"
} else {
set ui_status_value $starting_gitk_msg
proc do_windows_shortcut {} {
global argv0
+ set fn [tk_getSaveFile \
+ -parent . \
+ -title "[appname] ([reponame]): Create Desktop Icon" \
+ -initialfile "Git [reponame].bat"]
+ if {$fn != {}} {
+ if {[catch {
+ 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 GIT_DIR=[file normalize [gitdir]]"
+ puts -nonewline $fd "@\"[info nameofexecutable]\""
+ puts $fd " \"[file normalize $argv0]\""
+ close $fd
+ } err]} {
+ error_popup "Cannot write script:\n\n$err"
+ }
+ }
+}
+
+proc do_cygwin_shortcut {} {
+ global argv0
+
if {[catch {
set desktop [exec cygpath \
--windows \
set fd [open $exe w]
set gd [file normalize [gitdir]]
- set ep [file normalize [exec git --exec-path]]
+ set ep [file normalize [gitexec]]
regsub -all ' $gd "'\\''" gd
regsub -all ' $ep "'\\''" ep
puts $fd "#!/bin/sh"
.mbar.repository add separator
- if {[is_Windows]} {
+ if {[is_Cygwin]} {
+ .mbar.repository add command \
+ -label {Create Desktop Icon} \
+ -command do_cygwin_shortcut \
+ -font font_ui
+ } elseif {[is_Windows]} {
.mbar.repository add command \
-label {Create Desktop Icon} \
-command do_windows_shortcut \
set browser {}
catch {set browser $repo_config(instaweb.browser)}
-set doc_path [file dirname [exec git --exec-path]]
+set doc_path [file dirname [gitexec]]
set doc_path [file join $doc_path Documentation index.html]
-if {[is_Windows]} {
+if {[is_Cygwin]} {
set doc_path [exec cygpath --windows $doc_path]
}
if {$browser eq {}} {
if {[is_MacOSX]} {
set browser open
- } elseif {[is_Windows]} {
+ } elseif {[is_Cygwin]} {
set program_files [file dirname [exec cygpath --windir]]
set program_files [file join $program_files {Program Files}]
set firefox [file join $program_files {Mozilla Firefox} firefox.exe]
# does *not* pass its env array onto any processes it spawns.
# This means that git processes get none of our environment.
#
-if {[is_Windows]} {
+if {[is_Cygwin]} {
set ignored_env 0
set suggest_user {}
set msg "Possible environment issues exist.