]> git.ipfire.org Git - thirdparty/git.git/commitdiff
GIT-VERSION-GEN: fix overriding GIT_VERSION
authorPatrick Steinhardt <ps@pks.im>
Fri, 20 Dec 2024 19:44:24 +0000 (20:44 +0100)
committerJunio C Hamano <gitster@pobox.com>
Fri, 20 Dec 2024 20:36:45 +0000 (12:36 -0800)
GIT-VERSION-GEN tries to derive the version that Git is being built from
via multiple different sources in the following order:

  1. A file called "version" in the source tree's root directory, if it
     exists.

  2. The current commit in case Git is built from a Git repository.

  3. Otherwise, we use a fallback version stored in a variable which is
     bumped whenever a new Git version is getting tagged.

It used to be possible to override the version by overriding the
`GIT_VERSION` Makefile variable (e.g. `make GIT_VERSION=foo`). This
worked somewhat by chance, only: `GIT-VERSION-GEN` would write the
actual Git version into `GIT-VERSION-FILE`, not the overridden value,
but when including the file into our Makefile we would not override the
`GIT_VERSION` variable because it has already been set by the user. And
because our Makefile used the variable to propagate the version to our
build tools instead of using `GIT-VERSION-FILE` the resulting build
artifacts used the overridden version.

But that subtle mechanism broke with 4838deab65 (Makefile: refactor
GIT-VERSION-GEN to be reusable, 2024-12-06) and subsequent commits
because the version information is not propagated via the Makefile
variable anymore, but instead via the files that `GIT-VERSION-GEN`
started to write. And as the script never knew about the `GIT_VERSION`
environment variable in the first place it uses one of the values listed
above instead of the overridden value.

Fix this issue by making `GIT-VERSION-GEN` handle the case where
`GIT_VERSION` has been set via the environment.

Note that this requires us to introduce a new GIT_VERSION_OVERRIDE
variable that stores a potential user-provided value, either via the
environment or via "config.mak". Ideally we wouldn't need it and could
just continue to use GIT_VERSION for this. But unfortunately, Makefiles
will first include all sub-Makefiles before figuring out whether it
needs to re-make any of them [1]. Consequently, if there already is a
GIT-VERSION-FILE, we would have slurped in its value of GIT_VERSION
before we call GIT-VERSION-GEN, and because GIT-VERSION-GEN now uses
that value as an override it would mean that the first generated value
for GIT_VERSION will remain unchanged.

Furthermore we have to move the include for "GIT-VERSION-FILE" after the
includes for "config.mak" and related so that GIT_VERSION_OVERRIDE can
be set to the value provided by "config.mak".

[1]: https://www.gnu.org/software/make/manual/html_node/Remaking-Makefiles.html

Signed-off-by: Patrick Steinhardt <ps@pks.im>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Documentation/Makefile
GIT-VERSION-GEN
Makefile
shared.mak

index ff30ab6c4295525757f6a150ec4ff0c72487f440..a89823e1d1ee5042367bdcca6ed426196d49ce89 100644 (file)
@@ -181,6 +181,10 @@ endif
 -include ../config.mak.autogen
 -include ../config.mak
 
+# Set GIT_VERSION_OVERRIDE such that version_gen knows to substitute
+# GIT_VERSION in case it was set by the user.
+GIT_VERSION_OVERRIDE := $(GIT_VERSION)
+
 ifndef NO_MAN_BOLD_LITERAL
 XMLTO_EXTRA += -m manpage-bold-literal.xsl
 endif
index b4687784c1c348b6efb110c5e8b935b788723f59..2fee5e7e80a0580f48a45943c66bbb6e0c9a0b9e 100755 (executable)
@@ -27,31 +27,35 @@ fi
 GIT_CEILING_DIRECTORIES="$SOURCE_DIR/.."
 export GIT_CEILING_DIRECTORIES
 
-# First see if there is a version file (included in release tarballs),
-# then try git-describe, then default.
-if test -f "$SOURCE_DIR"/version
+if test -z "$GIT_VERSION"
 then
