#!/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 -e
# set -x

function fail {
    >&2 echo "\033[31m
FATAL ERROR
-----------
$1
\033[0m"
    exit 1
}

function getJavaVersionFromPom {
    cat << EOF | xmllint --noent --shell pom.xml | grep content | cut -f2 -d=
setns pom=http://maven.apache.org/POM/4.0.0
xpath /pom:project/pom:properties/pom:maven.compiler.source/text()
EOF
}

function jdk_version() {
  local result
  local java_cmd
  if [[ -n $(type -p java) ]]
  then
    java_cmd=java
  elif [[ (-n "$JAVA_HOME") && (-x "$JAVA_HOME/bin/java") ]]
  then
    java_cmd="$JAVA_HOME/bin/java"
  fi
  local IFS=$'\n'
  # remove \r for Cygwin
  local lines=$("$java_cmd" -Xms32M -Xmx32M -version 2>&1 | tr '\r' '\n')
  if [[ -z $java_cmd ]]
  then
    result=no_java
  else
    for line in $lines; do
      if [[ (-z $result) && ($line = *"version \""*) ]]
      then
        local ver=$(echo $line | sed -e 's/.*version "\(.*\)"\(.*\)/\1/; 1q')
        # on macOS, sed doesn't support '?'
        if [[ $ver = "1."* ]]
        then
          result=$(echo $ver | sed -e 's/1\.\([0-9]*\)\(.*\)/\1/; 1q')
        else
          result=$(echo $ver | sed -e 's/\([0-9]*\)\(.*\)/\1/; 1q')
        fi
      fi
    done
  fi
  echo "$result"
}

function getProjectVersionFromPom {
    cat << EOF | xmllint --noent --shell pom.xml | grep content | cut -f2 -d=
setns pom=http://maven.apache.org/POM/4.0.0
xpath /pom:project/pom:version/text()
EOF
}

function getJdkToolchain {
    xmllint ~/.m2/toolchains.xml --xpath "/toolchains/toolchain[provides/version/text() = '$JAVA_VERSION']/configuration/jdkHome/text()"
}

function generate_promotion_script {
    echo "Generating release promotion script 'promote-$version.sh'"
read -d '' script <<- EOF
#!/bin/bash
echo "Promoting release $version

Actions about to be performed:
------------------------------

\$(cat \$0 | tail -n +14)

------------------------------------------"

read -p "Press enter to continue or CTRL-C to abort"

# push the release tag to ASF git repo

git push origin $tag

# promote the source distribution by moving it from the staging area to the release area

svn mv https://dist.apache.org/repos/dist/dev/wicket/$version https://dist.apache.org/repos/dist/release/wicket -m "Upload release to the mirrors"

mvn org.sonatype.plugins:nexus-staging-maven-plugin:1.6.7:rc-release -DstagingRepositoryId=$stagingrepoid -DnexusUrl=https://repository.apache.org -DserverId=apache.releases.https -Ddescription="Release vote has passed"

# Renumber the next development iteration $next_version:

git checkout $GIT_BRANCH
mvn release:update-versions --batch-mode
mvn versions:set versions:commit -DnewVersion=$next_version
git add --all

echo "
Check the new versions and commit and push them to origin:

  git commit -m \"Start next development version\"
  git push

Remove the previous version of Wicket using this command:

  svn rm https://dist.apache.org/repos/dist/release/wicket/$previous_version -m \\\"Remove previous version from mirrors\\\"

"  
EOF

echo "$script" > promote-$version.sh
    chmod +x promote-$version.sh
    git add promote-$version.sh
}

function generate_rollback_script {
	echo "Generating release rollback script 'revert-$version.sh'"
read -d '' script <<- EOF
#!/bin/bash
echo -n "Reverting release $version

Actions about to be performed:
------------------------------

\$(cat \$0 | tail -n +14)

------------------------------------------
Press enter to continue or CTRL-C to abort"

read

# clean up local repository
git checkout $GIT_BRANCH
git branch -D $branch
git tag -d $tag

# clean up staging repository
git push staging --delete refs/heads/$branch
git push staging --delete $tag

# clean up staging dist area
svn rm https://dist.apache.org/repos/dist/dev/wicket/$version -m "Release vote has failed"

# clean up staging maven repository
mvn org.sonatype.plugins:nexus-staging-maven-plugin:LATEST:rc-drop -DstagingRepositoryId=$stagingrepoid -DnexusUrl=https://repository.apache.org -DserverId=apache.releases.https -Ddescription="Release vote has failed"

# clean up remaining release files
find . -name "*.releaseBackup" -exec rm {} \\;
[ -f release.properties ] && rm release.properties

EOF
echo "$script" > revert-$version.sh

	chmod +x revert-$version.sh
	git add revert-$version.sh
}

function generate_signatures_from_release {

    echo "========================================================================

    The signatures for the source release artefacts:

    " > /tmp/release-$version-sigs.txt

    pushd target/dist > /dev/null
    for i in apache-wicket*{zip,tar.gz}
    do
        echo "Signature for $i:

    $(cat $i.asc)
    " >> /tmp/release-$version-sigs.txt
    done
    popd > /dev/null

        echo "========================================================================

    CHANGELOG for $version:
    " >> /tmp/release-$version-sigs.txt

    if [ -f "/tmp/release-notes-$version.txt" ] ; then
        tail -n +4 /tmp/release-notes-$version.txt >> /tmp/release-$version-sigs.txt
    else
        awk "/Release Notes - Wicket - Version $version/{flag=1;next} /==================/{flag=0} flag { print }" CHANGELOG-$major_version.x >> /tmp/release-$version-sigs.txt
    fi
}

function generate_release_vote_email {

    echo "Generating Vote email"

    echo "
This is a vote to release Apache Wicket $version

Please download the source distributions found in our staging area
linked below.

I have included the signatures for both the source archives. This vote
lasts for 72 hours minimum.

[ ] Yes, release Apache Wicket $version
[ ] No, don't release Apache Wicket $version, because ...

Distributions, changelog, keys and signatures can be found at:

    https://dist.apache.org/repos/dist/dev/wicket/$version

Staging repository:

    https://repository.apache.org/content/repositories/$stagingrepoid/

The binaries are available in the above link, as are a staging
repository for Maven. Typically the vote is on the source, but should
you find a problem with one of the binaries, please let me know, I can
re-roll them some way or the other.

Staging git repository data:

    Repository:  $(git config --get remote.staging.url)
    Branch:      $branch
    Release tag: $tag

" | tail -n+2 > release-vote.txt

    cat /tmp/release-$version-sigs.txt >> release-vote.txt
	git add release-vote.txt
}

function generate_announce_email {
    echo "
The Apache Wicket PMC is proud to announce Apache Wicket $version!

Apache Wicket is an open source Java component oriented web application
framework that powers thousands of web applications and web sites for
governments, stores, universities, cities, banks, email providers, and
more. You can find more about Apache Wicket at https://wicket.apache.org

This release marks another minor release of Wicket $major_version. We
use semantic versioning for the development of Wicket, and as such no
API breaks are present breaks are present in this release compared to
$major_version.0.0.

<OPTIONAL> New and noteworthy
<OPTIONAL> ------------------
<OPTIONAL>
Using this release
------------------

With Apache Maven update your dependency to (and don't forget to
update any other dependencies on Wicket projects to the same version):

<dependency>
    <groupId>org.apache.wicket</groupId>
    <artifactId>wicket-core</artifactId>
    <version>$version</version>
</dependency>

Or download and build the distribution yourself, or use our
convenience binary package you can find here:

 * Download: http://wicket.apache.org/start/wicket-$major_version.x.html#manually

Upgrading from earlier versions
-------------------------------

If you upgrade from $major_version.y.z this release is a drop in replacement. If
you come from a version prior to $major_version.0.0, please read our Wicket $major_version
migration guide found at

 * http://s.apache.org/wicket${major_version}migrate

Have fun!

— The Wicket team

" | tail -n+2 > release-announce.txt

    cat /tmp/release-$version-sigs.txt >> release-announce.txt
	git add release-announce.txt
}

function generate_announce_md {

echo $'---\nlayout: post\ntitle: Apache Wicket' $version $'released\n---' > wicket-$version-released.md
sed -e "s/$optionOpenTag/\{\% highlight xml\%\}\n$optionOpenTag/g" release-announce.txt |
sed -e "s/$optionCloseTag/$optionCloseTag\n\{\% endhighlight\%\}/g" |
sed -e s/'    \*'/' \*'/g |
sed -e "s/    CHANGELOG for $version/### This Release\n\n#### CHANGELOG for $version/g" |
sed -e s/'\*\*'/'#####'/g |
sed -e "s/    $beginPgp/<div class='highlight'><pre>\n$beginPgp/g" |
sed -e "s/$endPgp/$endPgp\n<\/pre><\/div>\n/g" |
sed -e "s/Source: http:\/\/www.apache.org\/dyn\/closer.cgi\/wicket\/$version/Source: [$version source download]\(http:\/\/www.apache.org\/dyn\/closer.cgi\/wicket\/$version\)/g" |
sed -e "s/Binary: http:\/\/www.apache.org\/dyn\/closer.cgi\/wicket\/$version\/binaries/Binary: [$version binary download]\(http:\/\/www.apache.org\/dyn\/closer.cgi\/wicket\/$version\/binaries\)/g" |
sed -e "s/Upgrading from earlier versions/<!--more-->\n\nUpgrading from earlier versions/g" >> wicket-$version-released.md

git add wicket-$version-released.md

}

# the branch on which the code base lives for this version (master is
# always current development version)
GIT_BRANCH=wicket-7.x

JAVA_VERSION=$(getJavaVersionFromPom)

echo "
Apache Wicket Release script
----------------------------
Building a release for Apache Wicket.

This script assumes you are running on OS X, it hasn't been tested on any other
operating systems, and you can bet it won't work on Windows...

REQUIREMENTS:

 - A Java version $JAVA_VERSION configured through the Maven toolchain
 - Maven 3.3.0 (older releases are b0rked, just don't bother)
 - gpg, gpg-agent and pinentry for signing
"

if [ ! $( git config --get remote.staging.url ) ] ; then
    fail "
No staging remote git repository found. The staging repository is used to temporarily
publish the build artifacts during the voting process. Since no staging repository is
available at Apache, it is best to use a git mirror on your personal github account.

First fork the github Apache Wicket mirror (https://github.com/apache/wicket) and then
add the remote staging repository with the following command:

    $ git remote add staging git@github.com:<your github username>/wicket.git
    $ git fetch staging
    $ git push staging

This will bring the staging area in sync with the origin and the release script can
push the build branch and the tag to the staging area.
"
fi

if [ ! -f ~/.m2/toolchains.xml ] ; then
    fail "
Maven will load the Java $JAVA_VERSION environment from the toolchain specified in
~/.m2/toolchains.xml

You don't have a toolchains.xml file in your .m2 folder. Please specify your
JDK's in the toolchains.xml file.
"
fi

grep -q "<version>$JAVA_VERSION</version>" ~/.m2/toolchains.xml

if [ $? -ne 0 ] ; then
    fail "
Your ~/.m2/toolchains.xml file doesn't provide a Java $JAVA_VERSION toolchain.
"
fi

echo "Java version for running Maven is: $(java -version 2>&1 | tail -n 2 | head -n 1)
Java used to compile (from toolchain) is: $(getJdkToolchain)
"

agentcount=`ps aux|grep gpg-agent|wc -l`

current_version=$(getProjectVersionFromPom)
major_version=$(expr $current_version : '\(.*\)\..*\..*\-.*')
minor_version=$(expr $current_version : '.*\.\(.*\)\..*\-.*')
bugfix_version=$(expr $current_version : '.*\..*\.\(.*\)-.*')
version="$major_version.$minor_version.0"

optionOpenTag='<dependency>'
optionCloseTag='<\/dependency>'
beginPgp='-----BEGIN PGP SIGNATURE-----'
endPgp='-----END PGP SIGNATURE-----'

default_version="$version"

version=

while [[ ! $version =~ ^[0-9]+\.[0-9]+\.[0-9]+(-M[0-9]+)?$ ]]
do
    read -p "Version to release (default is $default_version): " -e t1
    if [ -n "$t1" ]
    then
      version="$t1"
    else
      version="$default_version"
    fi
done

# recalculate the version coordinates for the current release
major_version=$(expr $version : '\(.*\)\..*\..*')
minor_version=$(expr $version : '.*\.\(.*\)\..*')
bugfix_version=$(expr $version : '.*\..*\.\(.*\)')

if [[ $version =~ .+-M[0-9]+ ]]
then
    milestone_version=$(expr $version : '.*\..*-M\(.*\)')
fi

if [ ! -z "$milestone_version" ] ; then
    next_version="$major_version.0.0-SNAPSHOT"
    previous_version="$major_version.0.0-SNAPSHOT"
else
    next_version="$major_version.$(expr $minor_version + 1).0-SNAPSHOT"
    previous_minor_version=$(expr $minor_version - 1)
    if [ $previous_minor_version -lt 0 ] ; then
        previous_version="$major_version.0.0-SNAPSHOT"
    else
        previous_version="$major_version.$(expr $minor_version - 1).0"
    fi
fi

# work around for versions upgrade (TODO maybe no longer necessary?)
mvn_version_to_replace="$major_version.$minor_version.1-SNAPSHOT"
mvn_version_to_replace2="$major_version.$minor_version.0-SNAPSHOT"

# Check if the changelog has the issues this release

grep -q "$version\$" CHANGELOG-$major_version.x
if [ $? -ne 0 ] ; then
    fail "You have forgotten to add the closed tickets for Wicket $version to the CHANGELOG-$major_version.x file

Use build-changelog.sh to add the release notes to the changelog.
"
fi

git status --porcelain CHANGELOG-$major_version.x | grep -q "M"
if [ $? -eq 0 ] ; then
    fail "You have changes in your workspace that have not been committed.

$(git status)
"
fi

echo "Cleaning up any release artifacts that might linger"
mvn -q release:clean

log=$(pwd)/release.out

if [ -f $log ] ; then
    rm $log
fi

branch="build/wicket-$version"
tag="rel/wicket-$version"

echo "# Release configuration for Wicket-$version
scm.tag=${tag}
" > release.properties

./build-versions.py $version $next_version >> release.properties

echo "Contents of the release properties generated for Maven:
-------------------------------------------------------------------------------
$(cat ./release.properties)
-------------------------------------------------------------------------------

Writing detailed log to $log

This script will release version: Apache Wicket $version and continue
development with $next_version

Press enter to continue or CTRL-C to abort \c"
read

echo "Ensuring we are starting from wicket-$major_version.x"
# otherwise we can't remove a previous release branch that failed
git checkout $GIT_BRANCH

echo "Removing previous release tag $tag (if exists)"
oldtag=`git tag -l |grep -e "$tag"|wc -l` >> release.out
[ "$oldtag" -ne 0 ] && git tag -d $tag >> release.out

echo "Removing previous build branch $branch (if exists)"
oldbranch=`git branch |grep -e "$branch"|wc -l` >> release.out
[ "$oldbranch" -ne 0 ] && git branch -D $branch >> release.out

echo "Removing previous staging branch (if exists)"
git push staging --delete refs/heads/$branch >> release.out
git push staging --delete $tag >> release.out


echo "Creating release branch"
git checkout -b $branch >> release.out

# Clear the current NOTICE.txt file
echo "Creating notice file."

NOTICE=NOTICE

echo "Apache Wicket
Copyright 2006-$(date +%Y) The Apache Software Foundation

This product includes software developed at
The Apache Software Foundation (http://www.apache.org/).

This is an aggregated NOTICE file for the Apache Wicket projects included
in this distribution.

NB: DO NOT ADD LICENSES/NOTICES/ATTRIBUTIONS TO THIS FILE, BUT IN THE
    NOTICE FILE OF THE CORRESPONDING PROJECT. THE RELEASE PROCEDURE WILL
    AUTOMATICALLY INCLUDE THE NOTICE IN THIS FILE.
" > $NOTICE

# next concatenate all NOTICE files from sub projects to the root file
for i in `find . -name "NOTICE" -not -regex ".*/target/.*" -not -regex "./NOTICE"`
do
    echo "---------------------------------------------------------------------------" >> $NOTICE
    echo "src/"$i | sed -e "s/\/src.*//g" >> $NOTICE
    echo "---------------------------------------------------------------------------" >> $NOTICE
    cat $i >> $NOTICE
    echo >> $NOTICE
done

echo "Committing changes"
git commit -am "Changes to notice files"

# clean all projects
echo "Clean all projects"
mvn -q clean -Pall

# package and assemble the release
## if we are using a JDK greater than 10, we add jdk11 profile
JDK11_PROFILE=""

if [ "$(jdk_version)" -gt 10 ] ; then
    JDK11_PROFILE=",jdk11"
fi

echo "Prepare the release"
mvn --batch-mode release:prepare -X -l $log -DpreparationGoals="clean" -Dtag=$tag -Papache-release,release$JDK11_PROFILE
if [ $? -ne 0 ] ; then
    fail "ERROR: mvn release:prepare was not successful"
fi

echo "Performing the release using Maven"
mvn -Dgpg.passphrase="$passphrase" -ff -l $log release:perform -DlocalCheckout=true -Dtag=$tag -Papache-release,release$JDK11_PROFILE
if [ $? -ne 0 ] ; then
    fail "ERROR: mvn release:perform was not successful"
fi

# Determine the staging repository and close it after deploying the release to the staging area
stagingrepoid=$(mvn org.sonatype.plugins:nexus-staging-maven-plugin:LATEST:rc-list -DnexusUrl=https://repository.apache.org -DserverId=apache.releases.https | grep -v "CLOSED" | grep -Eo "(orgapachewicket-\d+)";)

echo "Closing staging repository with id $stagingrepoid"
mvn org.sonatype.plugins:nexus-staging-maven-plugin:LATEST:rc-close -DstagingRepositoryId=$stagingrepoid -DnexusUrl=https://repository.apache.org -DserverId=apache.releases.https -Ddescription="Release has been built, awaiting vote"

generate_promotion_script
generate_rollback_script

echo "Create and sign the source tarballs"

mkdir -p target/dist/binaries

git archive --format=tar.gz --prefix=apache-wicket-$version/ -o target/dist/apache-wicket-$version.tar.gz $tag
git archive --format=zip --prefix=apache-wicket-$version/ -o target/dist/apache-wicket-$version.zip $tag
gpg --armor --detach-sign --use-agent --sign target/dist/apache-wicket-$version.tar.gz
gpg --armor --detach-sign --use-agent --sign target/dist/apache-wicket-$version.zip

pushd target/dist
sha256sum apache-wicket-$version.tar.gz > apache-wicket-$version.tar.gz.sha256
sha256sum apache-wicket-$version.zip > apache-wicket-$version.zip.sha256
popd

echo "Create and sign the binaries"
mkdir target/apache-wicket-$version-bin
pushd target/apache-wicket-$version-bin
find ../checkout ! \( -type d -name "WEB-INF" -prune \) -regex ".*wicket-[^/]*.[j]ar" ! -name "*-sources*" ! -name "*-javadoc*" ! -name "*wicket-archetype-quickstart*" ! -name "wicket-common-tests*"  -type f -exec cp {} . \;
find ../checkout ! \( -type d -name "WEB-INF" -prune \) -regex ".*wicket-[^/]*.[j]ar\.asc" ! -name "*-sources*" ! -name "*-javadoc*" ! -name "*wicket-archetype-quickstart*" ! -name "wicket-common-tests*"  -type f -exec cp {} . \;
cp ../../LICENSE .
cp ../../README .
cp ../../NOTICE .
cp ../../CHANGELOG* .
popd

pushd target

tar cfz dist/binaries/apache-wicket-$version-bin.tar.gz apache-wicket-$version-bin
zip -r dist/binaries/apache-wicket-$version-bin.zip apache-wicket-$version-bin
gpg --armor --detach-sign --use-agent --sign dist/binaries/apache-wicket-$version-bin.tar.gz
gpg --armor --detach-sign --use-agent --sign dist/binaries/apache-wicket-$version-bin.zip

pushd dist/binaries
sha256sum apache-wicket-$version-bin.tar.gz > apache-wicket-$version-bin.tar.gz.sha256
sha256sum apache-wicket-$version-bin.zip > apache-wicket-$version-bin.zip.sha256
popd
popd

echo "Uploading release to dist.apache.org"
pushd target/dist
svn mkdir https://dist.apache.org/repos/dist/dev/wicket/$version -m "Create $version release staging area"
svn co --force --depth=empty https://dist.apache.org/repos/dist/dev/wicket/$version .
cp ../../CHANGELOG* .
svn add *
svn commit -m "Upload wicket-$version to staging area"
popd

generate_signatures_from_release
generate_release_vote_email
generate_announce_email
generate_announce_md


# Done with the tasks, now print out the next things the release manager
# needs to do

pushd target/dist
find . -name "*.asc" -exec gpg --verify {} \;
popd

echo "
The release has been created. It is up to you to check if the release is up
to par, and perform the following commands yourself when you start the vote
to enable future development during the vote and after.

A vote email has been generated in release-vote.txt, you can copy/paste it using:

    cat release-vote.txt | pbcopy

You can find the distribution in target/dist.


Failed release
--------------

To rollback a release due to a failed vote or some other complication use:

    $ ./revert-$version.sh

This will clean up the artfifacts from the staging areas, including Nexus,
dist.apache.org and the release branch and tag.


Successful release
------------------

Congratulations on the successful release vote!

Use the release-announce.txt as a starter for the release announcement:

    cat release-announce.txt | pbcopy

To promote the release after a successful vote, run:

    $ ./promote-$version.sh

This will promote the Nexus staging repository to Maven Central, and move
the release artifacts from the staging area to dist.apache.org. It will
also sign the release tag and push the release branch to git.apache.org

You can read this message at a later time using:

    $ cat release.txt

Happy voting!
" > release.txt

git add release.txt

echo "Adding post-release scripts and vote/release email templates to build branch"
git commit -m "Added post-release scripts and vote/release email templates"

echo "Signing the release tag"
git checkout $tag
git tag --sign --force --message \"Signed release tag for Apache Wicket $version\" $tag >> $log
git checkout $branch

echo "Pushing build artifacts to the staging repository"
git push staging $branch:refs/heads/$branch

echo "Pushing release tag to the staging repository"
git push staging $tag

cat release.txt
