Skip to content

Instantly share code, notes, and snippets.

@enten
Last active June 13, 2020 23:50
Show Gist options
  • Save enten/192597bcc98aa7d5e412 to your computer and use it in GitHub Desktop.
Save enten/192597bcc98aa7d5e412 to your computer and use it in GitHub Desktop.
version.sh - semver helper

version.sh - semver helper

Usage

NAME:
	version.sh - semver helper

VERSION:
	0.0.3

USAGE:
	version.sh [command] [arg...]

COMMANDS:
	version.sh                              Current version
	version.sh <M|m|p> [inc] ...            Bump version
	version.sh release <M|m|p> [inc] ...    Update version
	version.sh help                         Print this message

Example

$ tree .
.
├── scripts
│   └── version.sh
└── VERSION

$ cat VERSION
1.2.3

$ ./scripts/version.sh
1.2.3

$ ./scripts/version.sh M
2.0.0

$ ./scripts/version.sh m
1.3.0

$ ./scripts/version.sh p
1.2.4

$ ./scripts/version.sh M 2 m 2 p 1
3.2.1

$ cat VERSION
1.2.3

$ ./scripts/version.sh release M 2 m 2 p 1
Old: 1.2.3
New: 3.2.1

$ cat VERSION
3.2.1
#!/bin/bash
# version: Semver helper
#
# Author: Steven Enten <steven@enten.fr>
# License : MIT
# Requirements: awk basename dirname cat echo eval grep readlink shift
# Site: https//github.com/enten/losh
set -eu
#
# consts
#
CMDNAME=$(basename $0)
CMDVERS=0.0.3
CMDUSAGE="[release] <M|m|p> [inc] ..."
CMDDESC="Semver helper"
TAB=" "
#
# vars
#
major=
minor=
patch=
increment=
i=
j=
k=
tmp=
#
# initialize vars
#
init() {
tmp=$(dirname $(readlink -f $(echo $0)))
while [ ! -f "$tmp/VERSION" ]; do
tmp=$(dirname $tmp)
[ "$tmp" = "/" ] && break
done
[ ! -f "$tmp/VERSION" ] && echo "VERSION was not found" && exit 1
VERSPATH="$tmp/VERSION"
VERSION=$(cat $VERSPATH)
[ -z "$VERSION" ] && VERSION="0.0.0"
return 0
}
#
# usage
#
usage() {
echo "NAME:"
echo "${TAB}${CMDNAME} - ${CMDDESC}"
echo
echo "VERSION:"
echo "${TAB}${CMDVERS}"
echo
echo "USAGE:"
echo "${TAB}${CMDNAME} ${CMDUSAGE}"
echo
echo "COMMANDS:"
echo "${TAB}${CMDNAME} Current version"
echo "${TAB}${CMDNAME} <M|m|p> [inc] ... Bump version"
echo "${TAB}${CMDNAME} release <M|m|p> [inc] ... Update version"
echo "${TAB}${CMDNAME} ?|h|help Print this help message"
echo
[ $# -gt 0 ] && exit $1 || return 0
}
write_version() {
echo $VERSION > $VERSPATH
echo "$VERSPATH initialized with $VERSION"
return 0
}
#
# what we do when there are a new release
#
handle_release() {
write_version
#try_commit
return 0
}
#
# try to make commit
#
try_commit() {
tmp=$(dirname $VERSPATH)
if [ -d "$tmp/.git" ]; then
git add $VERSPATH
git commit -m "Release version $VERSION"
git tag -a "v${VERSION}" -m "version $VERSION" $(git log --pretty=oneline -n 1 | awk '{print $1}')
fi
return 0
}
#
# command: version
#
cmdVoid() {
echo $VERSION && exit 0
}
#
# command: version ?|h|help
#
cmdHelp() {
usage 0
}
#
# command: version init|set [version]
#
cmdInit() {
VERSION="0.0.0"
[ $# -gt 0 ] && VERSION=$1
write_version
exit 0
}
#
# command: version release <M|m|p> [increment] ...
#
cmdRelease() {
tmp=$0
[ $# -lt 1 ] && usage 1
VERSION=$($tmp $@)
k=$?
[ $k -ne 0 ] && usage 1
i=$($tmp)
echo "Old: $i"
echo "New: $VERSION"
handle_release
exit 0
}
#
# command: version <M|m|p> [increment] ...
#
cmdDefault() {
j=0
for i in $(echo $VERSION | tr "\." "\n"); do
[ $j -eq 0 ] && major=$i
[ $j -eq 1 ] && minor=$i
[ $j -eq 2 ] && patch=$i
j=$(expr $j + 1)
done
i=1
j=
tmp=""
while [ $i -le $# ]; do
increment=1
tmp="$tmp $(eval echo \${$i})"
i=$(expr $i + 1)
if [ $i -le $# ]; then
j=$(eval echo \${$i})
if echo "$j" | grep -qE ^\-?[0-9\]+$; then
increment=$j
i=$(expr $i + 1)
fi
fi
tmp="$tmp:$increment "
done
for i in $(echo $tmp); do
j=$(echo $i | awk -F ':' '{print $1}')
k=$(echo $i | awk -F ':' '{print $2}')
set -- $j $k
case $1 in
M|major)
major=$(expr $major + $2)
minor=0
patch=0
;;
m|minor)
minor=$(expr $minor + $2)
patch=0
;;
p|patch)
patch=$(expr $patch + $2)
;;
*)
usage 1
;;
esac
done
[ $major -lt 0 ] && major=0
[ $minor -lt 0 ] && minor=0
[ $patch -lt 0 ] && patch=0
VERSION="${major}.${minor}.${patch}"
echo $VERSION
}
main() {
init
# command: version
[ $# -eq 0 ] && cmdVoid
# command: version ?|h|help
if [ "$1" = "?" ] || [ "$1" = "h" ] || [ "$1" = "help" ]; then
cmdHelp
fi
# command: version init|set [version]
if [ "$1" = "init" ] || [ "$1" = "set" ]; then
shift
cmdInit $@
fi
# command: version release <M|m|p> [increment] ...
if [ "$1" = "release" ]; then
shift
cmdRelease $@
fi
# command: version <M|m|p> [increment] ...
cmdDefault $@
}
main $@
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment