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

# Adapted from https://github.com/apache/datafusion/blob/main/dev/release/create-tarball.sh

# This script creates a signed tarball in
# dev/dist/apache-datafusion-java-<version>-rc<rc>/apache-datafusion-java-<version>.tar.gz
# and uploads it to the "dev" area of the dist.apache.datafusion repository,
# then prints an email template for the dev@datafusion.apache.org list for a
# formal vote.
#
# See dev/release/README.md for full release instructions.
#
# Requirements:
#
# 1. gpg setup for signing and have uploaded your public
#    signature to https://pgp.mit.edu/ and the project KEYS file.
#
# 2. Logged into the Apache SVN server with the appropriate
#    credentials.
#
# Based in part on 02-source.sh from apache/arrow.

set -e

SOURCE_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
SOURCE_TOP_DIR="$(cd "${SOURCE_DIR}/../../" && pwd)"

if [ "$#" -ne 2 ]; then
    echo "Usage: $0 <version> <rc>"
    echo "ex. $0 0.1.0 1"
    exit
fi

version=$1
rc=$2
tag="${version}-rc${rc}"

release=apache-datafusion-java-${version}
distdir=${SOURCE_TOP_DIR}/dev/dist/${release}-rc${rc}
tarname=${release}.tar.gz
tarball=${distdir}/${tarname}
url="https://dist.apache.org/repos/dist/dev/datafusion/${release}-rc${rc}"

echo "Attempting to create ${tarball} from tag ${tag}"
release_hash=$(cd "${SOURCE_TOP_DIR}" && git rev-list --max-count=1 ${tag})

if [ -z "$release_hash" ]; then
    echo "Cannot continue: unknown git tag: ${tag}"
    exit 1
fi

echo "Draft email for dev@datafusion.apache.org mailing list"
echo ""
echo "---------------------------------------------------------"
cat <<MAIL
To: dev@datafusion.apache.org
Subject: [VOTE] Release Apache DataFusion Java ${version} RC${rc}
Hi,

I would like to propose a release of Apache DataFusion Java version ${version}.

This release candidate is based on commit: ${release_hash} [1]
The proposed release tarball and signatures are hosted at [2].
The changelog is located at [3].
The staged Maven artifacts can be found at [4].

Please download, verify checksums and signatures, run the unit tests, and vote
on the release. The vote will be open for at least 72 hours.

Only votes from PMC members are binding, but all members of the community are
encouraged to test the release and vote with "(non-binding)".

The standard verification procedure is documented at
https://github.com/apache/datafusion-java/blob/main/dev/release/README.md#verifying-release-candidates.

[ ] +1 Release this as Apache DataFusion Java ${version}
[ ] +0
[ ] -1 Do not release this as Apache DataFusion Java ${version} because...

Here is my vote:

+1

[1]: https://github.com/apache/datafusion-java/tree/${release_hash}
[2]: ${url}
[3]: https://github.com/apache/datafusion-java/blob/${release_hash}/dev/changelog/${version}.md
[4]: https://repository.apache.org/#nexus-search;quick~datafusion-java
MAIL
echo "---------------------------------------------------------"


# create <tarball> containing the files in git at $release_hash
# the files in the tarball are prefixed with apache-datafusion-java-<version>/
mkdir -p ${distdir}
(cd "${SOURCE_TOP_DIR}" && git archive ${release_hash} --prefix ${release}/ | gzip > ${tarball})

echo "Signing tarball and creating checksums"
gpg --armor --output ${tarball}.asc --detach-sig ${tarball}
# create checksums with relative path of tarball so that they can be verified
# with a command such as
#   shasum --check apache-datafusion-java-0.1.0.tar.gz.sha512
(cd ${distdir} && shasum -a 256 ${tarname}) > ${tarball}.sha256
(cd ${distdir} && shasum -a 512 ${tarname}) > ${tarball}.sha512


echo "Uploading to datafusion dist/dev to ${url}"
svn co --depth=empty https://dist.apache.org/repos/dist/dev/datafusion ${SOURCE_TOP_DIR}/dev/dist
svn add ${distdir}
svn ci -m "Apache DataFusion Java ${version} RC${rc}" ${distdir}
