#!/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.

# Script that assembles all you need to make an RC. Does build of the tar.gzs
# which it stashes into a dir above $(pwd) named for the script with a
# timestamp suffix. Deploys builds to maven.
#
# To finish, check what was build.  If good copy to people.apache.org and
# close the maven repos.  Call a vote. 
#
# Presumes that dev-support/generate-hadoopX-poms.sh has already been run.
# Presumes your settings.xml all set up so can sign artifacts published to mvn, etc.

set -e

devsupport=`dirname "$0"`
devsupport=`cd "$devsupport">/dev/null; pwd`

# Set mvn and mvnopts
mvn=mvn
if [ "$MAVEN" != "" ]; then
  mvn="${MAVEN}"
fi
mvnopts="-Xmx3g"
if [ "$MAVEN_OPTS" != "" ]; then
  mvnopts="${MAVEN_OPTS}"
fi
mvnopts="${mvnopts} -Dhttps.protocols=TLSv1.2"

# Make a dir to save tgzs in.
d=`date -u +"%Y%m%dT%H%M%SZ"`
archivedir="$(pwd)/../`basename $0`.$d"
echo "Archive dir ${archivedir}"
mkdir -p "${archivedir}"

function tgz_mover {
  mv ./hbase-assembly/target/hbase-*.tar.gz "${archivedir}"
}

function deploy {
  MAVEN_OPTS="${mvnopts}" ${mvn} clean install -DskipTests -Prelease \
    -Dmaven.repo.local=${archivedir}/repository
  MAVEN_OPTS="${mvnopts}" ${mvn} install -DskipTests post-site assembly:single -Prelease \
    -Dmaven.repo.local=${archivedir}/repository
  tgz_mover
  MAVEN_OPTS="${mvnopts}" ${mvn} deploy -DskipTests -Papache-release -Prelease \
    -Dmaven.repo.local=${archivedir}/repository
}

# Build src tarball
# run clean separate from assembly:single because it fails to clean shaded modules correctly
MAVEN_OPTS="${mvnopts}" ${mvn} clean
MAVEN_OPTS="${mvnopts}" ${mvn} install -DskipTests assembly:single \
  -Dassembly.file="$(pwd)/hbase-assembly/src/main/assembly/src.xml" \
  -Prelease -Dmaven.repo.local=${archivedir}/repository

tgz_mover

# Now do the two builds,  one for hadoop1, then hadoop2
deploy

echo "DONE"
echo "Check the content of ${archivedir}.  If good, sign and push to dist.apache.org"
echo " cd ${archivedir}"
echo ' for i in *.tar.gz; do echo $i; gpg --print-mds $i > $i.mds ; done'
echo ' for i in *.tar.gz; do echo $i; gpg --print-md MD5 $i > $i.md5 ; done'
echo ' for i in *.tar.gz; do echo $i; gpg --print-md SHA512 $i > $i.sha512 ; done'
echo ' for i in *.tar.gz; do echo $i; gpg --armor --output $i.asc --detach-sig $i  ; done'
echo ' rsync -av ${archivedir}/*.gz ${archivedir}/*.mds ${archivedir}/*.asc ~/repos/dist-dev/hbase-VERSION/'
echo "Check the content deployed to maven.  If good, close the repo and record links of temporary staging repo"
echo "If all good tag the RC"
