Subject: [PATCH] Allow gitk to start on Cygwin with native Win32 Tcl/Tk

From: "Shawn O. Pearce" <[email-masked]>
Date: Sat, 22 Sep 2007 01:04:47 -0400

If TCLTK_PATH points at a pure Win32 Tcl/Tk implementation but you
are running git (and thus gitk) from within Cygwin the value of
$0 is a UNIX style Cygwin path which the native Tcl/Tk is unable
to open and parse.  In such a situation we need to switch to using
the Windows style path by running $0 through cygpath.

This doesn't have a negative impact when using the Cygwin based
Tcl/Tk build as that is still close enough to a native Win32
application that it can read the Windows style path when sourcing
gitk.  On any other platform we don't want gitk to do anything
different so we keep argv0=$0.

Signed-off-by: Shawn O. Pearce <[email-masked]>
---

 Yes, I admit this is an odd patch.  I can certainly carry it in
 my own tree (I already carry some other patches) but I wonder if
 we shouldn't include it as some users may actually try to do this,
 just like I did.  Latest git-gui `master` already has changes to its
 Makefile and shell startup boilerplate to handle this weird case.

 Makefile |    6 +++++-
 gitk     |    3 ++-
 2 files changed, 7 insertions(+), 2 deletions(-)

diff --git a/Makefile b/Makefile
index 0055eef..4fc6eb3 100644
--- a/Makefile
+++ b/Makefile
@@ -386,6 +386,7 @@ EXTLIBS =
 #
 # Platform specific tweaks
 #
+gitk_argv0 := $$0
 
 # We choose to avoid "if .. else if .. else .. endif endif"
 # because maintaining the nesting to match is a pain.  If
@@ -443,6 +444,7 @@ ifeq ($(uname_O),Cygwin)
 	NO_MMAP = YesPlease
 	NO_IPV6 = YesPlease
 	X = .exe
+	gitk_argv0 := `cygpath --windows --absolute "$(gitk_argv0)"`
 endif
 ifeq ($(uname_S),FreeBSD)
 	NEEDS_LIBICONV = YesPlease
@@ -763,7 +765,9 @@ strip: $(PROGRAMS) git$X
 
 gitk-wish: gitk GIT-GUI-VARS
 	$(QUIET_GEN)$(RM) $@ $@+ && \
-	sed -e '1,3s|^exec .* "$$0"|exec $(subst |,'\|',$(TCLTK_PATH_SQ)) "$$0"|' <gitk >$@+ && \
+	sed -e '1,30s|^argv0=$$0|argv0=$(gitk_argv0)|' \
+	    -e '1,4s|^exec .* "$$argv0"|exec $(subst |,'\|',$(TCLTK_PATH_SQ)) "$$argv0"|' \
+	    <gitk >$@+ && \
 	chmod +x $@+ && \
 	mv -f $@+ $@
 
diff --git a/gitk b/gitk
index 300fdce..2366911 100755
--- a/gitk
+++ b/gitk
@@ -1,6 +1,7 @@
 #!/bin/sh
 # Tcl ignores the next line -*- tcl -*- \
-exec wish "$0" -- "$@"
+argv0=$0; \
+exec wish "$argv0" -- "$@"
 
 # Copyright (C) 2005-2006 Paul Mackerras.  All rights reserved.
 # This program is free software; it may be used, copied, modified
-- 
1.5.3.2.1036.gcd14a