#!/bin/bash

echo ""
echo "-----------------------------------------------"
echo "  Verify Environment"

requiredExecutable() {
    hash $1 2>/dev/null 
    if [ $? != 0 ] ; then
        echo "ERROR: $1 not found.  Install $1"
        exit -1
    fi
}

requiredExecutable "git"
requiredExecutable "xmllint"
requiredExecutable "sed"
requiredExecutable "gpg"
requiredExecutable "egrep"
requiredExecutable "mvn"

proceedyn() {
    while true; do
        read -p "$1 " yn
        case ${yn:-$2} in
            [Yy]* ) return 0;;
            [Nn]* ) return 1;;
            * ) echo "Please answer yes or no.";;
        esac
    done
}

echo ""
echo "-----------------------------------------------"
echo "  Collect Information About Release"

function gitFindRemoteByUrl() {
    URL="$1"
    for GREMOTE in $(git remote); do
        git ls-remote --get-url $GREMOTE | grep "$URL" 2>&1 > /dev/null
        if [ $? -eq 0 ] ; then
            echo $GREMOTE
        fi
    done
    return 0
}

GIT_REMOTE_URL="git.eclipse.org/gitroot/jetty/org.eclipse.jetty.project.git"
GIT_REMOTE_ID=$(gitFindRemoteByUrl "$GIT_REMOTE_URL")
GIT_BRANCH_ID=$(git symbolic-ref -q --short HEAD || git describe --tags --exact-match)

if [ -z "$GIT_REMOTE_ID" ] ; then
    echo "ERROR: Unable to determine git remote id for $GIT_REMOTE_URL"
    echo "Are you running this build from a properly cloned git local repository?"
    exit -1
fi

# Ensure that git user is in their gpg key list
GIT_USER_EMAIL=`git config --get user.email`

#gpg -q --list-keys "$GIT_USER_EMAIL" 2>&1 > /dev/null
#if [ $? != 0 ] ; then
#    echo "ERROR: git user.email of $GIT_USER_EMAIL is not present in your gpg --list-keys"
#    echo "Go ahead and make one $ gpg --gen-key"
#    exit -1
#fi

VER_CURRENT=`sed -e "s/xmlns/ignore/" pom.xml | xmllint --xpath "/project/version/text()" -`
read -e -p "Release Version  ? " VER_RELEASE
read -e -p "Next Dev Version ? " VER_NEXT
# VER_RELEASE=9.3.5.v20151012
# VER_NEXT=9.3.6-SNAPSHOT
TAG_NAME="jetty-$VER_RELEASE"

# Ensure tag doesn't exist (yet)
git rev-parse --quiet --verify "$TAG_NAME" 2>&1 > /dev/null
if [ $? -eq 0 ] ; then
    echo ""
    echo "ERROR: Git Tag $TAG_NAME already exists"
    echo ""
    git show -s "$TAG_NAME"
    exit -1
fi

ALT_DEPLOY_DIR=$HOME/.m2/alt-deploy
if [ ! -d "$ALT_DEPLOY_DIR" ] ; then
    mkdir -p "$ALT_DEPLOY_DIR"
fi

DEPLOY_OPTS="-Dmaven.test.failure.ignore=true"
# DEPLOY_OPTS="-Dtest=None"
# DEPLOY_OPTS="$DEPLOY_OPTS -DaltDeploymentRepository=intarget::default::file://$ALT_DEPLOY_DIR/"

echo ""
echo "-----------------------------------------------"
echo "  Release Plan Review"
echo ""
echo "Git Remote ID    : $GIT_REMOTE_ID"
echo "Git Branch ID    : $GIT_BRANCH_ID"
echo "Git user.email   : $GIT_USER_EMAIL"
echo "Current Version  : $VER_CURRENT"
echo "Release Version  : $VER_RELEASE"
echo "Next Dev Version : $VER_NEXT"
echo "Tag name         : $TAG_NAME"
echo "Maven Deploy Opts: $DEPLOY_OPTS"

reportMavenTestFailures() {
    failFiles=$(egrep -lr --include="*.txt" -E "^Tests .* FAILURE" .)
    oldIFS="$IFS"
    IFS='
'
    IFS=${IFS:0:1}
    failarray=( $failFiles )
    IFS="$oldIFS"

    for index in ${!failarray[@]}; do
        echo ${failarray[index]}
        cat ${failarray[index]}
    done

    if [ ${#failarray[@]} -gt 0 ] ; then
        echo "There are ${#failarray[@]} Test Cases with failures"
    else
        echo "There are no testcases with failures"
    fi
}

echo ""
if proceedyn "Are you sure you want to release using above? (y/N)" n; then
    echo ""
    if proceedyn "Update VERSION.txt for $VER_RELEASE? (Y/n)" y; then
        mvn -N -Pupdate-version
        cp VERSION.txt VERSION.txt.backup
        cat VERSION.txt.backup | sed -e "s/$VER_CURRENT/$VER_RELEASE/" > VERSION.txt
        rm VERSION.txt.backup
    fi

    # This is equivalent to 'mvn release:prepare'
    if proceedyn "Update project.versions for $VER_RELEASE? (Y/n)" y; then
        mvn org.codehaus.mojo:versions-maven-plugin:2.1:set \
            -DoldVersion="$VER_CURRENT" \
            -DnewVersion="$VER_RELEASE"
    fi
    if proceedyn "Commit $VER_RELEASE updates? (Y/n)" y; then
        git commit -a -m "Updating to version $VER_RELEASE"
    fi
    if proceedyn "Create Tag $TAG_NAME? (Y/n)" y; then
        echo "TODO: Sign tags with GIT_USER_EMAIL=$GIT_USER_EMAIL"
        git tag -m "Creating tag $TAG_NAME" $TAG_NAME
    fi

    # This is equivalent to 'mvn release:perform'
    if proceedyn "Build/Deploy from tag $TAG_NAME? (Y/n)" y; then
        git checkout $TAG_NAME
        mvn clean package source:jar javadoc:jar gpg:sign deploy \
            -Peclipse-release $DEPLOY_OPTS
        reportMavenTestFailures
        git checkout $GIT_BRANCH_ID
    fi
    if proceedyn "Update working directory for $VER_NEXT? (Y/n)" y; then
        echo "Update VERSION.txt for $VER_NEXT"
        cp VERSION.txt VERSION.txt.backup
        echo "jetty-$VER_NEXT" > VERSION.txt
        echo "" >> VERSION.txt
        cat VERSION.txt.backup >> VERSION.txt
        echo "Update project.versions for $VER_NEXT"
        mvn org.codehaus.mojo:versions-maven-plugin:2.1:set \
            -DoldVersion="$VER_RELEASE" \
            -DnewVersion="$VER_NEXT"
        echo "Commit $VER_NEXT"
        if proceedyn "Commit updates in working directory for $VER_NEXT? (Y/n)" y; then
            git commit -a -m "Updating to version $VER_NEXT"
        fi
    fi
    if proceedyn "Push git commits to remote $GIT_REMOTE_ID? (Y/n)" y; then
        git push $GIT_REMOTE_ID $GIT_BRANCH_ID
        git push $GIT_REMOTE_ID --tags
    fi
else
    echo "Not performing release"
fi