-       VN=$(cat "$SOURCE_DIR"/version) || VN="$DEF_VER"
-elif {
-               test -d "$SOURCE_DIR/.git" ||
-               test -d "${GIT_DIR:-.git}" ||
-               test -f "$SOURCE_DIR"/.git;
-       } &&
-       VN=$(git -C "$SOURCE_DIR" describe --match "v[0-9]*" HEAD 2>/dev/null) &&
-       case "$VN" in
-       *$LF*) (exit 1) ;;
-       v[0-9]*)
-               git -C "$SOURCE_DIR" update-index -q --refresh
-               test -z "$(git -C "$SOURCE_DIR" diff-index --name-only HEAD --)" ||
-               VN="$VN-dirty" ;;
-       esac
-then
-       VN=$(echo "$VN" | sed -e 's/-/./g');
-else
-       VN="$DEF_VER"
+       # First see if there is a version file (included in release tarballs),
+       # then try git-describe, then default.
+       if test -f "$SOURCE_DIR"/version
+       then
+               VN=$(cat "$SOURCE_DIR"/version) || VN="$DEF_VER"
+       elif {
+                       test -d "$SOURCE_DIR/.git" ||
+                       test -d "${GIT_DIR:-.git}" ||
+                       test -f "$SOURCE_DIR"/.git;
+               } &&
+               VN=$(git -C "$SOURCE_DIR" describe --match "v[0-9]*" HEAD 2>/dev/null) &&
+               case "$VN" in
+               *$LF*) (exit 1) ;;
+               v[0-9]*)
+                       git -C "$SOURCE_DIR" update-index -q --refresh
+                       test -z "$(git -C "$SOURCE_DIR" diff-index --name-only HEAD --)" ||
+                       VN="$VN-dirty" ;;
+               esac
+       then
+               VN=$(echo "$VN" | sed -e 's/-/./g');
+       else
+               VN="$DEF_VER"
+       fi
+
+       GIT_VERSION=$(expr "$VN" : v*'\(.*\)')
 fi
 
-GIT_VERSION=$(expr "$VN" : v*'\(.*\)')
 GIT_BUILT_FROM_COMMIT=$(git -C "$SOURCE_DIR" rev-parse -q --verify HEAD 2>/dev/null)
 GIT_DATE=$(git -C "$SOURCE_DIR" show --quiet --format='%as' 2>/dev/null)
 if test -z "$GIT_USER_AGENT"
index c6973a720a203196311c68583e12bee1801e2d2b..5e14da0ae6495e22663026d4d80bc8e2241d6cd3 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -591,13 +591,6 @@ include shared.mak
 #
 #        Disable -pedantic compilation.
 
-GIT-VERSION-FILE: FORCE
-       @OLD=$$(cat $@ 2>/dev/null || :) && \
-       $(call version_gen,"$(shell pwd)",GIT-VERSION-FILE.in,$@) && \
-       NEW=$$(cat $@ 2>/dev/null || :) && \
-       if test "$$OLD" != "$$NEW"; then echo "$$NEW" >&2; fi
--include GIT-VERSION-FILE
-
 # Set our default configuration.
 #
 # Among the variables below, these:
@@ -1465,6 +1458,18 @@ ifdef DEVELOPER
 include config.mak.dev
 endif
 
+GIT-VERSION-FILE: FORCE
+       @OLD=$$(cat $@ 2>/dev/null || :) && \
+       $(call version_gen,"$(shell pwd)",GIT-VERSION-FILE.in,$@) && \
+       NEW=$$(cat $@ 2>/dev/null || :) && \
+       if test "$$OLD" != "$$NEW"; then echo "$$NEW" >&2; fi
+
+# We need to set GIT_VERSION_OVERRIDE before including the version file as
+# otherwise any user-provided value for GIT_VERSION would have been overridden
+# already.
+GIT_VERSION_OVERRIDE := $(GIT_VERSION)
+-include GIT-VERSION-FILE
+
 # what 'all' will build and 'install' will install in gitexecdir,
 # excluding programs for built-in commands
 ALL_PROGRAMS = $(PROGRAMS) $(SCRIPTS)
index b23c5505c9692b032cd0b18d3e4ede288614d937..a66f46969e301b35d88650f2c6abc6c0ba1b0f3d 100644 (file)
@@ -122,5 +122,6 @@ endef
 # as arguments, in that order.
 define version_gen
 GIT_USER_AGENT="$(GIT_USER_AGENT)" \
+GIT_VERSION="$(GIT_VERSION_OVERRIDE)" \
 $(SHELL_PATH) "$(1)/GIT-VERSION-GEN" "$(1)" "$(2)" "$(3)"
 endef