| #!/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." |