From 72a8e81d457a1ee1283817d03d8e28303c2b4e7e Mon Sep 17 00:00:00 2001 From: "Shawn O. Pearce" Date: Thu, 27 Sep 2007 02:30:51 -0400 Subject: [PATCH] git-gui: Support a native Mac OS X application bundle If we are building on Darwin (sometimes known as Mac OS X) and we find the Mac OS X Tk.framework in the expected location we build a proper Mac OS X application bundle with icons and info list. The git-gui and git-citool commands are modified to be very short shell scripts that just execute the application bundle, starting Tk with our own info list and icon set. Although the Makefile change here is rather large it makes for a much more pleasant user experience on Mac OS X as git-gui now has its own icon on the dock, in the standard tk_messageBox dialogs, and the application name now says "Git Gui" instead of "Wish" in locations such as the menu bar and the alt-tab window. Signed-off-by: Shawn O. Pearce --- .gitignore | 4 ++- Makefile | 96 +++++++++++++++++++++++++++++++++++++++++----------- macosx/AppMain.tcl | 22 ++++++++++++ macosx/Info.plist | 28 +++++++++++++++ macosx/git-gui.icns | Bin 0 -> 28866 bytes 5 files changed, 129 insertions(+), 21 deletions(-) create mode 100644 macosx/AppMain.tcl create mode 100644 macosx/Info.plist create mode 100644 macosx/git-gui.icns diff --git a/.gitignore b/.gitignore index 020b86deae..a7cfd6d5a0 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,7 @@ +.DS_Store +Git Gui.app* +git-gui.tcl GIT-VERSION-FILE GIT-GUI-VARS -git-citool git-gui lib/tclIndex diff --git a/Makefile b/Makefile index ea83263406..818a0ab45c 100644 --- a/Makefile +++ b/Makefile @@ -11,11 +11,12 @@ GIT-VERSION-FILE: .FORCE-GIT-VERSION-FILE @$(SHELL_PATH) ./GIT-VERSION-GEN -include GIT-VERSION-FILE +uname_S := $(shell sh -c 'uname -s 2>/dev/null || echo not') uname_O := $(shell sh -c 'uname -o 2>/dev/null || echo not') SCRIPT_SH = git-gui.sh +GITGUI_MAIN := git-gui GITGUI_BUILT_INS = git-citool -ALL_PROGRAMS = $(GITGUI_BUILT_INS) $(patsubst %.sh,%,$(SCRIPT_SH)) ALL_LIBFILES = $(wildcard lib/*.tcl) PRELOAD_FILES = lib/class.tcl @@ -35,7 +36,7 @@ ifndef INSTALL INSTALL = install endif -RM_F ?= rm -f +RM_RF ?= rm -rf RMDIR ?= rmdir INSTALL_D0 = $(INSTALL) -d -m755 # space is required here @@ -44,6 +45,8 @@ INSTALL_R0 = $(INSTALL) -m644 # space is required here INSTALL_R1 = INSTALL_X0 = $(INSTALL) -m755 # space is required here INSTALL_X1 = +INSTALL_A0 = find # space is required here +INSTALL_A1 = | cpio -pud INSTALL_L0 = rm -f # space is required here INSTALL_L1 = && ln # space is required here INSTALL_L2 = @@ -51,14 +54,13 @@ INSTALL_L3 = REMOVE_D0 = $(RMDIR) # space is required here REMOVE_D1 = || true -REMOVE_F0 = $(RM_F) # space is required here +REMOVE_F0 = $(RM_RF) # space is required here REMOVE_F1 = CLEAN_DST = true ifndef V QUIET = @ - QUIET_GEN = $(QUIET)echo ' ' GEN $@ && - QUIET_BUILT_IN = $(QUIET)echo ' ' BUILTIN $@ && + QUIET_GEN = $(QUIET)echo ' ' GEN '$@' && QUIET_INDEX = $(QUIET)echo ' ' INDEX $(dir $@) && QUIET_MSGFMT0 = $(QUIET)printf ' MSGFMT %12s ' $@ && v=` QUIET_MSGFMT1 = 2>&1` && echo "$$v" | sed -e 's/fuzzy translations/fuzzy/' | sed -e 's/ messages//g' @@ -70,6 +72,8 @@ ifndef V INSTALL_R1 = && echo ' ' INSTALL 644 `basename $$src` && $(INSTALL) -m644 $$src INSTALL_X0 = src= INSTALL_X1 = && echo ' ' INSTALL 755 `basename $$src` && $(INSTALL) -m755 $$src + INSTALL_A0 = src= + INSTALL_A1 = && echo ' ' INSTALL ' ' `basename "$$src"` && find "$$src" | cpio -pud INSTALL_L0 = dst= INSTALL_L1 = && src= @@ -80,15 +84,15 @@ ifndef V REMOVE_D0 = dir= REMOVE_D1 = && echo ' ' REMOVE $$dir && test -d "$$dir" && $(RMDIR) "$$dir" || true REMOVE_F0 = dst= - REMOVE_F1 = && echo ' ' REMOVE `basename "$$dst"` && $(RM_F) "$$dst" + REMOVE_F1 = && echo ' ' REMOVE `basename "$$dst"` && $(RM_RF) "$$dst" endif TCL_PATH ?= tclsh TCLTK_PATH ?= wish +TKFRAMEWORK = /Library/Frameworks/Tk.framework/Resources/Wish.app ifeq ($(findstring $(MAKEFLAGS),s),s) QUIET_GEN = -QUIET_BUILT_IN = endif DESTDIR_SQ = $(subst ','\'',$(DESTDIR)) @@ -105,6 +109,7 @@ exedir = $(dir $(gitexecdir))share/git-gui/lib GITGUI_SCRIPT := $$0 GITGUI_RELATIVE := +GITGUI_MACOSXAPP := ifeq ($(exedir),$(gg_libdir)) GITGUI_RELATIVE := 1 @@ -116,8 +121,51 @@ ifeq ($(uname_O),Cygwin) gg_libdir := $(shell cygpath --windows --absolute "$(gg_libdir)") endif endif +ifeq ($(uname_S),Darwin) + ifeq ($(shell test -d $(TKFRAMEWORK) && echo y),y) + GITGUI_MACOSXAPP := YesPlease + endif +endif -$(patsubst %.sh,%,$(SCRIPT_SH)) : % : %.sh +ifdef GITGUI_MACOSXAPP +GITGUI_MAIN := git-gui.tcl + +git-gui: GIT-VERSION-FILE GIT-GUI-VARS + $(QUIET_GEN)rm -f $@ $@+ && \ + echo '#!$(SHELL_PATH_SQ)' >$@+ && \ + echo 'if test "z$$*" = zversion ||' >>$@+ && \ + echo ' test "z$$*" = z--version' >>$@+ && \ + echo then >>$@+ && \ + echo ' 'echo \'git-gui version '$(GITGUI_VERSION)'\' >>$@+ && \ + echo else >>$@+ && \ + echo ' 'exec \''$(libdir_SQ)/Git Gui.app/Contents/MacOS/Wish'\' \ + '"$$0" "$$@"' >>$@+ && \ + echo fi >>$@+ && \ + chmod +x $@+ && \ + mv $@+ $@ + +Git\ Gui.app: GIT-VERSION-FILE GIT-GUI-VARS \ + macosx/Info.plist \ + macosx/git-gui.icns \ + macosx/AppMain.tcl \ + $(TKFRAMEWORK)/Contents/MacOS/Wish + $(QUIET_GEN)rm -rf '$@' '$@'+ && \ + mkdir -p '$@'+/Contents/MacOS && \ + mkdir -p '$@'+/Contents/Resources/Scripts && \ + cp '$(subst ','\'',$(TKFRAMEWORK))/Contents/MacOS/Wish' \ + '$@'+/Contents/MacOS && \ + cp macosx/git-gui.icns '$@'+/Contents/Resources && \ + sed -e 's/@@GITGUI_VERSION@@/$(GITGUI_VERSION)/g' \ + macosx/Info.plist \ + >'$@'+/Contents/Info.plist && \ + sed -e 's|@@gitexecdir@@|$(gitexecdir_SQ)|' \ + -e 's|@@GITGUI_LIBDIR@@|$(libdir_SED)|' \ + macosx/AppMain.tcl \ + >'$@'+/Contents/Resources/Scripts/AppMain.tcl && \ + mv '$@'+ '$@' +endif + +$(GITGUI_MAIN): git-gui.sh GIT-VERSION-FILE GIT-GUI-VARS $(QUIET_GEN)rm -f $@ $@+ && \ sed -e '1s|#!.*/sh|#!$(SHELL_PATH_SQ)|' \ -e '1,30s|^ argv0=$$0| argv0=$(GITGUI_SCRIPT)|' \ @@ -125,13 +173,10 @@ $(patsubst %.sh,%,$(SCRIPT_SH)) : % : %.sh -e 's/@@GITGUI_VERSION@@/$(GITGUI_VERSION)/g' \ -e 's|@@GITGUI_RELATIVE@@|$(GITGUI_RELATIVE)|' \ -e '$(GITGUI_RELATIVE)s|@@GITGUI_LIBDIR@@|$(libdir_SED)|' \ - $@.sh >$@+ && \ + git-gui.sh >$@+ && \ chmod +x $@+ && \ mv $@+ $@ -$(GITGUI_BUILT_INS): git-gui - $(QUIET_BUILT_IN)rm -f $@ && ln git-gui $@ - XGETTEXT ?= xgettext ifdef NO_MSGFMT MSGFMT ?= $(TCL_PATH) po/po2msg.sh @@ -152,7 +197,7 @@ update-po:: $(PO_TEMPLATE) $(ALL_MSGFILES): %.msg : %.po $(QUIET_MSGFMT0)$(MSGFMT) --statistics --tcl $< -l $(basename $(notdir $<)) -d $(dir $@) $(QUIET_MSGFMT1) -lib/tclIndex: $(ALL_LIBFILES) +lib/tclIndex: $(ALL_LIBFILES) GIT-GUI-VARS $(QUIET_INDEX)if echo \ $(foreach p,$(PRELOAD_FILES),source $p\;) \ auto_mkindex lib '*.tcl' \ @@ -166,16 +211,13 @@ lib/tclIndex: $(ALL_LIBFILES) echo >>$@ ; \ fi -# These can record GITGUI_VERSION -$(patsubst %.sh,%,$(SCRIPT_SH)): GIT-VERSION-FILE GIT-GUI-VARS -lib/tclIndex: GIT-GUI-VARS - TRACK_VARS = \ $(subst ','\'',SHELL_PATH='$(SHELL_PATH_SQ)') \ $(subst ','\'',TCL_PATH='$(TCL_PATH_SQ)') \ $(subst ','\'',TCLTK_PATH='$(TCLTK_PATH_SQ)') \ $(subst ','\'',gitexecdir='$(gitexecdir_SQ)') \ $(subst ','\'',gg_libdir='$(libdir_SQ)') \ + GITGUI_MACOSXAPP=$(GITGUI_MACOSXAPP) \ #end TRACK_VARS GIT-GUI-VARS: .FORCE-GIT-GUI-VARS @@ -185,7 +227,10 @@ GIT-GUI-VARS: .FORCE-GIT-GUI-VARS echo 1>$@ "$$VARS"; \ fi -all:: $(ALL_PROGRAMS) lib/tclIndex $(ALL_MSGFILES) +ifdef GITGUI_MACOSXAPP +all:: git-gui Git\ Gui.app +endif +all:: $(GITGUI_MAIN) lib/tclIndex $(ALL_MSGFILES) install: all $(QUIET)$(INSTALL_D0)'$(DESTDIR_SQ)$(gitexecdir_SQ)' $(INSTALL_D1) @@ -194,6 +239,10 @@ install: all $(QUIET)$(INSTALL_D0)'$(DESTDIR_SQ)$(libdir_SQ)' $(INSTALL_D1) $(QUIET)$(INSTALL_R0)lib/tclIndex $(INSTALL_R1) '$(DESTDIR_SQ)$(libdir_SQ)' $(QUIET)$(INSTALL_R0)lib/git-gui.ico $(INSTALL_R1) '$(DESTDIR_SQ)$(libdir_SQ)' +ifdef GITGUI_MACOSXAPP + $(QUIET)$(INSTALL_A0)'Git Gui.app' $(INSTALL_A1) '$(DESTDIR_SQ)$(libdir_SQ)' + $(QUIET)$(INSTALL_X0)git-gui.tcl $(INSTALL_X1) '$(DESTDIR_SQ)$(libdir_SQ)' +endif $(QUIET)$(foreach p,$(ALL_LIBFILES), $(INSTALL_R0)$p $(INSTALL_R1) '$(DESTDIR_SQ)$(libdir_SQ)' &&) true $(QUIET)$(INSTALL_D0)'$(DESTDIR_SQ)$(msgsdir_SQ)' $(INSTALL_D1) $(QUIET)$(foreach p,$(ALL_MSGFILES), $(INSTALL_R0)$p $(INSTALL_R1) '$(DESTDIR_SQ)$(msgsdir_SQ)' &&) true @@ -205,6 +254,10 @@ uninstall: $(QUIET)$(CLEAN_DST) '$(DESTDIR_SQ)$(libdir_SQ)' $(QUIET)$(REMOVE_F0)'$(DESTDIR_SQ)$(libdir_SQ)'/tclIndex $(REMOVE_F1) $(QUIET)$(REMOVE_F0)'$(DESTDIR_SQ)$(libdir_SQ)'/git-gui.ico $(REMOVE_F1) +ifdef GITGUI_MACOSXAPP + $(QUIET)$(REMOVE_F0)'$(DESTDIR_SQ)$(libdir_SQ)/Git Gui.app' $(REMOVE_F1) + $(QUIET)$(REMOVE_F0)'$(DESTDIR_SQ)$(libdir_SQ)'/git-gui.tcl $(REMOVE_F1) +endif $(QUIET)$(foreach p,$(ALL_LIBFILES), $(REMOVE_F0)'$(DESTDIR_SQ)$(libdir_SQ)'/$(notdir $p) $(REMOVE_F1) &&) true $(QUIET)$(CLEAN_DST) '$(DESTDIR_SQ)$(msgsdir_SQ)' $(QUIET)$(foreach p,$(ALL_MSGFILES), $(REMOVE_F0)'$(DESTDIR_SQ)$(msgsdir_SQ)'/$(notdir $p) $(REMOVE_F1) &&) true @@ -218,8 +271,11 @@ dist-version: @echo $(GITGUI_VERSION) > $(TARDIR)/version clean:: - rm -f $(ALL_PROGRAMS) lib/tclIndex po/*.msg - rm -f GIT-VERSION-FILE GIT-GUI-VARS + $(RM_RF) $(GITGUI_MAIN) lib/tclIndex po/*.msg + $(RM_RF) GIT-VERSION-FILE GIT-GUI-VARS +ifdef GITGUI_MACOSXAPP + $(RM_RF) 'Git Gui.app'* git-gui +endif .PHONY: all install uninstall dist-version clean .PHONY: .FORCE-GIT-VERSION-FILE diff --git a/macosx/AppMain.tcl b/macosx/AppMain.tcl new file mode 100644 index 0000000000..41ca08e2b7 --- /dev/null +++ b/macosx/AppMain.tcl @@ -0,0 +1,22 @@ +set gitexecdir {@@gitexecdir@@} +set gitguilib {@@GITGUI_LIBDIR@@} +set env(PATH) "$gitexecdir:$env(PATH)" + +if {[string first -psn [lindex $argv 0]] == 0} { + lset argv 0 [file join $gitexecdir git-gui] +} + +if {[file tail [lindex $argv 0]] eq {gitk}} { + set argv0 [file join $gitexecdir gitk] + set AppMain_source $argv0 +} else { + set argv0 [file join $gitexecdir [file tail [lindex $argv 0]]] + set AppMain_source [file join $gitguilib git-gui.tcl] + if {[pwd] eq {/}} { + cd $env(HOME) + } +} + +unset gitexecdir gitguilib +set argv [lrange $argv 1 end] +source $AppMain_source diff --git a/macosx/Info.plist b/macosx/Info.plist new file mode 100644 index 0000000000..99913ec57a --- /dev/null +++ b/macosx/Info.plist @@ -0,0 +1,28 @@ + + + + + CFBundleDevelopmentRegion + English + CFBundleExecutable + Wish + CFBundleGetInfoString + Git Gui @@GITGUI_VERSION@@ © 2006-2007 Shawn Pearce, et. al. + CFBundleIconFile + git-gui.icns + CFBundleIdentifier + cz.or.repo.git-gui + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + Git Gui + CFBundlePackageType + APPL + CFBundleShortVersionString + @@GITGUI_VERSION@@ + CFBundleSignature + GITg + CFBundleVersion + @@GITGUI_VERSION@@ + + diff --git a/macosx/git-gui.icns b/macosx/git-gui.icns new file mode 100644 index 0000000000000000000000000000000000000000..77d88a77a7669667335cf6fd5767c8b40f3ce6e7 GIT binary patch literal 28866 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 Nz0Ou^eG{dB_&*a;BD4Si literal 0 HcwPel00001 -- 2.11.4.GIT