#!/usr/bin/perl

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

use 5.010;
use strict;
use warnings;
use Getopt::Long qw( GetOptions );

my $usage = join( ' ',
    $0, qq|--version=X.Y.Z-rcN|, qq|--name="FULL NAME"| )
    . "\n";

my ( $full_rc_version, $name );
GetOptions(
    'version=s' => \$full_rc_version,
    'name=s'    => \$name,
);
$full_rc_version or die $usage;
$name            or die $usage;
$full_rc_version =~ m/^(\d+)\.(\d+)\.(\d+)-rc(\d+)$/ or die $usage;
my ( $major, $minor, $micro, $rc ) = ( $1, $2, $3, $4 );
my $x_y_z_version = sprintf( "%d.%d.%d", $major, $minor, $micro );

say qq|###############################################################|;
say qq|# Commands to execute ReleaseGuide for |
    . qq|Apache Lucy $x_y_z_version RC $rc|;
say qq|###############################################################\n|;

say qq|# If your code signing key is not already available from pgp.mit.edu|;
say qq|# and <http://www.apache.org/dist/lucy/KEYS>, publish it.|;
say qq|[...]\n|;

say qq|# chdir to the top level of your local copy of the Lucy repository.|;
say qq|[...]\n|;

if ( $micro == 0 && $rc < 2 ) {
    say qq|# Check out the master branch.|;
    say qq|git checkout master\n|;
}
else {
    say qq|# Check out the $major.$minor branch.|;
    say qq|git checkout $major.$minor\n|;
}

if ( $rc < 2 ) {
    say qq|# Since this is the first RC, run update_version.|;
    say qq|./devel/bin/update_version $x_y_z_version\n|;
    say qq|# Update the the CHANGES file and associate release|;
    say qq|# $x_y_z_version with today's date.|;
    say qq|[...]\n|;
    say qq|# Commit version bump and CHANGES.|;
    say qq|git commit -m "Updating CHANGES and version number |
        . qq|for release $x_y_z_version."\n|;
}

if ( $micro == 0 && $rc < 2 ) {
    say qq|# Since this is the first release in a series (i.e. X.Y.0),|;
    say qq|# create a branch.|;
    say qq|git checkout -b $major.$minor\n|;

    say qq|# Update the CI test scripts|;
    say qq|# - devel/bin/appveyor-build.bat|;
    say qq|# - devel/bin/travis-test.sh|;
    say qq|# to use the Clownfish branch containing the required major|;
    say qq|# version. Replace the commands|;
    say qq|#     git clone -q --depth 1 <cfish_repo>|;
    say qq|# with|;
    say qq|#     git clone -q -b <cfish_branch> --depth 1 <cfish_repo>|;
    say qq|[...]|;
    say qq|git commit -m "Updating CI test scripts |
        . qq|for release $x_y_z_version."\n|;
}

say qq|# Create a tag for the release candidate.|;
say qq|git tag v$full_rc_version |
    . qq|-m "Tagging release candidate $rc for $x_y_z_version."\n|;

say qq|# Export a pristine copy of the source from the release candidate|;
say qq|# tag.|;
say qq|git archive --prefix=apache-lucy-$x_y_z_version/ |
    . qq|--output=apache-lucy-$x_y_z_version.tar.gz |
    . qq|v$full_rc_version\n|;

say qq|# Create an RC directory in our dev area on dist.apache.org|;
say qq|# and check out a copy.|;
say qq|svn mkdir -m "Create RC dir for apache-lucy-$full_rc_version" |
    . qq|https://dist.apache.org/repos/dist/dev/lucy/apache-lucy-$full_rc_version|;
say qq|svn co |
    . qq|https://dist.apache.org/repos/dist/dev/lucy/apache-lucy-$full_rc_version\n|;

say qq|# Move the tarball and a copy of the CHANGES file into the RC dir,|;
say qq|# then chdir into it.|;
say qq|mv apache-lucy-$x_y_z_version.tar.gz apache-lucy-$full_rc_version|;
say qq|cp -p CHANGES apache-lucy-$full_rc_version/CHANGES-$x_y_z_version.txt|;
say qq|cd apache-lucy-$full_rc_version\n|;

