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

# creates a source release - this is a .tar.gz file containing all the source code files that are permitted to be released.

set -e

###############################################################################
fail() {
    echo >&2 "$@"
    exit 1
}

###############################################################################
show_help() {
    cat >&2 <<END
Usage: make-release-artifacts.sh [-v version] [-r rc_number]
Prepares and builds the source and binary distribution artifacts of a Brooklyn
release.

  -vVERSION                  overrides the name of this version, if detection
                             from pom.xml is not accurate for any reason.
  -rRC_NUMBER                specifies the release candidate number. The
                             produced artifact names include the 'rc' suffix,
                             but the contents of the archive artifact do *not*
                             include the suffix. Therefore, turning a release
                             candidate into a release requires only renaming
                             the artifacts.
  -y                         answers "y" to all questions automatically, to
                             use defaults and make this suitable for batch mode

Specifying the RC number is required. Specifying the version number is
discouraged; if auto detection is not working, then this script is buggy.

Additionally if APACHE_DIST_SVN_DIR is set, this will transfer artifacts to
that directory and svn commit them.
END
# ruler                      --------------------------------------------------
}

###############################################################################
confirm() {
    # call with a prompt string or use a default
    if [ "${batch_confirm_y}" == "true" ] ; then
        true
    else
      read -r -p "${1:-Are you sure? [y/N]} " response
      case $response in
        [yY][eE][sS]|[yY]) 
            true
            ;;
        *)
            false
            ;;
      esac
    fi
}

###############################################################################
detect_version() {
    if [ \! -z "${current_version}" ]; then
        return
    fi

    set +e
    current_version=$( xmlstarlet select -t -v '/_:project/_:version/text()' pom.xml 2>/dev/null )
    success=$?
    set -e
    if [ "${success}" -ne 0 -o -z "${current_version}" ]; then
        fail Could not detect version number
    fi
}

###############################################################################
# Argument parsing
rc_suffix=
OPTIND=1
while getopts "h?v:r:y?" opt; do
    case "$opt" in
        h|\?)
            show_help
            exit 0
            ;;
        v)
            current_version=$OPTARG
            ;;
        r)
            rc_suffix=$OPTARG
            ;;
        y)
            batch_confirm_y=true
            ;;
        *)
            show_help
            exit 1
    esac
done

shift $((OPTIND-1))
[ "$1" = "--" ] && shift

###############################################################################
# Prerequisite checks
[ -d .git ] || fail Must run in brooklyn project root directory

detect_version

###############################################################################
# Determine all filenames and paths, and confirm

release_name=apache-brooklyn-${current_version}
if [ -z "$rc_suffix" ]; then
    fail Specifying the RC number is required
else
    artifact_name=${release_name}-rc${rc_suffix}
fi

release_script_dir=$( cd $( dirname $0 ) && pwd )
brooklyn_dir=$( pwd )
rm -rf ${release_script_dir}/tmp
staging_dir="${release_script_dir}/tmp/source/"
src_staging_dir="${release_script_dir}/tmp/source/${release_name}-src"
bin_staging_dir="${release_script_dir}/tmp/bin/"
artifact_dir="${release_script_dir}/tmp/${artifact_name}"

echo "The version is ${current_version}"
echo "The rc suffix is rc${rc_suffix}"
echo "The release name is ${release_name}"
echo "The artifact name is ${artifact_name}"
echo "The artifact directory is ${artifact_dir}"
if [ ! -z "${APACHE_DIST_SVN_DIR}" ] ; then
  echo "The artifacts will be copied and uploaded via ${APACHE_DIST_SVN_DIR}"
else
  echo "The artifacts will not be copied and uploaded to the svn repo"
fi
echo ""
confirm "Is this information correct? [y/N]" || exit
echo ""
echo "WARNING! This script will run 'git clean -dxf' to remove ALL files that are not under Git source control."
echo "This includes build artifacts and all uncommitted local files and directories."
echo "If you want to check what will happen, answer no and run 'git clean -dxn' to dry run."
echo ""
confirm || exit
echo ""
echo "This script will cause uploads to be made to a staging repository on the Apache Nexus server."
echo ""
confirm "Shall I continue?  [y/N]" || exit

