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