#!/bin/sh
#####################################################################
# 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

# this script requires a posix shell; namely, $(( math evaluation.

help() {
    cat << _EOF_
$0 [options]

mergefromtrunk.sh merge \$rev        Apply revision \$rev from trunk.
mergefromtrunk.sh test            Run test suite(clean-all, load-demo, run-tests).
mergefromtrunk.sh commit        Commit current fix to svn.
mergefromtrunk.sh abort            Abort current merge session.

-h | --help        Show this help.
_EOF_
}

cmd=""
rev=""
while [ $# -gt 0 ]; do
    case "$1" in
        (-h|--help)
            help
            exit 0
            ;;
        (-*)
            echo "Unknown arg ($1)." 1>&2
            help 1>&2
            exit 1
            ;;
        (*)
            if [ z = "z$cmd" ]; then
                cmd="$1"
            else
                case "$cmd" in
                    (merge)
                        rev="$1"
                        ;;
                    (*)
                        echo "Too many arguments." 1>&2
                        help 1>&2
                        exit 1
                        ;;
                esac
            fi
            ;;
    esac
    shift
done
case "$cmd" in
    (merge)
        if [ z = "z$rev" ]; then
            echo "Need a revision." 1>&2
            help 1>&2
            exit 1
        fi
        if [ -d runtime/merge-state ]; then
            echo "Merge session already started." 1>&2
            help 1>&2
            exit 1
        fi
        mkdir -p runtime/merge-state
        echo "$rev" > runtime/merge-state/revision
        # do not run any of the following commands in a complex
        # chained pipe; if one of the commands in the pipe fails,
        # it isn't possible to detect the failure.
        printf "Applied fix from trunk for revision: %s \n===\n\n" "$rev" > runtime/merge-state/log-message
        svn log https://svn.apache.org/repos/asf/ofbiz/ofbiz-plugins/trunk -r "$rev" > runtime/merge-state/log.txt
        set -- $(wc -l runtime/merge-state/log.txt)
        head -n $(($1 - 1)) < runtime/merge-state/log.txt > runtime/merge-state/log.txt.head
        tail -n $(($1 - 4)) < runtime/merge-state/log.txt.head >> runtime/merge-state/log-message
        prevRev=$(($rev - 1))
        svn up
        svn merge -r "$prevRev:$rev" https://svn.apache.org/repos/asf/ofbiz/ofbiz-plugins/trunk
        ;;
    (test)
        ./gradlew cleanAll loadAll testIntegration
        ;;
    (commit)
        svn commit -F runtime/merge-state/log-message
        rm -rf runtime/merge-state
        ;;
    (abort)
        svn resolved . -R
        svn revert . -R
        rm -rf runtime/merge-state
        ;;
    ("")
        echo "Need a command and a revision." 1>&2
        help 1>&2
        exit 1
        ;;
    (*)
        echo "Unknown command($cmd)." 1>&2
        help 1>&2
        exit 1
        ;;
esac
