mirror of
https://github.com/git/git.git
synced 2026-01-11 21:33:13 +09:00
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>
89 lines
2.2 KiB
Bash
Executable File
89 lines
2.2 KiB
Bash
Executable File
#!/bin/sh
|
|
|
|
DEF_VER=v2.47.GIT
|
|
|
|
LF='
|
|
'
|
|
|
|
if test "$#" -ne 3
|
|
then
|
|
echo >&2 "USAGE: $0 <SOURCE_DIR> <INPUT> <OUTPUT>"
|
|
exit 1
|
|
fi
|
|
|
|
SOURCE_DIR="$1"
|
|
INPUT="$2"
|
|
OUTPUT="$3"
|
|
|
|
if ! test -f "$INPUT"
|
|
then
|
|
echo >&2 "Input is not a file: $INPUT"
|
|
exit 1
|
|
fi
|
|
|
|
# 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
|
|
|
|
if test -z "$GIT_VERSION"
|
|
then
|
|
# 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_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"
|
|
then
|
|
GIT_USER_AGENT="git/$GIT_VERSION"
|
|
fi
|
|
|
|
# While released Git versions only have three numbers, development builds also
|
|
# have a fourth number that corresponds to the number of patches since the last
|
|
# release.
|
|
read GIT_MAJOR_VERSION GIT_MINOR_VERSION GIT_MICRO_VERSION GIT_PATCH_LEVEL trailing <<EOF
|
|
$(echo "$GIT_VERSION" 0 0 0 0 | tr '.a-zA-Z-' ' ')
|
|
EOF
|
|
|
|
sed -e "s|@GIT_VERSION@|$GIT_VERSION|" \
|
|
-e "s|@GIT_MAJOR_VERSION@|$GIT_MAJOR_VERSION|" \
|
|
-e "s|@GIT_MINOR_VERSION@|$GIT_MINOR_VERSION|" \
|
|
-e "s|@GIT_MICRO_VERSION@|$GIT_MICRO_VERSION|" \
|
|
-e "s|@GIT_PATCH_LEVEL@|$GIT_PATCH_LEVEL|" \
|
|
-e "s|@GIT_BUILT_FROM_COMMIT@|$GIT_BUILT_FROM_COMMIT|" \
|
|
-e "s|@GIT_USER_AGENT@|$GIT_USER_AGENT|" \
|
|
-e "s|@GIT_DATE@|$GIT_DATE|" \
|
|
"$INPUT" >"$OUTPUT"+
|
|
|
|
if ! test -f "$OUTPUT" || ! cmp "$OUTPUT"+ "$OUTPUT" >/dev/null
|
|
then
|
|
mv "$OUTPUT"+ "$OUTPUT"
|
|
else
|
|
rm "$OUTPUT"+
|
|
fi
|