say qq|# Generate checksums.|;
say qq|perl -MDigest -e '\$d = Digest->new("SHA-512"); open \$fh, |
    . qq|"<apache-lucy-$x_y_z_version.tar.gz" or die; |
    . qq|\$d->addfile(\$fh); print \$d->hexdigest; |
    . qq|print "  apache-lucy-$x_y_z_version.tar.gz\\n"' > |
    . qq| apache-lucy-$x_y_z_version.tar.gz.sha512\n|;

say qq|# Sign the release.|;
say qq|gpg --armor --output apache-lucy-$x_y_z_version.tar.gz.asc |
    . qq|--detach-sig apache-lucy-$x_y_z_version.tar.gz\n|;

say qq|# Add the artifacts and commit to the dev area on dist.apache.org.|;
say qq|svn add |
    . qq|apache-lucy-$x_y_z_version.tar.gz |
    . qq|apache-lucy-$x_y_z_version.tar.gz.sha512 |
    . qq|apache-lucy-$x_y_z_version.tar.gz.asc |
    . qq|CHANGES-$x_y_z_version.txt |;
say qq|svn ci -m "Add apache-lucy-$x_y_z_version artifacts"\n|;

say qq|# Perform whatever QC seems prudent on the tarball, installing it|;
say qq|# on test systems, etc.|;
say qq|[...]\n|;

say qq|# Push your branch and the tag for the RC.|;
say qq|git push origin $major.$minor|;
say qq|git push origin v$full_rc_version\n|;

say qq|###############################################################|;
say qq|# Voting|;
say qq|###############################################################\n|;

say qq|# Call a release vote on the dev list, referring to the artifacts|;
say qq|# made public in the previous step and using the boilerplate email|;
say qq|# below.|;
say qq|[...]\n|;

say qq|###############################################################|;
say qq|# After the vote has passed...|;
say qq|###############################################################\n|;

say qq|# Tag the release and delete the RC tags.|;
say qq|git tag rel/v$x_y_z_version v$full_rc_version|;
say qq|git push origin rel/v$x_y_z_version|;
for ( 1 .. $rc ) {
    my $rc_tag = qq|v$major.$minor.$micro-rc$_|;
    say qq|git tag -d $rc_tag|;
    say qq|git push origin :$rc_tag|;
}
say "";

say qq|# Copy release artifacts to the production dist directory and|;
say qq|# remove the RC dir.  The "svnmucc" app, which ships with Subversion|;
say qq|# 1.7, is required.|;
say qq|svnmucc -m "Publish Apache Lucy $x_y_z_version" |
    . qq|-U https://dist.apache.org/repos/dist/ |
    . qq|mv dev/lucy/apache-lucy-$full_rc_version/apache-lucy-$x_y_z_version.tar.gz |
    . qq|release/lucy/apache-lucy-$x_y_z_version.tar.gz |
    . qq|mv dev/lucy/apache-lucy-$full_rc_version/apache-lucy-$x_y_z_version.tar.gz.sha512 |
    . qq|release/lucy/apache-lucy-$x_y_z_version.tar.gz.sha512 |
    . qq|mv dev/lucy/apache-lucy-$full_rc_version/apache-lucy-$x_y_z_version.tar.gz.asc |
    . qq|release/lucy/apache-lucy-$x_y_z_version.tar.gz.asc |
    . qq|mv dev/lucy/apache-lucy-$full_rc_version/CHANGES-$x_y_z_version.txt |
    . qq|release/lucy/CHANGES-$x_y_z_version.txt|;
say qq|svnmucc -m "Remove apache-lucy-$full_rc_version directory" |
    . qq|-U https://dist.apache.org/repos/dist/ |
    . qq|rm dev/lucy/apache-lucy-$full_rc_version\n|;

say qq|# Carefully remove the artifacts for any previous releases superseded|;
say qq|# by this one.|;
if ( $micro > 0 ) {
    my $prev = sprintf( "%d.%d.%d", $major, $minor, $micro - 1 );
    say qq|svnmucc -m "Remove Apache Lucy $prev" |
        . qq|-U https://dist.apache.org/repos/dist/release/lucy/ |
        . qq|rm apache-lucy-$prev.tar.gz |
        . qq|rm apache-lucy-$prev.tar.gz.sha512 |
        . qq|rm apache-lucy-$prev.tar.gz.asc |
        . qq|rm CHANGES-$prev.txt |;
}
say qq|[...]\n|;

