From 3271d2e9e71678cdc22378b1fd58c07641f8c424 Mon Sep 17 00:00:00 2001 From: Patrick Steinhardt Date: Mon, 12 May 2025 11:25:05 +0200 Subject: [PATCH 01/10] git-gui: replace GIT-GUI-VARS with GIT-GUI-BUILD-OPTIONS The GIT-GUI-VARS file is used to track whether any of our build options has changed. Unfortunately, the format of that file does not allow us to propagate those build options to other scripts. But as we are about to introduce support for the Meson build system, we will extract a couple of scripts to deduplicate core build logic across Makefiles and Meson. With this refactoring, it will become necessary to make build options more widely accessible. Replace GIT-GUI-VARS with a new GIT-GUI-BUILD-OPTIONS file that is being populated from a template. This file can easily be sourced from build scripts in subsequent steps. Signed-off-by: Patrick Steinhardt --- .gitignore | 2 +- GIT-GUI-BUILD-OPTIONS.in | 6 ++++++ Makefile | 36 ++++++++++++++++-------------------- 3 files changed, 23 insertions(+), 21 deletions(-) create mode 100644 GIT-GUI-BUILD-OPTIONS.in diff --git a/.gitignore b/.gitignore index 6483b21..ff6e0be 100644 --- a/.gitignore +++ b/.gitignore @@ -2,7 +2,7 @@ config.mak Git Gui.app* git-gui.tcl +GIT-GUI-BUILD-OPTIONS GIT-VERSION-FILE -GIT-GUI-VARS git-gui lib/tclIndex diff --git a/GIT-GUI-BUILD-OPTIONS.in b/GIT-GUI-BUILD-OPTIONS.in new file mode 100644 index 0000000..3c112af --- /dev/null +++ b/GIT-GUI-BUILD-OPTIONS.in @@ -0,0 +1,6 @@ +GITGUI_GITEXECDIR=@GITGUI_GITEXECDIR@ +GITGUI_LIBDIR=@GITGUI_LIBDIR@ +GITGUI_RELATIVE=@GITGUI_RELATIVE@ +SHELL_PATH=@SHELL_PATH@ +TCLTK_PATH=@TCLTK_PATH@ +TCL_PATH=@TCL_PATH@ diff --git a/Makefile b/Makefile index 9f9389a..f4f9896 100644 --- a/Makefile +++ b/Makefile @@ -158,7 +158,7 @@ endif ifdef GITGUI_MACOSXAPP GITGUI_MAIN := git-gui.tcl -git-gui: GIT-VERSION-FILE GIT-GUI-VARS +git-gui: GIT-VERSION-FILE GIT-GUI-BUILD-OPTIONS $(QUIET_GEN)rm -f $@ $@+ && \ echo '#!$(SHELL_PATH_SQ)' >$@+ && \ echo 'if test "z$$*" = zversion ||' >>$@+ && \ @@ -173,7 +173,7 @@ git-gui: GIT-VERSION-FILE GIT-GUI-VARS chmod +x $@+ && \ mv $@+ $@ -Git\ Gui.app: GIT-VERSION-FILE GIT-GUI-VARS \ +Git\ Gui.app: GIT-VERSION-FILE GIT-GUI-BUILD-OPTIONS \ macosx/Info.plist \ macosx/git-gui.icns \ macosx/AppMain.tcl \ @@ -202,7 +202,7 @@ git-gui: windows/git-gui.sh cp $< $@ endif -$(GITGUI_MAIN): git-gui.sh GIT-VERSION-FILE GIT-GUI-VARS +$(GITGUI_MAIN): git-gui.sh GIT-VERSION-FILE GIT-GUI-BUILD-OPTIONS $(QUIET_GEN)rm -f $@ $@+ && \ sed -e '1s|#!.*/sh|#!$(SHELL_PATH_SQ)|' \ -e 's|@@SHELL_PATH@@|$(SHELL_PATH_SQ)|' \ @@ -238,7 +238,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) GIT-GUI-VARS +lib/tclIndex: $(ALL_LIBFILES) GIT-GUI-BUILD-OPTIONS $(QUIET_INDEX)if echo \ $(foreach p,$(PRELOAD_FILES),source $p\;) \ auto_mkindex lib $(patsubst lib/%,%,$(sort $(ALL_LIBFILES))) \ @@ -252,21 +252,17 @@ lib/tclIndex: $(ALL_LIBFILES) GIT-GUI-VARS echo >>$@ ; \ fi -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 - @VARS='$(TRACK_VARS)'; \ - if test x"$$VARS" != x"`cat $@ 2>/dev/null`" ; then \ - echo >&2 " * new locations or Tcl/Tk interpreter"; \ - echo >$@ "$$VARS"; \ - fi +GIT-GUI-BUILD-OPTIONS: FORCE + @sed \ + -e 's|@GITGUI_GITEXECDIR@|$(gitexecdir_SQ)|' \ + -e 's|@GITGUI_LIBDIR@|$(libdir_SQ)|' \ + -e 's|@GITGUI_RELATIVE@|$(GITGUI_RELATIVE)|' \ + -e 's|@SHELL_PATH@|$(SHELL_PATH_SQ)|' \ + -e 's|@TCLTK_PATH@|$(TCLTK_PATH_SQ)|' \ + -e 's|@TCL_PATH@|$(TCL_PATH_SQ)|' \ + $@.in >$@+ + @if grep -q '^[A-Z][A-Z_]*=@.*@$$' $@+; then echo "Unsubstituted build options in $@" >&2 && exit 1; fi + @if cmp $@+ $@ >/dev/null 2>&1; then $(RM) $@+; else mv $@+ $@; fi ifdef GITGUI_MACOSXAPP all:: git-gui Git\ Gui.app @@ -322,7 +318,7 @@ dist-version: clean:: $(RM_RF) $(GITGUI_MAIN) lib/tclIndex po/*.msg $(PO_TEMPLATE) - $(RM_RF) GIT-VERSION-FILE GIT-GUI-VARS + $(RM_RF) GIT-VERSION-FILE GIT-GUI-BUILD-OPTIONS ifdef GITGUI_MACOSXAPP $(RM_RF) 'Git Gui.app'* git-gui endif From 3ef470fa5127b9858d203990211f4375d38d5dd6 Mon Sep 17 00:00:00 2001 From: Patrick Steinhardt Date: Tue, 11 Mar 2025 11:06:37 +0100 Subject: [PATCH 02/10] git-gui: prepare GIT-VERSION-GEN for out-of-tree builds The GIT-VERSION-GEN unconditionally writes version information into the source directory in the form of the "GIT-VERSION-FILE". We are about to introduce the Meson build system though, which enforces out-of-tree builds by default, and in that context we cannot continue to write version information into the source tree. Prepare the script for out-of-tree builds by treating the source directory different from the output file. Signed-off-by: Patrick Steinhardt --- GIT-VERSION-GEN | 42 ++++++++++++++++++++++++++++-------------- Makefile | 2 +- 2 files changed, 29 insertions(+), 15 deletions(-) diff --git a/GIT-VERSION-GEN b/GIT-VERSION-GEN index 92373d2..e40a09b 100755 --- a/GIT-VERSION-GEN +++ b/GIT-VERSION-GEN @@ -1,19 +1,33 @@ #!/bin/sh -GVF=GIT-VERSION-FILE DEF_VER=0.21.GITGUI LF=' ' +if test "$#" -ne 2 +then + echo >&2 "usage: $0 " + exit 1 +fi + +SOURCE_DIR="$1" +OUTPUT="$2" + +# Protect us from reading Git version information outside of the Git directory +# in case it is not a repository itself, but embedded in an unrelated +# repository. +GIT_CEILING_DIRECTORIES="$SOURCE_DIR/.." +export GIT_CEILING_DIRECTORIES + tree_search () { head=$1 tree=$2 - for p in $(git rev-list --parents --max-count=1 $head 2>/dev/null) + for p in $(git -C "$SOURCE_DIR" rev-list --parents --max-count=1 $head 2>/dev/null) do - test $tree = $(git rev-parse $p^{tree} 2>/dev/null) && - vn=$(git describe --abbrev=4 $p 2>/dev/null) && + test $tree = $(git -C "$SOURCE_DIR" rev-parse $p^{tree} 2>/dev/null) && + vn=$(git -C "$SOURCE_DIR" describe --abbrev=4 $p 2>/dev/null) && case "$vn" in gitgui-[0-9]*) echo $vn; break;; esac @@ -34,14 +48,14 @@ tree_search () # If we are at the toplevel or the merge assumption fails # try looking for a gitgui-* tag. -if test -f version && - VN=$(cat version) +if test -f "$SOURCE_DIR"/version && + VN=$(cat "$SOURCE_DIR"/version) then : happy -elif prefix="$(git rev-parse --show-prefix 2>/dev/null)" +elif prefix="$(git -C "$SOURCE_DIR" rev-parse --show-prefix 2>/dev/null)" test -n "$prefix" && - head=$(git rev-list --max-count=1 HEAD -- . 2>/dev/null) && - tree=$(git rev-parse --verify "HEAD:$prefix" 2>/dev/null) && + head=$(git -C "$SOURCE_DIR" rev-list --max-count=1 HEAD -- . 2>/dev/null) && + tree=$(git -C "$SOURCE_DIR" rev-parse --verify "HEAD:$prefix" 2>/dev/null) && VN=$(tree_search $head $tree) case "$VN" in gitgui-[0-9]*) : happy ;; @@ -49,7 +63,7 @@ elif prefix="$(git rev-parse --show-prefix 2>/dev/null)" esac then VN=$(echo "$VN" | sed -e 's/^gitgui-//;s/-/./g'); -elif VN=$(git describe --abbrev=4 HEAD 2>/dev/null) && +elif VN=$(git -C "$SOURCE_DIR" describe --abbrev=4 HEAD 2>/dev/null) && case "$VN" in gitgui-[0-9]*) : happy ;; *) (exit 1) ;; @@ -60,7 +74,7 @@ else VN="$DEF_VER" fi -dirty=$(sh -c 'git diff-index --name-only HEAD' 2>/dev/null) || dirty= +dirty=$(git -C "$SOURCE_DIR" diff-index --name-only HEAD 2>/dev/null) || dirty= case "$dirty" in '') ;; @@ -68,13 +82,13 @@ case "$dirty" in VN="$VN-dirty" ;; esac -if test -r $GVF +if test -r "$OUTPUT" then - VC=$(sed -e 's/^GITGUI_VERSION = //' <$GVF) + VC=$(sed -e 's/^GITGUI_VERSION = //' <"$OUTPUT") else VC=unset fi test "$VN" = "$VC" || { echo >&2 "GITGUI_VERSION = $VN" - echo "GITGUI_VERSION = $VN" >$GVF + echo "GITGUI_VERSION = $VN" >"$OUTPUT" } diff --git a/Makefile b/Makefile index f4f9896..ea22b3a 100644 --- a/Makefile +++ b/Makefile @@ -8,7 +8,7 @@ all:: # GIT-VERSION-FILE: FORCE - @$(SHELL_PATH) ./GIT-VERSION-GEN + @$(SHELL_PATH) ./GIT-VERSION-GEN . $@ ifneq ($(MAKECMDGOALS),clean) -include GIT-VERSION-FILE endif From caf5fbe9af77488175b5baf2404b1bb6d4d78653 Mon Sep 17 00:00:00 2001 From: Patrick Steinhardt Date: Mon, 12 May 2025 11:27:37 +0200 Subject: [PATCH 03/10] git-gui: make output of GIT-VERSION-GEN source'able The output of GIT-VERSION-GEN can be sourced by our Makefile to make the version available there. The output has a couple of spaces around the equals sign, which is perfectly valid for parsing it in our Makefile. But in subsequent steps we'll also want to source the file in a couple of newly-introduced shell scripts, but having spaces around variable assignments is invalid there. Prepare for this step by dropping the spaces surrounding the equals sign. Like this, we can easily use the same file both in our Makefile and in shell scripts. Signed-off-by: Patrick Steinhardt --- GIT-VERSION-GEN | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/GIT-VERSION-GEN b/GIT-VERSION-GEN index e40a09b..c2767b4 100755 --- a/GIT-VERSION-GEN +++ b/GIT-VERSION-GEN @@ -84,11 +84,11 @@ esac if test -r "$OUTPUT" then - VC=$(sed -e 's/^GITGUI_VERSION = //' <"$OUTPUT") + VC=$(sed -e 's/^GITGUI_VERSION=//' <"$OUTPUT") else VC=unset fi test "$VN" = "$VC" || { - echo >&2 "GITGUI_VERSION = $VN" - echo "GITGUI_VERSION = $VN" >"$OUTPUT" + echo >&2 "GITGUI_VERSION=$VN" + echo "GITGUI_VERSION=$VN" >"$OUTPUT" } From 3e656a43567b7d0f82e99d56b1a268feb789abff Mon Sep 17 00:00:00 2001 From: Patrick Steinhardt Date: Tue, 11 Mar 2025 11:07:08 +0100 Subject: [PATCH 04/10] git-gui: drop no-op GITGUI_SCRIPT replacement The value of the GITGUI_SCRIPT variable is only used in a single place as part of an sed(1) script that massages the "git-gui.sh" script. Interestingly, this specific replacement does seem to be a no-op: we replace "^ argv0=$$0" with " argv=$(GITGUI_SCRIPT)", which has a value of "$$0". The result would thus be completely unchanged. Drop the replacement and its variable. Signed-off-by: Patrick Steinhardt --- Makefile | 2 -- 1 file changed, 2 deletions(-) diff --git a/Makefile b/Makefile index ea22b3a..1cbb16a 100644 --- a/Makefile +++ b/Makefile @@ -134,7 +134,6 @@ libdir_SQ = $(subst ','\'',$(gg_libdir)) libdir_SED = $(subst ','\'',$(subst \,\\,$(gg_libdir_sed_in))) exedir = $(dir $(gitexecdir))share/git-gui/lib -GITGUI_SCRIPT := $$0 GITGUI_RELATIVE := GITGUI_MACOSXAPP := @@ -206,7 +205,6 @@ $(GITGUI_MAIN): git-gui.sh GIT-VERSION-FILE GIT-GUI-BUILD-OPTIONS $(QUIET_GEN)rm -f $@ $@+ && \ sed -e '1s|#!.*/sh|#!$(SHELL_PATH_SQ)|' \ -e 's|@@SHELL_PATH@@|$(SHELL_PATH_SQ)|' \ - -e '1,30s|^ argv0=$$0| argv0=$(GITGUI_SCRIPT)|' \ -e '1,30s|^ exec wish | exec '\''$(TCLTK_PATH_SED)'\'' |' \ -e 's/@@GITGUI_VERSION@@/$(GITGUI_VERSION)/g' \ -e 's|@@GITGUI_RELATIVE@@|$(GITGUI_RELATIVE)|' \ From 854e88335a3e68af46f62ce72037293920bd06f2 Mon Sep 17 00:00:00 2001 From: Patrick Steinhardt Date: Tue, 11 Mar 2025 11:07:19 +0100 Subject: [PATCH 05/10] git-gui: extract script to generate "git-gui" Extract script to generate "git-gui". This change allows us to reuse the build logic with the Meson build system. Signed-off-by: Patrick Steinhardt --- Makefile | 12 +----------- generate-git-gui.sh | 29 +++++++++++++++++++++++++++++ 2 files changed, 30 insertions(+), 11 deletions(-) create mode 100755 generate-git-gui.sh diff --git a/Makefile b/Makefile index 1cbb16a..58a65db 100644 --- a/Makefile +++ b/Makefile @@ -127,7 +127,6 @@ gitexecdir_SQ = $(subst ','\'',$(gitexecdir)) SHELL_PATH_SQ = $(subst ','\'',$(SHELL_PATH)) TCL_PATH_SQ = $(subst ','\'',$(TCL_PATH)) TCLTK_PATH_SQ = $(subst ','\'',$(TCLTK_PATH)) -TCLTK_PATH_SED = $(subst ','\'',$(subst \,\\,$(TCLTK_PATH))) gg_libdir ?= $(sharedir)/git-gui/lib libdir_SQ = $(subst ','\'',$(gg_libdir)) @@ -202,16 +201,7 @@ git-gui: windows/git-gui.sh endif $(GITGUI_MAIN): git-gui.sh GIT-VERSION-FILE GIT-GUI-BUILD-OPTIONS - $(QUIET_GEN)rm -f $@ $@+ && \ - sed -e '1s|#!.*/sh|#!$(SHELL_PATH_SQ)|' \ - -e 's|@@SHELL_PATH@@|$(SHELL_PATH_SQ)|' \ - -e '1,30s|^ exec wish | exec '\''$(TCLTK_PATH_SED)'\'' |' \ - -e 's/@@GITGUI_VERSION@@/$(GITGUI_VERSION)/g' \ - -e 's|@@GITGUI_RELATIVE@@|$(GITGUI_RELATIVE)|' \ - -e '$(GITGUI_RELATIVE)s|@@GITGUI_LIBDIR@@|$(libdir_SED)|' \ - git-gui.sh >$@+ && \ - chmod +x $@+ && \ - mv $@+ $@ + $(QUIET_GEN)$(SHELL_PATH) generate-git-gui.sh "$<" "$@" ./GIT-GUI-BUILD-OPTIONS ./GIT-VERSION-FILE XGETTEXT ?= xgettext ifdef NO_MSGFMT diff --git a/generate-git-gui.sh b/generate-git-gui.sh new file mode 100755 index 0000000..39dfafd --- /dev/null +++ b/generate-git-gui.sh @@ -0,0 +1,29 @@ +#!/bin/sh + +set -e + +if test "$#" -ne 4 +then + echo >&2 "usage: $0 " + exit 1 +fi + +INPUT="$1" +OUTPUT="$2" +BUILD_OPTIONS="$3" +VERSION_FILE="$4" + +. "${BUILD_OPTIONS}" +. "${VERSION_FILE}" + +rm -f "$OUTPUT" "$OUTPUT+" +sed \ + -e "1s|#!.*/sh|#!$SHELL_PATH|" \ + -e "s|@@SHELL_PATH@@|$SHELL_PATH|" \ + -e "1,30s|^ exec wish | exec '$TCLTK_PATH' |" \ + -e "s|@@GITGUI_VERSION@@|$GITGUI_VERSION|g" \ + -e "s|@@GITGUI_RELATIVE@@|$GITGUI_RELATIVE|" \ + -e "${GITGUI_RELATIVE}s|@@GITGUI_LIBDIR@@|$GITGUI_LIBDIR|" \ + "$INPUT" >"$OUTPUT"+ +chmod +x "$OUTPUT"+ +mv "$OUTPUT"+ "$OUTPUT" From 2cc5b0facfa4781b7dd4d572bdf22ec448054023 Mon Sep 17 00:00:00 2001 From: Patrick Steinhardt Date: Tue, 11 Mar 2025 11:07:19 +0100 Subject: [PATCH 06/10] git-gui: extract script to generate "tclIndex" Extract script to generate "tclIndex". This change allows us to reuse the build logic with the Meson build system. Signed-off-by: Patrick Steinhardt --- Makefile | 16 ++-------------- generate-tclindex.sh | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+), 14 deletions(-) create mode 100755 generate-tclindex.sh diff --git a/Makefile b/Makefile index 58a65db..5166bba 100644 --- a/Makefile +++ b/Makefile @@ -75,7 +75,6 @@ ifndef V 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' - QUIET_2DEVNULL = 2>/dev/null INSTALL_D0 = dir= INSTALL_D1 = && echo ' ' DEST $$dir && $(INSTALL) -d -m 755 "$$dir" @@ -226,19 +225,8 @@ update-po:: $(PO_TEMPLATE) $(ALL_MSGFILES): %.msg : %.po $(QUIET_MSGFMT0)$(MSGFMT) --statistics --tcl -l $(basename $(notdir $<)) -d $(dir $@) $< $(QUIET_MSGFMT1) -lib/tclIndex: $(ALL_LIBFILES) GIT-GUI-BUILD-OPTIONS - $(QUIET_INDEX)if echo \ - $(foreach p,$(PRELOAD_FILES),source $p\;) \ - auto_mkindex lib $(patsubst lib/%,%,$(sort $(ALL_LIBFILES))) \ - | $(TCL_PATH) $(QUIET_2DEVNULL); then : ok; \ - else \ - echo >&2 " * $(TCL_PATH) failed; using unoptimized loading"; \ - rm -f $@ ; \ - echo '# Autogenerated by git-gui Makefile' >$@ && \ - echo >>$@ && \ - $(foreach p,$(PRELOAD_FILES) $(sort $(ALL_LIBFILES)),echo '$(subst lib/,,$p)' >>$@ &&) \ - echo >>$@ ; \ - fi +lib/tclIndex: $(ALL_LIBFILES) generate-tclindex.sh GIT-GUI-BUILD-OPTIONS + $(QUIET_INDEX)$(SHELL_PATH) generate-tclindex.sh . ./GIT-GUI-BUILD-OPTIONS $(ALL_LIBFILES) GIT-GUI-BUILD-OPTIONS: FORCE @sed \ diff --git a/generate-tclindex.sh b/generate-tclindex.sh new file mode 100755 index 0000000..36e3a0b --- /dev/null +++ b/generate-tclindex.sh @@ -0,0 +1,32 @@ +#!/bin/sh + +if test "$#" -lt 3 +then + echo >&2 "usage: $0 [...]" + exit 1 +fi + +BUILD_DIR="$1" +BUILD_OPTIONS="$2" +shift 2 +LIBFILES="$(echo "$@" | sort | sed 's|lib/||g')" + +. "$BUILD_OPTIONS" + +cd "$BUILD_DIR" + +if { + echo "source lib/class.tcl;" + echo "auto_mkindex lib $LIBFILES" +} | "$TCL_PATH" +then + : ok +else + echo >&2 " * $TCL_PATH failed; using unoptimized loading" + rm -f $@ + echo '# Autogenerated by git-gui Makefile' >lib/tclIndex + echo >>lib/tclIndex + echo "class.tcl" >>lib/tclIndex + printf "%s\n" $LIBFILES >>lib/tclIndex + echo >>lib/tclIndex +fi From 743e1cbd7e2b26380be25cd73ded57b08cb6b409 Mon Sep 17 00:00:00 2001 From: Patrick Steinhardt Date: Tue, 11 Mar 2025 11:07:19 +0100 Subject: [PATCH 07/10] git-gui: extract script to generate macOS wrapper Extract script to generate the macOS wrapper for git-gui. This change allows us to reuse the build logic with the Meson build system. Signed-off-by: Patrick Steinhardt --- GIT-GUI-BUILD-OPTIONS.in | 1 + Makefile | 18 ++++-------------- generate-macos-wrapper.sh | 35 +++++++++++++++++++++++++++++++++++ 3 files changed, 40 insertions(+), 14 deletions(-) create mode 100755 generate-macos-wrapper.sh diff --git a/GIT-GUI-BUILD-OPTIONS.in b/GIT-GUI-BUILD-OPTIONS.in index 3c112af..5fd885c 100644 --- a/GIT-GUI-BUILD-OPTIONS.in +++ b/GIT-GUI-BUILD-OPTIONS.in @@ -4,3 +4,4 @@ GITGUI_RELATIVE=@GITGUI_RELATIVE@ SHELL_PATH=@SHELL_PATH@ TCLTK_PATH=@TCLTK_PATH@ TCL_PATH=@TCL_PATH@ +TKEXECUTABLE=@TKEXECUTABLE@ diff --git a/Makefile b/Makefile index 5166bba..722df4a 100644 --- a/Makefile +++ b/Makefile @@ -113,6 +113,7 @@ ifeq ($(uname_S),Darwin) endif endif TKEXECUTABLE = $(shell basename "$(TKFRAMEWORK)" .app) + TKEXECUTABLE_SQ = $(subst ','\'',$(TKEXECUTABLE)) endif ifeq ($(findstring $(firstword -$(MAKEFLAGS)),s),s) @@ -155,20 +156,8 @@ endif ifdef GITGUI_MACOSXAPP GITGUI_MAIN := git-gui.tcl -git-gui: GIT-VERSION-FILE GIT-GUI-BUILD-OPTIONS - $(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 ' libdir="$${GIT_GUI_LIB_DIR:-$(libdir_SQ)}"' >>$@+ && \ - echo ' 'exec \"'$$libdir/Git Gui.app/Contents/MacOS/$(subst \,,$(TKEXECUTABLE))'\" \ - '"$$0" "$$@"' >>$@+ && \ - echo fi >>$@+ && \ - chmod +x $@+ && \ - mv $@+ $@ +git-gui: generate-macos-wrapper.sh GIT-VERSION-FILE GIT-GUI-BUILD-OPTIONS + $(QUIET_GEN)$(SHELL_PATH) generate-macos-wrapper.sh "$@" ./GIT-GUI-BUILD-OPTIONS ./GIT-VERSION-FILE Git\ Gui.app: GIT-VERSION-FILE GIT-GUI-BUILD-OPTIONS \ macosx/Info.plist \ @@ -236,6 +225,7 @@ GIT-GUI-BUILD-OPTIONS: FORCE -e 's|@SHELL_PATH@|$(SHELL_PATH_SQ)|' \ -e 's|@TCLTK_PATH@|$(TCLTK_PATH_SQ)|' \ -e 's|@TCL_PATH@|$(TCL_PATH_SQ)|' \ + -e 's|@TKEXECUTABLE@|$(TKEXECUTABLE_SQ)|' \ $@.in >$@+ @if grep -q '^[A-Z][A-Z_]*=@.*@$$' $@+; then echo "Unsubstituted build options in $@" >&2 && exit 1; fi @if cmp $@+ $@ >/dev/null 2>&1; then $(RM) $@+; else mv $@+ $@; fi diff --git a/generate-macos-wrapper.sh b/generate-macos-wrapper.sh new file mode 100755 index 0000000..da7e478 --- /dev/null +++ b/generate-macos-wrapper.sh @@ -0,0 +1,35 @@ +#!/bin/sh + +set -e + +if test "$#" -ne 3 +then + echo >&2 "usage: $0 " + exit 1 +fi + +OUTPUT="$1" +BUILD_OPTIONS="$2" +VERSION_FILE="$3" + +. "$BUILD_OPTIONS" + +rm -f "$OUTPUT" "$OUTPUT+" + +( + echo "#!$SHELL_PATH" + cat "$BUILD_OPTIONS" "$VERSION_FILE" + cat <<-'EOF' + if test "z$*" = zversion || + test "z$*" = z--version + then + echo "git-gui version $GITGUI_VERSION" + else + libdir="${GIT_GUI_LIB_DIR:-$GITGUI_LIBDIR}" + exec "$libdir/Git Gui.app/Contents/MacOS/$TKEXECUTABLE" "$0" "$@" + fi + EOF +) >"$OUTPUT+" + +chmod +x "$OUTPUT+" +mv "$OUTPUT+" "$OUTPUT" From 28a8e5c8849e158abaf49d86b5ae7c9249d3e483 Mon Sep 17 00:00:00 2001 From: Patrick Steinhardt Date: Tue, 13 May 2025 08:48:07 +0200 Subject: [PATCH 08/10] git-gui: extract script to generate macOS app Extract script to generate the macOS app. This change allows us to reuse the build logic with the Meson build system. Note that as part of this change we also modify the TKEXECUTABLE variable to track its full path. Like this we don't have to propagate both the TKEXECUTABLE and TKFRAMEWORK variables into the script, and the basename can be trivially computed from TKEXECUTABLE anyway. Signed-off-by: Patrick Steinhardt --- Makefile | 22 +++------------------- generate-macos-app.sh | 30 ++++++++++++++++++++++++++++++ generate-macos-wrapper.sh | 2 +- 3 files changed, 34 insertions(+), 20 deletions(-) create mode 100755 generate-macos-app.sh diff --git a/Makefile b/Makefile index 722df4a..cde1b7e 100644 --- a/Makefile +++ b/Makefile @@ -112,7 +112,7 @@ ifeq ($(uname_S),Darwin) TKFRAMEWORK = /System/Library/Frameworks/Tk.framework/Resources/Wish\ Shell.app endif endif - TKEXECUTABLE = $(shell basename "$(TKFRAMEWORK)" .app) + TKEXECUTABLE = $(TKFRAMEWORK)/Contents/MacOS/$(shell basename "$(TKFRAMEWORK)" .app) TKEXECUTABLE_SQ = $(subst ','\'',$(TKEXECUTABLE)) endif @@ -130,7 +130,6 @@ TCLTK_PATH_SQ = $(subst ','\'',$(TCLTK_PATH)) gg_libdir ?= $(sharedir)/git-gui/lib libdir_SQ = $(subst ','\'',$(gg_libdir)) -libdir_SED = $(subst ','\'',$(subst \,\\,$(gg_libdir_sed_in))) exedir = $(dir $(gitexecdir))share/git-gui/lib GITGUI_RELATIVE := @@ -139,7 +138,6 @@ GITGUI_MACOSXAPP := ifeq ($(exedir),$(gg_libdir)) GITGUI_RELATIVE := 1 endif -gg_libdir_sed_in := $(gg_libdir) ifeq ($(uname_S),Darwin) ifeq ($(shell test -d $(TKFRAMEWORK) && echo y),y) GITGUI_MACOSXAPP := YesPlease @@ -163,22 +161,8 @@ Git\ Gui.app: GIT-VERSION-FILE GIT-GUI-BUILD-OPTIONS \ macosx/Info.plist \ macosx/git-gui.icns \ macosx/AppMain.tcl \ - $(TKFRAMEWORK)/Contents/MacOS/$(TKEXECUTABLE) - $(QUIET_GEN)rm -rf '$@' '$@'+ && \ - mkdir -p '$@'+/Contents/MacOS && \ - mkdir -p '$@'+/Contents/Resources/Scripts && \ - cp '$(subst ','\'',$(subst \,,$(TKFRAMEWORK)/Contents/MacOS/$(TKEXECUTABLE)))' \ - '$@'+/Contents/MacOS && \ - cp macosx/git-gui.icns '$@'+/Contents/Resources && \ - sed -e 's/@@GITGUI_VERSION@@/$(GITGUI_VERSION)/g' \ - -e 's/@@GITGUI_TKEXECUTABLE@@/$(TKEXECUTABLE)/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 '$@'+ '$@' + $(TKEXECUTABLE) + $(QUIET_GEN)$(SHELL_PATH) generate-macos-app.sh . "$@" ./GIT-GUI-BUILD-OPTIONS ./GIT-VERSION-FILE endif ifdef GITGUI_WINDOWS_WRAPPER diff --git a/generate-macos-app.sh b/generate-macos-app.sh new file mode 100755 index 0000000..71b9fa6 --- /dev/null +++ b/generate-macos-app.sh @@ -0,0 +1,30 @@ +#!/bin/sh + +set -e + +SOURCE_DIR="$1" +OUTPUT="$2" +BUILD_OPTIONS="$3" +VERSION_FILE="$4" + +. "$BUILD_OPTIONS" +. "$VERSION_FILE" + +rm -rf "$OUTPUT" "$OUTPUT+" + +mkdir -p "$OUTPUT+/Contents/MacOS" +mkdir -p "$OUTPUT+/Contents/Resources/Scripts" + +cp "$TKEXECUTABLE" "$OUTPUT+/Contents/MacOS" +cp "$SOURCE_DIR/macosx/git-gui.icns" "$OUTPUT+/Contents/Resources" +sed \ + -e "s/@@GITGUI_VERSION@@/$GITGUI_VERSION/g" \ + -e "s/@@GITGUI_TKEXECUTABLE@@/$(basename "$TKEXECUTABLE")/g" \ + "$SOURCE_DIR/macosx/Info.plist" \ + >"$OUTPUT+/Contents/Info.plist" +sed \ + -e "s|@@gitexecdir@@|$GITGUI_GITEXECDIR|" \ + -e "s|@@GITGUI_LIBDIR@@|$GITGUI_LIBDIR|" \ + "$SOURCE_DIR/macosx/AppMain.tcl" \ + >"$OUTPUT+/Contents/Resources/Scripts/AppMain.tcl" +mv "$OUTPUT+" "$OUTPUT" diff --git a/generate-macos-wrapper.sh b/generate-macos-wrapper.sh index da7e478..0304937 100755 --- a/generate-macos-wrapper.sh +++ b/generate-macos-wrapper.sh @@ -26,7 +26,7 @@ rm -f "$OUTPUT" "$OUTPUT+" echo "git-gui version $GITGUI_VERSION" else libdir="${GIT_GUI_LIB_DIR:-$GITGUI_LIBDIR}" - exec "$libdir/Git Gui.app/Contents/MacOS/$TKEXECUTABLE" "$0" "$@" + exec "$libdir/Git Gui.app/Contents/MacOS/$(basename "$TKEXECUTABLE")" "$0" "$@" fi EOF ) >"$OUTPUT+" From d821fc62691680df6454d62b4f9e9409086b2873 Mon Sep 17 00:00:00 2001 From: Patrick Steinhardt Date: Tue, 11 Mar 2025 11:26:48 +0100 Subject: [PATCH 09/10] git-gui: stop including GIT-VERSION-FILE file The "GITGUI_VERSION" variable is made available by generating and including the "GIT-VERSION-FILE" file. Its value has been used in various build steps, but in the preceding commits we have refactored those to instead source the "GIT-VERSION-FILE" directly. As a result, the variable is now only used in a single recipe, and this use can be trivially replaced with sed(1). Refactor the recipe to do so and stop including "GIT-VERSION-FILE" to simplify the build process. Signed-off-by: Patrick Steinhardt --- Makefile | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/Makefile b/Makefile index cde1b7e..315888f 100644 --- a/Makefile +++ b/Makefile @@ -9,9 +9,6 @@ all:: GIT-VERSION-FILE: FORCE @$(SHELL_PATH) ./GIT-VERSION-GEN . $@ -ifneq ($(MAKECMDGOALS),clean) --include GIT-VERSION-FILE -endif uname_S := $(shell sh -c 'uname -s 2>/dev/null || echo not') uname_O := $(shell sh -c 'uname -o 2>/dev/null || echo not') @@ -262,9 +259,9 @@ endif $(QUIET)$(REMOVE_D0)'$(DESTDIR_SQ)$(libdir_SQ)' $(REMOVE_D1) $(QUIET)$(REMOVE_D0)`dirname '$(DESTDIR_SQ)$(libdir_SQ)'` $(REMOVE_D1) -dist-version: +dist-version: GIT-VERSION-FILE @mkdir -p $(TARDIR) - @echo $(GITGUI_VERSION) > $(TARDIR)/version + @sed 's|^GITGUI_VERSION=||' $(TARDIR)/version clean:: $(RM_RF) $(GITGUI_MAIN) lib/tclIndex po/*.msg $(PO_TEMPLATE) From 8bf062dd147146c4bd76c7344ee5fcb5fbd0834c Mon Sep 17 00:00:00 2001 From: Patrick Steinhardt Date: Tue, 11 Mar 2025 11:09:23 +0100 Subject: [PATCH 10/10] git-gui: wire up support for the Meson build system The Git project has started to wire up Meson as a build system in Git v2.48.0. Wire up support for Meson in "git-gui" so that we can trivially include it as a subproject in Git. Signed-off-by: Patrick Steinhardt --- .gitattributes | 1 + lib/meson.build | 74 ++++++++++++++++++++++++ meson.build | 148 ++++++++++++++++++++++++++++++++++++++++++++++++ po/meson.build | 38 +++++++++++++ 4 files changed, 261 insertions(+) create mode 100644 lib/meson.build create mode 100644 meson.build create mode 100644 po/meson.build diff --git a/.gitattributes b/.gitattributes index 118d56c..889d582 100644 --- a/.gitattributes +++ b/.gitattributes @@ -4,3 +4,4 @@ git-gui.sh encoding=UTF-8 /po/*.po encoding=UTF-8 /GIT-VERSION-GEN eol=lf Makefile whitespace=!indent,trail,space +meson.build whitespace=space diff --git a/lib/meson.build b/lib/meson.build new file mode 100644 index 0000000..4b9efab --- /dev/null +++ b/lib/meson.build @@ -0,0 +1,74 @@ +libfiles = [ + 'about.tcl', + 'blame.tcl', + 'branch_checkout.tcl', + 'branch_create.tcl', + 'branch_delete.tcl', + 'branch_rename.tcl', + 'branch.tcl', + 'browser.tcl', + 'checkout_op.tcl', + 'choose_font.tcl', + 'choose_repository.tcl', + 'choose_rev.tcl', + 'chord.tcl', + 'class.tcl', + 'commit.tcl', + 'console.tcl', + 'database.tcl', + 'date.tcl', + 'diff.tcl', + 'encoding.tcl', + 'error.tcl', + 'index.tcl', + 'line.tcl', + 'logo.tcl', + 'merge.tcl', + 'mergetool.tcl', + 'option.tcl', + 'remote_add.tcl', + 'remote_branch_delete.tcl', + 'remote.tcl', + 'search.tcl', + 'shortcut.tcl', + 'spellcheck.tcl', + 'sshkey.tcl', + 'status_bar.tcl', + 'themed.tcl', + 'tools_dlg.tcl', + 'tools.tcl', + 'transport.tcl', + 'win32.tcl', +] + +nontcl_libfiles = [ + 'git-gui.ico', + 'win32_shortcut.js', +] + +foreach file : libfiles + nontcl_libfiles + configure_file( + input: file, + output: file, + copy: true, + install: true, + install_dir: get_option('datadir') / 'git-gui/lib', + ) +endforeach + +custom_target( + output: 'tclIndex', + command: [ + shell, + meson.project_source_root() / 'generate-tclindex.sh', + meson.project_build_root(), + meson.project_build_root() / 'GIT-GUI-BUILD-OPTIONS', + libfiles, + ], + depend_files: [ + libfiles, + build_options, + ], + install: true, + install_dir: get_option('datadir') / 'git-gui/lib', +) diff --git a/meson.build b/meson.build new file mode 100644 index 0000000..cdae85e --- /dev/null +++ b/meson.build @@ -0,0 +1,148 @@ +project('git-gui', + meson_version: '>=0.61.0', +) + +fs = import('fs') + +shell = find_program('sh') +tclsh = find_program('tclsh') +wish = find_program('wish') + +build_options_config = configuration_data() +if target_machine.system() == 'windows' + build_options_config.set('GITGUI_RELATIVE', '1') +else + build_options_config.set('GITGUI_RELATIVE', '') +endif +build_options_config.set_quoted('GITGUI_GITEXECDIR', get_option('prefix') / get_option('libexecdir') / 'git-core') +build_options_config.set_quoted('GITGUI_LIBDIR', get_option('prefix') / get_option('datadir') / 'git-gui/lib') +build_options_config.set_quoted('SHELL_PATH', fs.as_posix(shell.full_path())) +build_options_config.set_quoted('TCLTK_PATH', fs.as_posix(wish.full_path())) +build_options_config.set_quoted('TCL_PATH', fs.as_posix(tclsh.full_path())) +if target_machine.system() == 'darwin' + tkexecutables = [ + '/Library/Frameworks/Tk.framework/Resources/Wish.app/Contents/MacOS/Wish', + '/System/Library/Frameworks/Tk.framework/Resources/Wish.app/Contents/MacOS/Wish', + '/System/Library/Frameworks/Tk.framework/Resources/Wish Shell.app/Contents/MacOS/Wish Shell', + ] + tkexecutable = find_program(tkexecutables) + build_options_config.set_quoted('TKEXECUTABLE', tkexecutable.full_path()) +else + build_options_config.set('TKEXECUTABLE', '') +endif + +build_options = configure_file( + input: 'GIT-GUI-BUILD-OPTIONS.in', + output: 'GIT-GUI-BUILD-OPTIONS', + configuration: build_options_config, +) + +version_file = custom_target( + input: 'GIT-VERSION-GEN', + output: 'GIT-VERSION-FILE', + command: [ + shell, + '@INPUT@', + meson.current_source_dir(), + '@OUTPUT@', + ], + build_always_stale: true, +) + +configure_file( + input: 'git-gui--askpass', + output: 'git-gui--askpass', + copy: true, + install: true, + install_dir: get_option('libexecdir') / 'git-core', +) + +gitgui_main = 'git-gui' +gitgui_main_install_dir = get_option('libexecdir') / 'git-core' + +if target_machine.system() == 'windows' + gitgui_main = 'git-gui.tcl' + + configure_file( + input: 'windows/git-gui.sh', + output: 'git-gui', + copy: true, + install: true, + install_dir: get_option('libexecdir') / 'git-core', + ) +elif target_machine.system() == 'darwin' + gitgui_main = 'git-gui.tcl' + gitgui_main_install_dir = get_option('datadir') / 'git-gui/lib' + + custom_target( + output: 'git-gui', + command: [ + shell, + meson.current_source_dir() / 'generate-macos-wrapper.sh', + '@OUTPUT@', + meson.current_build_dir() / 'GIT-GUI-BUILD-OPTIONS', + meson.current_build_dir() / 'GIT-VERSION-FILE', + ], + depends: [ + version_file, + ], + depend_files: [ + build_options, + ], + install: true, + install_dir: get_option('libexecdir') / 'git-core', + ) + + custom_target( + output: 'Git Gui.app', + command: [ + shell, + meson.current_source_dir() / 'generate-macos-app.sh', + meson.current_source_dir(), + meson.current_build_dir() / 'Git Gui.app', + meson.current_build_dir() / 'GIT-GUI-BUILD-OPTIONS', + meson.current_build_dir() / 'GIT-VERSION-FILE', + ], + depends: [ + version_file, + ], + depend_files: [ + build_options, + 'macosx/AppMain.tcl', + 'macosx/Info.plist', + 'macosx/git-gui.icns', + ], + build_by_default: true, + install: true, + install_dir: get_option('datadir') / 'git-gui/lib', + ) +endif + +custom_target( + input: 'git-gui.sh', + output: gitgui_main, + command: [ + shell, + meson.current_source_dir() / 'generate-git-gui.sh', + '@INPUT@', + '@OUTPUT@', + meson.current_build_dir() / 'GIT-GUI-BUILD-OPTIONS', + meson.current_build_dir() / 'GIT-VERSION-FILE', + ], + depends: [ + version_file, + ], + depend_files: [ + build_options, + ], + install: true, + install_dir: gitgui_main_install_dir, +) + +install_symlink('git-citool', + install_dir: get_option('libexecdir') / 'git-core', + pointing_to: 'git-gui', +) + +subdir('lib') +subdir('po') diff --git a/po/meson.build b/po/meson.build new file mode 100644 index 0000000..00cae74 --- /dev/null +++ b/po/meson.build @@ -0,0 +1,38 @@ +languages = [ + 'bg', + 'de', + 'el', + 'fr', + 'hu', + 'it', + 'ja', + 'nb', + 'pt_br', + 'pt_pt', + 'ru', + 'sv', + 'vi', + 'zh_cn', +] + +msgfmt = find_program('msgfmt', required: false) +if not msgfmt.found() + subdir_done() +endif + +foreach language : languages + custom_target( + input: language + '.po', + output: language + '.msg', + command: [ + msgfmt, + '--statistics', + '--tcl', + '--locale=' + language, + '-d', meson.current_build_dir(), + '@INPUT@', + ], + install: true, + install_dir: get_option('datadir') / 'git-gui/lib/msgs', + ) +endforeach