#!/usr/bin/env bash

# This script should be used *after* a successful vote to publish a
# release. In addition to publishing the source tarball to svn repo
# this script also publishes the corresponding jar to Maven.

set -e

# Use 'atexit' for cleanup.
. $(dirname ${0})/atexit.sh

# Use colors for errors.
. $(dirname ${0})/colors.sh

test ${#} -eq 2 || \
  { echo "Usage: `basename ${0}` [version] [candidate]"; exit 1; }

VERSION=${1}
CANDIDATE=${2}
TAG="${VERSION}-rc${CANDIDATE}"

echo "${GREEN}Releasing mesos-${TAG} as mesos-${VERSION}${NORMAL}"

read -p "Hit enter to continue ... "

WORK_DIR=`mktemp -d /tmp/mesos-release-XXXX`
atexit "rm -rf ${WORK_DIR}"

pushd ${WORK_DIR}

SVN_DEV_REPO="https://dist.apache.org/repos/dist/dev/mesos"

echo "${GREEN}Downloading the artifacts from the dev repo ...${NORMAL}"
svn export ${SVN_DEV_REPO}/${TAG}

SVN_RELEASE_REPO="https://dist.apache.org/repos/dist/release/mesos"
SVN_RELEASE_LOCAL="${WORK_DIR}/release"

echo "${GREEN}Checking out svn release repo ...${NORMAL}"

# Note '--depth=empty' ensures none of the existing files
# in the repo are checked out, saving time and space.
svn co --depth=empty ${SVN_RELEASE_REPO} ${SVN_RELEASE_LOCAL}

echo "${GREEN}Uploading the artifacts (the distribution," \
  "signature, and checksum) to the release repo ${NORMAL}"

mv ${TAG} ${SVN_RELEASE_LOCAL}/${VERSION}

pushd ${SVN_RELEASE_LOCAL}

svn add ${VERSION}
svn commit -m "Adding mesos-${VERSION}."

popd # ${SVN_RELEASE_LOCAL}

popd # ${WORK_DIR}

echo "${GREEN}Tagging ${TAG} as ${VERSION} ${NORMAL}"

git tag -a ${VERSION} ${TAG} -m "Tagging Mesos ${VERSION}"

echo "${GREEN}Pushing the git tag to the repository...${NORMAL}"

MESOS_GIT_URL="https://git-wip-us.apache.org/repos/asf/mesos.git"

git push ${MESOS_GIT_URL} ${VERSION}

echo "${GREEN}Successfully published artifacts to svn release repo ...${NORMAL}"

echo "${GREEN}Please *release* the staging maven repository that contains the mesos jar ...${NORMAL}"

input=""
while [ ! ${input:-n} = "y" ]; do
  read -p "Have you released the maven repository? (y/n): " input
  [ ${input:-n} = "y" ] || echo "Please release the staging maven repository before continuing"
done

echo "${GREEN}Success! Now send the following RESULT VOTE email ...${NORMAL}"

# Create the email body template to be sent to {dev,user}@mesos.apache.org.
MESSAGE=$(cat <<__EOF__
To: dev@mesos.apache.org, user@mesos.apache.org
Subject: [RESULT][VOTE] Release Apache Mesos ${VERSION} (rc${CANDIDATE})

Hi all,

The vote for Mesos ${VERSION} (rc${CANDIDATE}) has passed with the
following votes.

+1 (Binding)
------------------------------
***
***
***

+1 (Non-binding)
------------------------------
***
***
***

There were no 0 or -1 votes.

Please find the release at:
${SVN_RELEASE_REPO}/${VERSION}

It is recommended to use a mirror to download the release:
http://www.apache.org/dyn/closer.cgi

The CHANGELOG for the release is available at:
https://git-wip-us.apache.org/repos/asf?p=mesos.git;a=blob_plain;f=CHANGELOG;hb=${VERSION}

The mesos-${VERSION}.jar has been released to:
https://repository.apache.org

The website (http://mesos.apache.org) will be updated shortly to reflect this release.

Thanks,
__EOF__
)

echo "${MESSAGE}"

exit 0
