blob: 9ed27a9f16328493e03fb1ab1039918e566ab851 [file] [log] [blame]
#!/bin/sh
# -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
#
# Project configuration variables
#
# -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
VERSION_FILE="include/tinyalsa/version.h"
CHANGELOG_FILE="debian/changelog"
# -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
#
# Scripts internal variables
#
# -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
LF="\n"
PARAMS=""
DRYRUN=0
# -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
#
# Helper functions
#
# -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
die()
{
echo "Error: $@" 1>&2
exit 1
}
print_usage()
{
echo
echo "Usage: $0 [OPTIONS] ACTION"
echo
echo "Available options:"
echo " -s,--script Format output in \"script\" mode (no trailing newline)."
echo " -d,--dry-run Does not commit anything to any file, just prints."
echo
echo "Available actions:"
echo " print [minor|major|patch] Print the current version."
echo " release [minor|major|patch] Bump the specified version part"
echo " check Check the changelog latest released"
echo " version against the version file."
echo
echo "Please run this script from the project root folder."
echo
}
check_files()
{
[ -f ${VERSION_FILE} ] || die "No ${VERSION_FILE} found!";
[ -f ${CHANGELOG_FILE} ] || die "No ${CHANGELOG_FILE} found!"
}
# Gets a part of the version from the project version file (version.h).
# Takes one argument: the matching version identifier in the version file, e.g.
# TINYALSA_VERSION_MAJOR
get_version_part()
{
set -- "$1" "$(grep -m 1 "^#define\([ \t]*\)$1" ${VERSION_FILE} | sed 's/[^0-9]*//g')"
if [ -z "$2" ]; then
die "Could not get $1 from ${VERSION_FILE}"
fi
echo "$2"
}
# Gets the complete version from the version file.
# Sets VERSION_MAJOR, VERSION_MINOR and VERSION_PATCH globals
get_version()
{
VERSION_MAJOR=$(get_version_part "TINYALSA_VERSION_MAJOR")
VERSION_MINOR=$(get_version_part "TINYALSA_VERSION_MINOR")
VERSION_PATCH=$(get_version_part "TINYALSA_VERSION_PATCH")
}
# Commits the new version part to the version file.
# Takes two arguments: the version part identifier in the version file and the
# new version number. If no arguments, do nothing.
commit_version_part()
{
if [ -z $1 ] || [ -z $2 ]; then
return 0
fi
sed -i "s/\(^#define[ \t]*$1\)[ \t]*\([0-9]*\)/\1 $2/g" ${VERSION_FILE} \
|| die "Could not commit version for $1";
[ $(get_version_part $1) = "$2" ] || die "Version check after commit failed for $1"
return 0;
}
# Commits the new version to the version file.
# Takes three arguments, the new version numbers for major, minor and patch
commit_version()
{
commit_version_part "TINYALSA_VERSION_PATCH" $1
commit_version_part "TINYALSA_VERSION_MINOR" $2
commit_version_part "TINYALSA_VERSION_MAJOR" $3
return 0
}
# -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
#
# Actions implementations / functions
#
# -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
print_version()
{
if [ -z $1 ]; then
printf "${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}${LF}"
else
case "$1" in
major)
printf "${VERSION_MAJOR}${LF}"
;;
minor)
printf "${VERSION_MINOR}${LF}"
;;
patch)
printf "${VERSION_PATCH}${LF}"
;;
*)
die "Unknown part \"$1\" (must be one of minor, major and patch)."
;;
esac
fi
return 0
}
bump_version()
{
case "${1:-patch}" in
major)
VERSION_MAJOR=$((VERSION_MAJOR+1))
VERSION_MINOR=0
VERSION_PATCH=0
;;
minor)
VERSION_MINOR=$((VERSION_MINOR+1))
VERSION_PATCH=0
;;
patch)
VERSION_PATCH=$((VERSION_PATCH+1))
;;
*)
die "Unknown part \"$1\" (must be one of minor, major and patch)."
;;
esac
if [ ${DRYRUN} -ne 1 ]; then
commit_version ${VERSION_PATCH} ${VERSION_MINOR} ${VERSION_MAJOR}
fi
print_version
return 0
}
check_version()
{
# set $1 to log version, and $2 to ref version
set -- \
"$(grep -m 1 "^tinyalsa (" ${CHANGELOG_FILE}| sed "s/[^0-9.]*//g")" \
"${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}"
if [ "$1" != "$2" ]; then
die "Changelog version ($1) does not match package version ($2)."
fi
printf "Changelog version ($1) OK!${LF}"
return 0
}
# -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
#
# Command Line parsing
#
# -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
parse_command()
{
if [ "$#" -eq "0" ]; then
print_usage
exit 1
fi
case "$1" in
print)
get_version
print_version "$2"
exit $?
;;
release)
get_version
bump_version "$2"
exit $?
;;
check)
get_version
check_version
exit $?
;;
*)
die "Unsupported action \"$1\"."
;;
esac
}
# -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
#
# Main
#
# -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
set -e
trap "set +e" 0
# Checking parameters
if [ "$#" -eq "0" ]; then
print_usage
exit 0
fi
while [ "$#" -ne "0" ]; do
case "$1" in
-s|--script)
unset LF
shift
;;
-d|--dry-run)
DRYRUN=1
shift
;;
--)
shift
break
;;
-*|--*=)
die "Unsupported flag \"$1\"."
;;
*)
PARAMS="$PARAMS ${1}"
shift
;;
esac
done
# set positional arguments in their proper place
set -- "${PARAMS}"
check_files
parse_command ${PARAMS}
# The script should never reach this place.
die "Internal error. Please report this."