###############################################################################
# Clean the workspace
git clean -dxf

###############################################################################
# Source release
echo "Creating source release folder ${release_name}"
set -x
mkdir -p ${src_staging_dir}
mkdir -p ${bin_staging_dir}
# exclude: 
# * docs (which isn't part of the release, and adding license headers to js files is cumbersome)
# * sandbox (which hasn't been vetted so thoroughly)
# * release (where this is running, and people who *have* the release don't need to make it)
# * jars and friends (these are sometimes included for tests, but those are marked as skippable,
#     and apache convention does not allow them in source builds; see PR #365
rsync -rtp --exclude .git\* --exclude docs/ --exclude sandbox/ --exclude release/ --exclude '**/*.[ejw]ar' . ${staging_dir}/${release_name}-src

rm -rf ${artifact_dir}
mkdir -p ${artifact_dir}
set +x
echo "Creating artifact ${artifact_dir}/${artifact_name}-src.tar.gz and .zip"
set -x
( cd ${staging_dir} && tar czf ${artifact_dir}/${artifact_name}-src.tar.gz ${release_name}-src )
( cd ${staging_dir} && zip -qr ${artifact_dir}/${artifact_name}-src.zip ${release_name}-src )

###############################################################################
# Binary release
set +x
echo "Proceeding to build binary release"
set -x

# Set up GPG agent
if ps x | grep [g]pg-agent ; then
  echo "gpg-agent already running; assuming it is set up and exported correctly."
else
  eval $(gpg-agent --daemon --no-grab --write-env-file $HOME/.gpg-agent-info)
  GPG_TTY=$(tty)
  export GPG_TTY GPG_AGENT_INFO
fi

# Workaround for bug BROOKLYN-1
( cd ${src_staging_dir} && mvn clean --projects :brooklyn-archetype-quickstart )

# Perform the build and deploy to Nexus staging repository
( cd ${src_staging_dir} && mvn deploy -Papache-release )
## To test the script without a big deploy, use the line below instead of above
#( cd ${src_staging_dir} && cd usage/dist && mvn clean install )

# Re-pack the archive with the correct names
tar xzf ${src_staging_dir}/usage/dist/target/brooklyn-dist-${current_version}-dist.tar.gz -C ${bin_staging_dir}
mv ${bin_staging_dir}/brooklyn-dist-${current_version} ${bin_staging_dir}/${release_name}-bin

( cd ${bin_staging_dir} && tar czf ${artifact_dir}/${artifact_name}-bin.tar.gz ${release_name}-bin )
( cd ${bin_staging_dir} && zip -qr ${artifact_dir}/${artifact_name}-bin.zip ${release_name}-bin )

###############################################################################
# Signatures and checksums

# OSX doesn't have sha256sum, even if MacPorts md5sha1sum package is installed.
# Easy to fake it though.
which sha256sum >/dev/null || alias sha256sum='shasum -a 256' && shopt -s expand_aliases

( cd ${artifact_dir} &&
    for a in *.tar.gz *.zip; do
        md5sum -b ${a} > ${a}.md5
        sha1sum -b ${a} > ${a}.sha1
        sha256sum -b ${a} > ${a}.sha256
        gpg2 --armor --output ${a}.asc --detach-sig ${a}
    done
)

###############################################################################

if [ ! -z "${APACHE_DIST_SVN_DIR}" ] ; then
  pushd ${APACHE_DIST_SVN_DIR}
  rm -rf ${artifact_name}
  cp -r ${artifact_dir} ${artifact_name}
  svn add ${artifact_name}
  svn commit --message "Add ${artifact_name} artifacts for incubator/brooklyn"
  artifact_dir=${APACHE_DIST_SVN_DIR}/${artifact_name}
  popd
fi

###############################################################################
# Conclusion

set +x
echo "The release is done - here is what has been created:"
ls ${artifact_dir}
echo "You can find these files in: ${artifact_dir}"
echo "The git commit ID for the voting emails is: $( git rev-parse HEAD )"