say qq|# Update the issue tracker.|;
say qq|# While logged into JIRA, visit the following web page. (Note: this|;
say qq|# permalink may or may not work, and you may not have the necessary|;
say qq|# JIRA permissions to perform the required actions.  Please let the|;
say qq|# dev list know if you encounter problems.)  Click the "release"|;
say qq|# link for $x_y_z_version and input the date from the CHANGES file.|;
say qq|https://issues.apache.org/jira/plugins/servlet/|
    . qq|project-config/LUCY/versions\n|;

say qq|# Once the release files are in place, update the download page|;
say qq|# of the Lucy website. The easiest way to perform this action is to|;
say qq|# use the CMS bookmarklet at https://cms.apache.org/#bookmark|;
say qq|# to access the edit screens via the CMS web interface.  Change the|;
say qq|# artifact links to point at the new version; ensure that while the|;
say qq|# primary download links point at mirrors, the signature and sums|;
say qq|# files point at apache.org.|;
say qq|[...]\n|;

say qq|# [TODO: this action cannot yet be performed by the RM, so ignore.]|;
say qq|# Publish HTML exports of the documentation for the new release on|;
say qq|# the Lucy website.|;
say qq|[...]\n|;

say qq|# Send emails announcing the release to:|;
say qq|#|;
say qq|#     * The user list.|;
say qq|#     * The dev list.|;
say qq|#     * The announce\@a.o list.  Be sure to send from your|;
say qq|#       \@apache.org address|;
say qq|#|;
say qq|# Use the entry in the CHANGES file as the basis for your|;
say qq|# email, or optionally, use the boilerplate announcement text below.|;
say qq|[...]\n|;

say qq|###############################################################|;
say qq|# Boilerplate VOTE email for dev\@lucy.a.o|;
say qq|# Suggested subject:|;
say qq|#|;
say qq|#    [VOTE] Apache Lucy $x_y_z_version RC $rc|;
say qq|#|;
say qq|###############################################################\n|;

say <<END_LUCY_DEV_VOTE;
Hello,

Release candidate $rc for Apache Lucy version $x_y_z_version can be
found at:

    https://dist.apache.org/repos/dist/dev/lucy/apache-lucy-$full_rc_version/

See the CHANGES file at the top level of the archive for information
about the content of this release.

This candidate was assembled according to the process documented at:

    http://wiki.apache.org/lucy/ReleaseGuide

It was cut using "git archive" from the tag at:

    https://git-wip-us.apache.org/repos/asf?p=lucy.git;a=tag;h=refs/tags/v$full_rc_version

Please vote on releasing this candidate as Apache Lucy version
$x_y_z_version.  The vote will be held open for at least the next 72
hours.

All interested parties are welcome to inspect the release candidate
and express approval or disapproval.  Votes from members of the Lucy
PMC are binding; the vote passes if there are at least three binding
+1 votes and more +1 votes than -1 votes. 

For suggestions as to how to evaluate Apache Lucy release candidates,
and for information on ASF voting procedures, see:

    http://wiki.apache.org/lucy/ReleaseVerification
    http://wiki.apache.org/lucy/ReleasePrep
    http://www.apache.org/foundation/voting.html

[ ] +1 Release RC $rc as Apache Lucy $x_y_z_version.
[ ] +0
[ ] -1 Do not release RC $rc as Apache Lucy $x_y_z_version because...

Here's my +1.

Thanks!
END_LUCY_DEV_VOTE

say qq|###############################################################|;
say qq|# Boilerplate ANNOUNCE email|;
say qq|# Suggested subject:|;
say qq|#|;
say qq|#    [ANNOUNCE] Apache Lucy $x_y_z_version released|;
say qq|#|;
say qq|###############################################################\n|;

say <<END_ANNOUNCE_EMAIL;
Greetings,

The Apache Lucy team is pleased to announce the release of
version $x_y_z_version!

The Apache Lucy search engine library provides full-text search
for dynamic programming languages.  For a list of issues resolved
in this version, please see the release notes:

  http://www.apache.org/dist/lucy/CHANGES-$x_y_z_version.txt

The most recent release can be obtained from our download page:

  http://lucy.apache.org/download.html

For general information on Apache Lucy, please visit the project
website:

  http://lucy.apache.org/

Regards, 

$name, on behalf of the Apache Lucy development team
and community

END_ANNOUNCE_EMAIL

say qq|###############################################################|;

