#! /bin/sh

# showusage is set to 1 on any command-line syntax error
showusage=0
# are we playing by stable or dev rules?
repo=
# test is set to 1 if -t/--test is given to prevent modifications
test=0

case "$#" in
 1) repo=$1
    ;;
 2) repo=$2
    case $1 in
     -t|--test)
	test=1
	;;
     *)
	showusage=1
	;;
    esac
    ;;
 *) showusage=1
    ;;
esac

case "$repo" in
 dev|stable)
    ;;
 '')
    showusage=1
    ;;
 *) echo "Unexpected repo type: <$repo>!"
    showusage=1
    ;;
esac

case "$showusage" in
 1) echo "Usage: $0 [-t] <stable|dev>"
    echo "No changes are made to packageinfo.sh if -t is given."
    exit 1
    ;;
esac


set -e
 
. ./packageinfo.sh

case "$repotype" in
 $repo)
    ;;
 *) echo "You indicated repo type <$repo> but packageinfo.sh"
    echo "indicates <$repotype>."
    exit 1
    ;;
esac

ver_repo_mismatch=1

case "$minor" in
 1|3|5|7|9)
    case "$repo" in
     dev)
	ver_repo_mismatch=0
	;;
     stable)
	;;
    esac
    ;;
 0|2|4|6|8)
    case "$repo" in
     dev)
	;;
     stable)
	ver_repo_mismatch=0
	;;
    esac
    ;;
esac

case "$ver_repo_mismatch" in
 1) echo "Minor version <$minor> mismatches repotype <$repo>."
    exit 1
    ;;
esac

# Do we want to bump the point?
bp=1
# Do we want to bump the beta point?
bbp=0
# Do we want to change the RC point? (n=no, z=empty rcpoint and zero
# betapoint, i=incr)
crcp=n
# Do we want to change the prerelease value?
setpr=0

# for stable:
# if we are not in a beta or RC state, enter beta unless point is NEW.
# if we are in a beta state:
# - bump the beta point
# else if we are in an RC state:
# - if rcpoint is GO:
# - - set rcpoint= (empty)
# - - set prerelease= (empty)
# - - set betapoint=0
# - else
# - - if rcpoint==(empty)
# - - - (bump-point) and set rcpoint to 0 (and fall thru, so -RC1 is first)
# - - bump the RC point

# for dev, we only want to bump-point and possibly clear prerelease, 
# but we do not modify rcpoint nor betapoint.

case "$repo" in
 dev)
    case "$point" in
     [Nn][Ee][Ww])
	crcp=z
	;;
     *)
	# crcp=n
	;;
    esac
    # bp=1
    ;;
 stable)
    case "$prerelease" in
     '')
	case "$betapoint::$rcpoint::$point" in
	 *::*::NEW)
	    # new minor release (no p)
	    crcp=z
	    # bp=1
	    ;;
	 0::::*)
	    # start of first beta cycle for the next point release
	    setpr=1
	    newpr=beta
	    # bp=1
	    bbp=1
	    ;;
	 0::[Gg][Oo]::*)
	    # skip all -beta and -RC prereleases to the next point.
	    crcp=z
	    setpr=1
	    newpr=
	    # bp=1
	    # bbp=0
	    ;;
	 *) echo "betapoint is <$betapoint>, rcpoint is <$rcpoint>"
	    echo "betapoint must be 0 and rcpoint must be empty to start the"
	    echo "beta cycle."
	    exit 1
	    ;;
	esac
	;;
     beta)
	case "$betapoint::$rcpoint" in
	 [1-9]*::*)
	    bp=0
	    bbp=1
	    ;;
	 0::) echo "betapoint is 0, rcpoint emtpy, and prerelease is beta."
	    echo "You probably intended prerelease=  (that is, empty).  It"
	    echo "will then be changed to beta by this script, starting the"
	    echo "first beta for the next point release."
	    exit 1
	    ;;
	 *)
	    bp=0
	    bbp=1
	    ;;
	esac
	case "$rcpoint" in
	 [Gg][Oo])
	    echo "prerelease is beta, rcpoint is GO, disallowed."
	    echo "rcpoint GO is allowed only when prerelease is RC or empty."
	    exit 1
	    ;;
	esac
	;;
     rc|RC)
	case "$rcpoint" in
	 '')
	    case "$betapoint" in
	     0) # bp=1
		;;
	     *) bp=0
		;;
	    esac
	    crcp=i
	    ;;
	 [1-9]*)
	    bp=0
	    crcp=i
	    ;;
	 [Gg][Oo])
	    bp=0
	    crcp=z
	    setpr=1
	    newpr=
	    ;;
	 *) echo "Unexpected value for 'rcpoint' <$rcpoint>!"
	    exit 1
	    ;;
	esac
	;;
     *)
	echo "prerelease <$prerelease> unexpected"
	exit 1
	;;
    esac
    ;;
 *) echo "impossible: repo <$repo>!"
    exit 1
    ;;
