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

set -xe

ARTIFACT_NAME=cassandra-dtest
REPO_DIR="${M2_HOME:-${HOME}/.m2/repository}"
SCRIPT_DIR=$( dirname -- "$( readlink -f -- "$0"; )"; )
CASSANDRA_VERSION=$(cat build.xml | grep 'property name="base.version"' | awk -F "\"" '{print $4}')
GIT_HASH=$(git rev-parse --short HEAD)
DTEST_ARTIFACT_ID=${ARTIFACT_NAME}-local
DTEST_JAR_DIR="$(dirname "${SCRIPT_DIR}/")/dtest-jars"

echo "${CASSANDRA_VERSION}"
echo "${GIT_HASH}"
echo "${DTEST_ARTIFACT_ID}"
echo "${JAVA_HOME}"

ant realclean
ant dtest-jar -Dno-checkstyle=true

# Install the version that will be shaded
"${SCRIPT_DIR}/mvnw" install:install-file                            \
                     -Dfile="./build/dtest-${CASSANDRA_VERSION}.jar" \
                     -DgroupId=org.apache.cassandra                  \
                     -DartifactId="${DTEST_ARTIFACT_ID}"             \
                     -Dversion="${CASSANDRA_VERSION}-${GIT_HASH}"    \
                     -Dpackaging=jar                                 \
                     -DgeneratePom=true                              \
                     -DlocalRepositoryPath="${REPO_DIR}"

# Create shaded artifact
"${SCRIPT_DIR}/mvnw" --file "${SCRIPT_DIR}/relocate-dtest-dependencies.pom" package     \
                     -Drevision="${CASSANDRA_VERSION}"                                  \
                     -DskipTests                                                        \
                     -Ddtest.version="${CASSANDRA_VERSION}-${GIT_HASH}"                 \
                     -Dmaven.repo.local="${REPO_DIR}"                                   \
                     -DoutputFilePath="${DTEST_JAR_DIR}/dtest-${CASSANDRA_VERSION}.jar" \
                     -Drelocation.prefix="shaded-${GIT_HASH}"                           \
                     --no-snapshot-updates --update-snapshots

# Install the shaded version
"${SCRIPT_DIR}/mvnw" install:install-file                                     \
                     -Dfile="${DTEST_JAR_DIR}/dtest-${CASSANDRA_VERSION}.jar" \
                     -DgroupId=org.apache.cassandra                           \
                     -DartifactId="${DTEST_ARTIFACT_ID}-all"                  \
                     -Dversion="${CASSANDRA_VERSION}"                         \
                     -Dpackaging=jar                                          \
                     -DgeneratePom=true                                       \
                     -DlocalRepositoryPath="${REPO_DIR}"

set +xe
