mirror of
https://github.com/git/git.git
synced 2026-01-11 05:13:13 +09:00
Our "GIT-VERSION-GEN" script always writes the "GIT-VERSION-FILE" into the current directory, where the expectation is that it should exist in the source directory. But other build systems that support out-of-tree builds may not want to do that to keep the source directory pristine, even though CMake currently doesn't care. Refactor the script such that it won't write the "GIT-VERSION-FILE" directly anymore, but instead knows to replace @PLACEHOLDERS@ in an arbitrary input file. This allows us to simplify the logic in CMake to determine the project version, but can also be reused later on in order to generate other files that need to contain version information like our "git.rc" file. While at it, change the format of the version file by removing the spaces around the equals sign. Like this we can continue to include the file in our Makefiles, but can also start to source it in shell scripts in subsequent steps. Signed-off-by: Patrick Steinhardt <ps@pks.im> Signed-off-by: Junio C Hamano <gitster@pobox.com>
72 lines
1.6 KiB
Bash
Executable File
72 lines
1.6 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
|
|
|
|
# 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*'\(.*\)')
|
|
|
|
read GIT_MAJOR_VERSION GIT_MINOR_VERSION GIT_MICRO_VERSION trailing <<EOF
|
|
$(echo "$GIT_VERSION" 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|" \
|
|
"$INPUT" >"$OUTPUT"+
|
|
|
|
if ! test -f "$OUTPUT" || ! cmp "$OUTPUT"+ "$OUTPUT" >/dev/null
|
|
then
|
|
mv "$OUTPUT"+ "$OUTPUT"
|
|
else
|
|
rm "$OUTPUT"+
|
|
fi
|