#!/usr/bin/env 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 dist.apache.org/dev and
# close the maven repos.  Call a vote.
#
# Presumes your settings.xml all set up so can sign artifacts published to mvn, etc.

set -e

# Script checks out a tag, cleans the checkout and then builds src and bin
# tarballs. It then deploys to the apache maven repository.
# Presumes run from git dir.

# Need a git tag to build.
if [ "$1" = "" ]
then
  echo -n "Usage: $0 TAG_TO_PACKAGE"
  exit 1
fi
git_tag=$1

# Set mvn
mvn=mvn
if [ "$MAVEN" != "" ]; then
  mvn="${MAVEN}"
fi

# Ensure we are inside a git repo before making progress
# The below will fail if outside git.
git -C . rev-parse

# Checkout git_tag
git checkout "${git_tag}"

# Get mvn project version
#shellcheck disable=SC2016
version=$(${mvn} -q -N -Dexec.executable="echo" -Dexec.args='${project.version}' exec:exec)
hbase_name="hbase-thirdparty-${version}"

# Make a dir to save tgzs into.
d=`date -u +"%Y%m%dT%H%M%SZ"`
output_dir="${TMPDIR}/$hbase_name.$d"
mkdir -p "${output_dir}"

# Make sure all clean.
git clean -f -x -d
${mvn} clean

# Run a rat check.
${mvn} apache-rat:check

# Build src.
git archive --format=tar.gz --output="${output_dir}/${hbase_name}-src.tar.gz" --prefix="${hbase_name}/" "${git_tag}"

# Deploy to mvn repository
${mvn} clean deploy -Papache-release -Prelease

# Do sha512
cd ${output_dir}
for i in *.tar.gz; do echo $i; gpg --print-md SHA512 $i > $i.sha512 ; done

echo "Check the content of ${output_dir}.  If good, sign and push to dist.apache.org/dev"
echo "  e.g. gpg --armor --output ${hbase_name}-src.tar.gz.asc --detach-sig ${hbase_name}-src.tar.gz "
echo "Also, check the content deployed to maven.  If good, close the repo and record links of temporary staging repo"
