#!/bin/bash
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License.  You may obtain a copy of the License at
#
#   http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied.  See the License for the
# specific language governing permissions and limitations
# under the License.

set -e

usage() {
    cat << USAGE
Usage: setnextversion.sh --version string [OPTIONS]...
Set the next version of CloudStack in the POMs.

Mandatory arguments:
   -v, --version string                    Set the next version to be applied

Optional arguments:
   -b, --branch string                     Set the branch to update the version into (default "main")
   -s, --sourcedir string                  Set the source directory to clone repo into (default "$sourcedir")
   -n, --no-commit                         Apply only the version change and don't git commit them (default "false")

Other arguments:
   -h, --help                              Display this help message and exit

Examples:
   setnextversion.sh --version x.y.z.a-SNAPSHOT
   setnextversion.sh --version x.y.z.a-SNAPSHOT --branch foo-feature
   setnextversion.sh --version x.y.z.a-SNAPSHOT --sourcedir /path/to/cloudstack/repo
   setnextversion.sh --version x.y.z.a-SNAPSHOT --no-commit

USAGE
    exit 0
}

while [ -n "$1" ]; do
    case "$1" in
        -h | --help)
            usage
            ;;

        -v | --version)
            if [ -n "$version" ]; then
                echo "ERROR: you have already entered value for -v, --version"
                exit 1
            else
                version=$2
                shift 2
            fi
            ;;

        -b | --branch)
            if [ -n "$branch" ]; then
                echo "ERROR: you have already entered value for -b, --branch"
                exit 1
            else
                branch=$2
                shift 2
            fi
            ;;

        -s | --sourcedir)
            if [ -n "$sourcedir" ]; then
                echo "ERROR: you have already entered value for -s, --sourcedir"
                exit 1
            else
                sourcedir=$2
                shift 2
            fi
            ;;

        -n | --no-commit)
            if [ "$nocommit" == "true" ]; then
                echo "ERROR: you have already entered value for -n, --no-commit"
                exit 1
            else
                nocommit="true"
                shift 1
            fi
            ;;

        -*|*)
            echo "ERROR: no such option $1. -h or --help for help"
            exit 1
            ;;
    esac
done

if [ -z "$version" ]; then
    echo >&2 "A version must be specified with the -v, --version option: $0 -v 4.0.0.RC1"
    exit 1
fi

if [ -z "$branch" ]; then
    branch="main"
fi

if [ -z "$sourcedir" ]; then
    sourcedir="~/cloudstack/"
fi

if [ -z "$nocommit" ]; then
    nocommit="false"
fi

echo "Using version          : $version"
echo "Using source directory : $sourcedir"
echo "Using branch           : $branch"

cd $sourcedir

echo "checking out correct branch"
git checkout $branch

echo "determining current POM version"
export currentversion=`mvn org.apache.maven.plugins:maven-help-plugin:2.1.1:evaluate -Dexpression=project.version -B | grep -v '\['`
echo "found $currentversion"

echo "setting new version numbers"
mvn versions:set -DnewVersion=$version -P vmware -P developer -P systemvm -P simulator -Dnoredist versions:commit

perl -pi -e "s/$currentversion/$version/" debian/changelog
perl -pi -e "s/$currentversion/$version/" tools/checkstyle/pom.xml
perl -pi -e "s/$currentversion/$version/" tools/marvin/setup.py

# Dockerfiles
perl -pi -e "s/Version=\"$currentversion\"/Version=\"$version\"/" tools/docker/Dockerfile

# Marvin Dockerfiles
perl -pi -e "s/Version=\"$currentversion\"/Version=\"$version\"/" tools/docker/Dockerfile.marvin
perl -pi -e "s/Marvin-(.*).tar.gz/Marvin-${version}.tar.gz/" tools/docker/Dockerfile.marvin

# systemtpl.sh:  system vm template version without -SNAPSHOT

git clean -f

if [ "$nocommit" == "false" ]; then
    echo "commit changes"
    git commit -a -s -m "Updating pom.xml version numbers for release $version"
    export commitsh=`git show HEAD | head -n 1 | cut -d ' ' -f 2`

    echo "committed as $commitsh"
fi
