git-gui cannot find share/git-gui under cygwin
Commit ea75ee3598ab6f8d0828f introduced logic to guess where share/git-gui/lib is at runtime, and this is broken on Cygwin. The basic problem is that:
/usr/bin = c:\cygwin\bin/usr/share = c:\cygwin\usr\share
The detection logic correctly finds the wish binary in c:\cygwin\bin, and then assumes that the share directory is c:\cygwin\share rather than c:\cygwin\usr\share. Given this, git-gui does not load as it cannot find its share/git-gui/lib directory
Mark Levedahl
Quoted 11 lines · Mark Levedahl
Commit
ea75ee3598ab6f8d0828fintroduced logic to guess where share/git-gui/lib is at runtime, and this is broken on Cygwin. The basic problem is that:
/usr/bin= c:\cygwin\bin/usr/share= c:\cygwin\usr\shareThe detection logic correctly finds the wish binary in c:\cygwin\bin, and then assumes that the share directory is c:\cygwin\share rather than c:\cygwin\usr\share. Given this, git-gui does not load as it cannot find its share/git-gui/lib directory
Yuck. I'm considering applying the following. It works ok on Mac OS X where the bug isn't triggered anyway. ;-) I won't be able to test on Cygwin until tomorrow.
-->8--
git-gui: Correctly install to /usr/bin on Cygwin
Mark Levedahl <[email protected]> noted that installation on Cygwin to /usr/bin can cause problems with the automatic guessing of our library location. The problem is that installation to /usr/bin means we actually have:
/usr/bin = c:\cygwin\bin
/usr/share = c:\cygwin\usr\share
So git-gui guesses that its library should be found within the c:\cygwin\share directory, as that is where it should be relative to the script itself in c:\cygwin\bin.
In this case we have to use cygpath during installation to find out what the mapping is from the UNIX path we are seeing in GNU make, to the Windows path we will actually see in our Tcl/Tk process. After that mapping has been performed we can then test to see if our share directory can be found by relative location, or if we need to encode the absolute location.
--- Makefile | 14 ++++++++++++-- 1 files changed, 12 insertions(+), 2 deletions(-)
Makefile +12 -2
@@ -7,6 +7,8 @@ GIT-VERSION-FILE: .FORCE-GIT-VERSION-FILE @$(SHELL_PATH) ./GIT-VERSION-GEN -include GIT-VERSION-FILE +uname_O := $(shell sh -c 'uname -o 2>/dev/null || echo not') + SCRIPT_SH = git-gui.sh GITGUI_BUILT_INS = git-citool ALL_PROGRAMS = $(GITGUI_BUILT_INS) $(patsubst %.sh,%,$(SCRIPT_SH))
@@ -58,14 +60,22 @@ exedir_SQ = $(subst ','\'',$(exedir)) $(patsubst %.sh,%,$(SCRIPT_SH)) : % : %.sh $(QUIET_GEN)rm -f $@ $@+ && \ - if test '$(exedir_SQ)' = '$(libdir_SQ)'; then \ + A='$(exedir_SQ)' && \ + B='$(libdir_SQ)' && \ + if test "$(uname_O)" = Cygwin; then \ + A="$$(cygpath -m -a "$$A")" && \ + B="$$(cygpath -m -a "$$B")"; \ + fi && \ + if test "$$A" = "$$B"; then \ GITGUI_RELATIVE=1; \ + else \ + GITGUI_RELATIVE=; \ fi && \ sed -e '1s|#!.*/sh|#!$(SHELL_PATH_SQ)|' \ -e 's|^exec wish "$$0"|exec $(subst |,'\|',$(TCLTK_PATH_SQ)) "$$0"|' \ -e 's/@@GITGUI_VERSION@@/$(GITGUI_VERSION)/g' \ -e 's|@@GITGUI_RELATIVE@@|'$$GITGUI_RELATIVE'|' \ - -e $$GITGUI_RELATIVE's|@@GITGUI_LIBDIR@@|$(libdir_SQ)|' \ + -e $$GITGUI_RELATIVE"s|@@GITGUI_LIBDIR@@|$$B|" \ [email protected] >$@+ && \ chmod +x $@+ && \ mv $@+ $@
Signature · 5 lines
1.5.2.2.1012.ge05f4 -- Shawn.
Quoted 5 lines · Shawn O. Pearce
Yuck. I'm considering applying the following. It works ok on Mac OS X where the bug isn't triggered anyway. ;-) I won't be able to test on Cygwin until tomorrow.
sorry, no joy. The problem is that gitexecdir=/usr/bin, but...
/usr/bin is a Cygwin mount point that points at c:\cygwin\bin.
so...
$ cygpath -m -a /bin C:/cygwin/bin $ cygpath -m -a /usr C:/cygwin/usr $ cygpath -m -a /usr/bin C:/cygwin/bin $ cygpath -m -a /usr/share C:/cygwin/usr/share
and the result is that both exedir_SQ and libdir_SQ have the value /usr/share/git-gui-lib
I don't think there is a portable solution here. Maybe just say
if test "$(uname_O)" = Cygwin; then \
GITGUI_RELATIVE=; \and be done with it.
Mark
Quoted 6 lines · Mark Levedahl
Quoted 3 lines · Shawn O. Pearce
Yuck. I'm considering applying the following. It works ok on Mac OS X where the bug isn't triggered anyway. ;-) I won't be able to test on Cygwin until tomorrow.
sorry, no joy. The problem is that gitexecdir=/usr/bin, but...
Thanks for the feedback.
Quoted 6 lines
I don't think there is a portable solution here. Maybe just say
if test "$(uname_O)" = Cygwin; then \ GITGUI_RELATIVE=; \and be done with it.
Yup. Done. Now in my maint, master and pu branches.
Signature · 1 line
Shawn.