101 lines
2.2 KiB
Plaintext
101 lines
2.2 KiB
Plaintext
|
#!/bin/bash
|
||
|
set -o errexit
|
||
|
set -o nounset
|
||
|
set -o pipefail
|
||
|
|
||
|
# For a tag to be considered suitable for release, it must start with
|
||
|
# the latter 'v' followed by a digit. Afterwards, any sequence of
|
||
|
# alphanumerics and '.', '+', '-', '~' are supported.
|
||
|
#
|
||
|
# Supported tag examples:
|
||
|
# v1.8-rc1
|
||
|
# v1.9~rc1
|
||
|
# v2
|
||
|
# v2.0
|
||
|
#
|
||
|
# Unsupported tag examples:
|
||
|
# 1.9
|
||
|
# 2.0
|
||
|
# release-test
|
||
|
TAG_REGEX='^v[[:digit:]][[:alnum:]\.\+\-\~]+$'
|
||
|
|
||
|
usage()
|
||
|
{
|
||
|
cat <<'EOF'
|
||
|
USAGE: get-version [OPTIONS]
|
||
|
|
||
|
DESCRIPTION:
|
||
|
|
||
|
OPTIONS:
|
||
|
-h Displays this help text.
|
||
|
-p PREFIX Modify the version string for use with packages. Both Debian and
|
||
|
Fedora packages have strict version requirements. If there exist
|
||
|
no tags that reference this commit or the tags are not suitable
|
||
|
for packages, use "$PREFIX-$GIT_SHORT_COMMIT" instead. The
|
||
|
prefix must start with a number.
|
||
|
-n (Only works when used with -p). Use the nightly version format.
|
||
|
This uses the format "$PREFIX-nightly-YYYYMMDD".
|
||
|
EOF
|
||
|
}
|
||
|
|
||
|
go_version()
|
||
|
{
|
||
|
# `git describe --exact` will fail when no tags match the HEAD commit.
|
||
|
# This is a supported scenario. So, this discards the return value.
|
||
|
TAG=$(git describe --exact --tag HEAD 2>/dev/null || true)
|
||
|
|
||
|
if [[ ${TAG} =~ ${TAG_REGEX} ]]
|
||
|
then
|
||
|
printf '%s\n' "${TAG}"
|
||
|
return
|
||
|
fi
|
||
|
|
||
|
printf 'unknown\n'
|
||
|
}
|
||
|
|
||
|
package_version()
|
||
|
{
|
||
|
# `git describe --exact` will fail when no tags match the HEAD commit.
|
||
|
# This is a supported scenario. So, this discards the return value.
|
||
|
TAG=$(git describe --exact --tag HEAD 2>/dev/null || true)
|
||
|
|
||
|
if [[ ${TAG} =~ ${TAG_REGEX} ]]
|
||
|
then
|
||
|
# Debian package versions must start with a number; therefore, the
|
||
|
# 'v' must be stripped from the tag.
|
||
|
printf '%s\n' "${TAG:1}"
|
||
|
return
|
||
|
fi
|
||
|
|
||
|
if [[ ${PACKAGE_VERSION_NIGHTLY:-} ]]
|
||
|
then
|
||
|
printf '%s-nightly-%s\n' "${PACKAGE_VERSION_PREFIX}" "$(date '+%Y%m%d')"
|
||
|
return
|
||
|
fi
|
||
|
|
||
|
printf '%s-%s\n' "${PACKAGE_VERSION_PREFIX}" "$(git rev-parse --verify --short HEAD)"
|
||
|
}
|
||
|
|
||
|
while getopts 'hp:n' option
|
||
|
do
|
||
|
case $option
|
||
|
in
|
||
|
n)
|
||
|
PACKAGE_VERSION_NIGHTLY=1
|
||
|
;;
|
||
|
p)
|
||
|
PACKAGE_VERSION_PREFIX=${OPTARG}
|
||
|
;;
|
||
|
h)
|
||
|
usage && exit 0
|
||
|
;;
|
||
|
esac
|
||
|
done
|
||
|
|
||
|
if [[ ${PACKAGE_VERSION_PREFIX:-} ]]
|
||
|
then
|
||
|
package_version
|
||
|
else
|
||
|
go_version
|
||
|
fi
|