Skip to content
239 changes: 177 additions & 62 deletions semver.sh
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
#!/usr/bin/env sh

function semverParseInto() {
local RE='[^0-9]*\([0-9]*\)[.]\([0-9]*\)[.]\([0-9]*\)\([0-9A-Za-z-]*\)'
local RE='[^0-9]*\([0-9]*\)[.]\([0-9]*\)[.]\([0-9]*\)[-]\{0,1\}\([0-9A-Za-z-]*\)'
#MAJOR
eval $2=`echo $1 | sed -e "s#$RE#\1#"`
#MINOR
Expand All @@ -12,7 +12,15 @@ function semverParseInto() {
eval $5=`echo $1 | sed -e "s#$RE#\4#"`
}

function semverEQ() {
function semverConstruct() {
if [[ $# -eq 5 ]]; then
eval $5=`echo "$1.$2.$3-$4"`
fi

eval $4=`echo "$1.$2.$3"`
}

function semverCmp() {
local MAJOR_A=0
local MINOR_A=0
local PATCH_A=0
Expand All @@ -26,105 +34,212 @@ function semverEQ() {
semverParseInto $1 MAJOR_A MINOR_A PATCH_A SPECIAL_A
semverParseInto $2 MAJOR_B MINOR_B PATCH_B SPECIAL_B

if [ $MAJOR_A -ne $MAJOR_B ]; then
return 1
# major
if [ $MAJOR_A -lt $MAJOR_B ]; then
return -1
fi

if [ $MINOR_A -ne $MINOR_B ]; then
if [ $MAJOR_A -gt $MAJOR_B ]; then
return 1
fi

if [ $PATCH_A -ne $PATCH_B ]; then
# minor
if [ $MINOR_A -lt $MINOR_B ]; then
return -1
fi

if [ $MINOR_A -gt $MINOR_B ]; then
return 1
fi

if [[ "_$SPECIAL_A" != "_$SPECIAL_B" ]]; then
# patch
if [ $PATCH_A -lt $PATCH_B ]; then
return -1
fi

if [ $PATCH_A -gt $PATCH_B ]; then
return 1
fi

# special
if [[ ( "$SPECIAL_A" != "" ) && ( "$SPECIAL_B" == "" ) ]]; then
return -1
fi

return 0
if [[ ( "$SPECIAL_A" == "" ) && ( "$SPECIAL_B" != "" ) ]]; then
return 1
fi

}
if [[ "$SPECIAL_A" < "$SPECIAL_B" ]]; then
return -1
fi

function semverLT() {
local MAJOR_A=0
local MINOR_A=0
local PATCH_A=0
local SPECIAL_A=0
if [[ "$SPECIAL_A" > "$SPECIAL_B" ]]; then
return 1
fi

local MAJOR_B=0
local MINOR_B=0
local PATCH_B=0
local SPECIAL_B=0
# equal
return 0
}

semverParseInto $1 MAJOR_A MINOR_A PATCH_A SPECIAL_A
semverParseInto $2 MAJOR_B MINOR_B PATCH_B SPECIAL_B
function semverEQ() {
semverCmp $1 $2
local RESULT=$?

if [ $MAJOR_A -lt $MAJOR_B ]; then
return 0
if [ $RESULT -ne 0 ]; then
# not equal
return 1
fi

if [[ $MAJOR_A -le $MAJOR_B && $MINOR_A -lt $MINOR_B ]]; then
return 0
fi

if [[ $MAJOR_A -le $MAJOR_B && $MINOR_A -le $MINOR_B && $PATCH_A -lt $PATCH_B ]]; then
return 0
fi
return 0
}

if [[ "_$SPECIAL_A" == "_" ]] && [[ "_$SPECIAL_B" == "_" ]] ; then
function semverLT() {
semverCmp $1 $2
local RESULT=$?

# XXX: compare to 255, as returning -1 becomes return value 255
if [ $RESULT -ne 255 ]; then
# not lesser than
return 1
fi
if [[ "_$SPECIAL_A" == "_" ]] && [[ "_$SPECIAL_B" != "_" ]] ; then

return 0
}

function semverGT() {
semverCmp $1 $2
local RESULT=$?

if [ $RESULT -ne 1 ]; then
# not greater than
return 1
fi
if [[ "_$SPECIAL_A" != "_" ]] && [[ "_$SPECIAL_B" == "_" ]] ; then
return 0
fi

if [[ "_$SPECIAL_A" < "_$SPECIAL_B" ]]; then
return 0
fi
return 0
}

return 1
function semverBumpMajor() {
local MAJOR=0
local MINOR=0
local PATCH=0
local SPECIAL=""

semverParseInto $1 MAJOR MINOR PATCH SPECIAL
MAJOR=$(($MAJOR + 1))
MINOR=0
PATCH=0
SPECIAL=""

semverConstruct $MAJOR $MINOR $PATCH $SPECIAL $2
}

function semverGT() {
semverEQ $1 $2
local EQ=$?
function semverBumpMinor() {
local MAJOR=0
local MINOR=0
local PATCH=0
local SPECIAL=""

semverLT $1 $2
local LT=$?
semverParseInto $1 MAJOR MINOR PATCH SPECIAL
MINOR=$(($MINOR + 1))
PATCH=0
SPECIAL=""

if [ $EQ -ne 0 ] && [ $LT -ne 0 ]; then
return 0
else
return 1
fi
semverConstruct $MAJOR $MINOR $PATCH $SPECIAL $2
}

function semverBumpPatch() {
local MAJOR=0
local MINOR=0
local PATCH=0
local SPECIAL=""

semverParseInto $1 MAJOR MINOR PATCH SPECIAL
PATCH=$(($PATCH + 1))
SPECIAL=""

semverConstruct $MAJOR $MINOR $PATCH $SPECIAL $2
}

function semverStripSpecial() {
local MAJOR=0
local MINOR=0
local PATCH=0
local SPECIAL=""

semverParseInto $1 MAJOR MINOR PATCH SPECIAL
SPECIAL=""

semverConstruct $MAJOR $MINOR $PATCH $SPECIAL $2
}

if [ "___semver.sh" == "___`basename $0`" ]; then
if [ "$2" == "" ]; then
echo "$0 <version> <command> [version]"
echo "Commands: cmp, eq, lt, gt, bump_major, bump_minor, bump_patch, strip_special"
echo ""
echo "cmp: compares left version against right version, return 0 if equal, 255 (-1) if left is lower than right, 1 if left is higher than right"
echo "eq: compares left version against right version, returns 0 if both versions are equal"
echo "lt: compares left version against right version, returns 0 if left version is less than right version"
echo "gt: compares left version against right version, returns 0 if left version is greater than than right version"
echo ""
echo "bump_major: bumps major of version, setting minor and patch to 0, removing special"
echo "bump_minor: bumps minor of version, setting patch to 0, removing special"
echo "bump_patch: bumps patch of version, removing special"
echo ""
echo "strip_special: strips special from version"
exit 255
fi

MAJOR=0
MINOR=0
PATCH=0
SPECIAL=""
if [ "$2" == "cmp" ]; then
semverCmp $1 $3
RESULT=$?
echo $RESULT
exit $RESULT
fi

semverParseInto $1 MAJOR MINOR PATCH SPECIAL
echo "$1 -> M: $MAJOR m:$MINOR p:$PATCH s:$SPECIAL"
if [ "$2" == "eq" ]; then
semverEQ $1 $3
RESULT=$?
echo $RESULT
exit $RESULT
fi

semverParseInto $2 MAJOR MINOR PATCH SPECIAL
echo "$2 -> M: $MAJOR m:$MINOR p:$PATCH s:$SPECIAL"
if [ "$2" == "lt" ]; then
semverLT $1 $3
RESULT=$?
echo $RESULT
exit $RESULT
fi

semverEQ $1 $2
echo "$1 == $2 -> $?."
if [ "$2" == "gt" ]; then
semverGT $1 $3
RESULT=$?
echo $RESULT
exit $RESULT
fi

semverLT $1 $2
echo "$1 < $2 -> $?."
if [ "$2" == "bump_major" ]; then
semverBumpMajor $1 VERSION
echo ${VERSION}
exit 0
fi

semverGT $1 $2
echo "$1 > $2 -> $?."
if [ "$2" == "bump_minor" ]; then
semverBumpMinor $1 VERSION
echo ${VERSION}
exit 0
fi

if [ "$2" == "bump_patch" ]; then
semverBumpPatch $1 VERSION
echo ${VERSION}
exit 0
fi

if [ "$2" == "strip_special" ]; then
semverStripSpecial $1 VERSION
echo ${VERSION}
exit 0
fi
fi
Loading