esac

case "$repo::$bp::$point" in
 *::0::*)
    newpoint=$point
    ;;
 dev::1::0)
    newpoint=`expr $point + 1`
    ;;
 *::1::[1-9]*)
    newpoint=`expr $point + 1`
    ;;
 dev::1::)
    newpoint=0
    ;;
 stable::1::)
    newpoint=1
    ;;
 *::1::[Nn][Ee][Ww])
    newpoint=
    ;;
 *) echo "Unexpected value for 'point' <$point>! (repo::bp::point is $repo::$bp::$point)"
    exit 1
    ;;
esac

case "$bbp::$betapoint" in
 0::*)
    newbetapoint=$betapoint
    ;;
 1::[0-9]*)
    newbetapoint=`expr $betapoint + 1`
    ;;
 *) echo "Unexpected value for 'betapoint' <$betapoint>!"
    exit 1
    ;;
esac

case "$crcp::$rcpoint" in
 n::*)
    newrcpoint=$rcpoint
    ;;
 i::)
    newrcpoint=1
    ;;
 i::[0-9]*)
    newrcpoint=`expr $rcpoint + 1`
    ;;
 z::*)
    newrcpoint=
    newbetapoint=0
    ;;
 *) echo "Unexpected value for 'crcp::rcpoint' <$crcp::$rcpoint>!"
    exit 1
    ;;
esac

case "$setpr" in
 0)
    newpr=$prerelease
esac

# display results
printf "prerelease		$prerelease"
case "$newpr" in
 $prerelease)
    printf "\n"
    ;;
 *) printf " -> $newpr\n"
    ;;
esac
printf "point			$point"
case "$newpoint" in
 $point)
    printf "\n"
    ;;
 *) printf " -> $newpoint\n"
    ;;
esac
printf "betapoint		$betapoint"
case "$newbetapoint" in
 $betapoint)
    printf "\n"
    ;;
 *) printf " -> $newbetapoint\n"
    ;;
esac
printf "rcpoint			$rcpoint"
case "$newrcpoint" in
 $rcpoint)
    printf "\n"
    ;;
 *) printf " -> $newrcpoint\n"
    ;;
esac

printf "Previous version: "
scripts/build/VersionName

# apply packageinfo.sh changes

sed -e "s/^point=.*/point=$newpoint/"			\
    -e "s/^betapoint=.*/betapoint=$newbetapoint/"	\
    -e "s/^rcpoint=.*/rcpoint=$newrcpoint/"		\
    -e "s/^prerelease=.*/prerelease=$newpr/"		\
	< packageinfo.sh					\
	> packageinfo.sh+

case "$test" in
 0)
    mv packageinfo.sh+ packageinfo.sh
    printf "Updated version: "
    scripts/build/VersionName
    ;;
 *)
    printf "Next version would be: "
    scripts/build/VersionName -p ./packageinfo.sh+
    rm packageinfo.sh+
    ;;
esac
