GIT-VERSION-GEN: allow running without input and output files

The GIT-VERSION-GEN script requires an input file containing formatting
directives to be replaced as well as an output file that will get
overwritten in case the file contents have changed. When computing the
project version for Meson we don't want to have either though:

  - We only want to compute the version without anything else, but don't
    have an input file that would match that exact format. While we
    could of course introduce a new file just for that usecase, it feels
    suboptimal to add another file every time we want to have a slightly
    different format for versioned data.

  - The computed version needs to be read from stdout so that Meson can
    wire it up for the project.

Extend the script to handle both usecases by recognizing `--format=` as
alternative to providing an input path and by writing to stdout in case
no output file was given.

Signed-off-by: Patrick Steinhardt <ps@pks.im>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Patrick Steinhardt 2025-01-22 13:05:45 +01:00 committed by Junio C Hamano
parent e40622a60b
commit f6a2efdc9b

View File

@ -5,21 +5,29 @@ DEF_VER=v2.48.0
LF='
'
if test "$#" -ne 3
if test "$#" -lt 2 || test "$#" -gt 3
then
echo >&2 "USAGE: $0 <SOURCE_DIR> <INPUT> <OUTPUT>"
echo >&2 "USAGE: $0 <SOURCE_DIR> (--format=<STRING>|<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
case "$2" in
--format=*)
INPUT="${2#--format=}"
;;
*)
if ! test -f "$2"
then
echo >&2 "Input is not a file: $2"
exit 1
fi
INPUT=$(cat "$2")
;;
esac
OUTPUT="$3"
# 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
@ -74,19 +82,25 @@ read GIT_MAJOR_VERSION GIT_MINOR_VERSION GIT_MICRO_VERSION GIT_PATCH_LEVEL trail
$(echo "$GIT_VERSION" 0 0 0 0 | tr '.a-zA-Z-' ' ')
EOF
sed -e "s|@GIT_VERSION@|$GIT_VERSION|" \
REPLACED=$(printf "%s" "$INPUT" | 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".$$+
-e "s|@GIT_DATE@|$GIT_DATE|"
)
if ! test -f "$OUTPUT" || ! cmp "$OUTPUT".$$+ "$OUTPUT" >/dev/null
if test -z "$OUTPUT"
then
mv "$OUTPUT".$$+ "$OUTPUT"
printf "%s\n" "$REPLACED"
else
rm "$OUTPUT".$$+
printf "%s\n" "$REPLACED" >"$OUTPUT".$$+
if ! test -f "$OUTPUT" || ! cmp "$OUTPUT".$$+ "$OUTPUT" >/dev/null
then
mv "$OUTPUT".$$+ "$OUTPUT"
else
rm "$OUTPUT".$$+
fi
fi