#!/bin/bash set -o errexit set -o nounset set -o pipefail function help() { local to="$1" echo "Usage: $0 " 1>&$to echo 1>&$to echo "where:" 1>&$to echo " is a current semver version." 1>&$to echo " is either 'patch', 'major' or 'minor'." 1>&$to } function error() { echo "error: $@" 1>&2 echo 1>&2 help 2 exit 1 } function info() { echo "$@" } VERSION="$1" BUMP="$2" # https://semver.org/ SEMVER_REGEX="^(0|[1-9][[:digit:]]*)\.(0|[1-9][[:digit:]]*)\.(0|[1-9][[:digit:]]*)(?:-((?:0|[1-9][[:digit:]]*|[[:digit:]]*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9][[:digit:]]*|[[:digit:]]*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$" (echo "$VERSION" | grep -Eq "$SEMVER_REGEX") || error "'$VERSION' not a semver" case "$BUMP" in major) MAJOR="$(($(echo "$VERSION" | cut -d. -f1) + 1))" MINOR="0" PATCH="0" echo "$MAJOR.$MINOR.$PATCH" ;; minor) MAJOR="$(echo "$VERSION" | cut -d. -f1)" MINOR="$(($(echo "$VERSION" | cut -d. -f2) + 1))" PATCH="0" echo "$MAJOR.$MINOR.$PATCH" ;; patch) MAJOR="$(echo "$VERSION" | cut -d. -f1)" MINOR="$(echo "$VERSION" | cut -d. -f2)" PATCH="$(($(echo "$VERSION" | cut -d. -f3) + 1))" echo "$MAJOR.$MINOR.$PATCH" ;; *) error "invalid bump type: $BUMP" ;; esac