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

This document is meant as a step-by-step recipe to achieve the release of
the Commons Math component. Note that more general instructions valid
for all components, including [math], are available on the Apache Commons
main site: at "http://commons.apache.org/releases/prepare.html" and
"http://commons.apache.org/releases/release.html".

The files "settings-security.xml" and "settings.xml" are minimal examples
of files used by maven to pick up authentication credentials needed to
connect to remote servers and to cryptographically sign the artifacts.

Since [math] has switched to git as its version control system, release preparation
can be done easily on the release manager local host in a branch. As branches deletion
is now forbidden at Apache, we will use a specific release branch for every version.
The branch will be simply named X.Y-release, with X.Y being the version number.
The branch will be used to store the release specific parts (i.e. the pom changes with
the version number, the release date in the site and so on). Everything else and in
particular code change that will remain in the component after the release must be
committed to the master branch (or version branch). The release candidate branch will
be created from master or version branch at the start of each new candidate for
this particular release. Once the release is done, the branch will be merged back to
master, but it will never be deleted so release history will be preserved.

The example below show a typical workflow. Just after commit A in the master branch, the
X.Y-release branch is created starting from master. This is shown by the 'b' in the
second line. Then release specific commits are made on the pom and a few other
files, leading to a commit which will be tagged as RC1. This release candidate fails, and
a few corrections need to be made on master, corresponding to commits B and C. Then the
X.Y-release branch is synchronized by running a 'git merge' command on the branch.
This is shown by the 'm' in the second line. A new commit is tagged as RC2. This second
release candidate also fails, and a new correction is made on master branch, a new merge
is done on the X.Y-release branch, a new commit is tagged and a third release candidate is
create, which succeeds. Then a final tag will be added on the final commit of this branch
showing the status as released. Then the files are cleaned to prepare for next version
(pom getting again a SNAPSHOT suffix, changes.xml getting a new placeholder for changes)
and the cleaned branch is merged back to master. Once the X.Y-release branch has been merged,
it is kept for history. The release for next version will use another specific branch.


 ----A-------> B --> C----------> D--------------------------------------m---->    <- master branch
      \               \            \                                    /
       b---> RC1 ------m---> RC2 ---m---> RC3/final release --> cleaning --X       <- X.Y-release branch

This process allows:

 - to never commit release candidate specific changes to the master
   branch (so the pom on master always holds a SNAPSHOT version),
 - to preserve future reference to the release
 - to allow parallel work on master during the release
 - if necessary to have multiple release managers or help on the
   release as the X.Y-release branch is shared


(0)
Preliminary checks:
 * All Java files must contain a license header. The "RAT" maven plugin will
   generate a report indicating for which files the license is missing.
 * For a "minor" release, the library must be backward-compatible. Check all
   the errors reported by the "Clirr" plugin.
 * Clear all "CheckStyle" warnings.
 * Make sure that the construct reported by "FindBugs" are intentional.
 * Mark all fixed issues as such in the bug-tracking system, and add a
   corresponding entry in "src/changes/changes.xml".


(1)
As a first optional step, you can test that everything works locally, i.e.
that the build process can create all the necessary artifacts. The command

  $ mvn clean deploy -Prelease -Ptest-deploy

should create the artifacts in the "target/deploy".


(2)
At this point, you will work mainly on the X.Y-release branch.

If the X.Y-release branch does not exist because it is the first release
candidate, create it locally starting from the master branch or the version
branch and push it to Apache repository (assuming it is called origin),
remembering the binding between the local and remote origin branches:

  $ git branch X.Y-release
  $ git push -u origin X.Y-release

(3)
Switch to the release branch:

  $ git checkout X.Y-release


(4)
If there have been changes committed in the master branch or the version
branch since the creation of the release branch, there are two cases:

  (4a)
  if all these changes must be included in the X.Y-release
  merge master branch or version branch into X.Y-release branch:

  $ git merge master
  or, if the version branch is called MATH_3_X
  $ git merge MATH_3_X

  (4b)
  if only part of these changes must be included in the X.Y-release,
  cherry-pick the required commits into X.Y-release branch:

  $ git cherry-pick commit-SHA

(5)
Update the release specific files, checking you are really working on the
X.Y-release branch and *not* on the master branch.

In particular:
 * Update and commit the "src/site/site.xml" file to contain the information
   about the API docs of the new release.
 * Estimate a release date (taking into account the release vote delay) and
   insert it in the "src/changes/changes.xml" file.
 * Update the "pom.xml" to contain the final version number and not a SNAPSHOT:
   Assuming that the release version will be "3.4", modify the "<version>" tag to
   read:

    <version>3.4</version>

   Modify the section of "<properties>" that also refers to version numbers.
   You should uncomment the "<commons.rc.version>" line and indicate the
   appropriate numbering of the release candidate: This refers to how many
   times you will need to repeat this whole release process until it is
   accepted (by a vote):

  <properties>
    <!-- ... -->
    <commons.release.version>3.4</commons.release.version>
    <commons.rc.version>RC1</commons.rc.version>
    <!-- ... -->
  </properties>


(6)
The "download" page template is located at "src/site/xdoc/download_math.xml".
This file is updated automatically by running the command:

  $ mvn commons:download-page


(7)
The "release notes" file will be created by gathering all the changes
collected during development in the file "src/changes/changes.xml".
Create it by running:

  $ mvn -Prelease-notes changes:announcement-generate

Check the file for weird line breaks, and commit the updated file to git:

  $ git add src/site/site.xml \
            src/changes/changes.xml \
            pom.xml \
            src/site/xdoc/download_math.xml \
            RELEASE-NOTES.txt

Check you did not forget any file:

  $ git status

Commit the changes:
  $ git commit -m "creating release candidate"


(8)
Create a GPG signed tag that will contain the whole source of this release candidate.
First, make sure once again that the workspace is up-to-date:

  $ git status

Then, assuming the first candidate, the suffix will be "RC1" (this should
be the  same as in the "<properties>" in the "pom.xml"), and the command
will be:

  $ git tag -s -m "Creating Apache Commons Math v3.4 RC1 tag." MATH_3_4_RC1

If you have several GPG keys, you may prefer to use "-u keyId" to select a specific
key for signing the tag instead of "-s" which select automatically one key
from the configured e-mail address.

Check the tag GPG signature:

  $ git tag -v MATH_3_4_RC1

You will get something like:

  object cf4a9d70c9ac24dd7196995390171150e4e56451
  type commit
  tag MATH_3_4_RC1
  tagger Luc Maisonobe <luc@apache.org> 1418934614 +0100

  Creating Apache Commons Math v3.4 RC1 tag.
  gpg: Signature made Thu Dec 18 21:30:14 2014 CET using RSA key ID 02E9F65B
  gpg: Good signature from "Luc Maisonobe (CODE SIGNING KEY) <luc@apache.org>"
  gpg:                 aka "Luc Maisonobe <Luc.Maisonobe@c-s.fr>"
  gpg:                 aka "Luc Maisonobe <Luc.Maisonobe@free.fr>"
  gpg:                 aka "Luc Maisonobe <luc@orekit.org>"

Remember the commit ID listed in the object line (here cf4a9d70c9ac24dd7196995390171150e4e56451),
as it is the most stable reference for traceability.

Push everything (including the tag!) on the Apache repository:

  $ git push --tags

(9)
Switch to a new directory out of your regular workspace, and retrieve
the official tag from the Apache repository:

  $ cd /tmp
  $ git clone https://git-wip-us.apache.org/repos/asf/commons-math.git --branch MATH_3_4_RC1

In the command above, the --branch option accepts both branch names and tags names,
so we specify directly the tag here. Git will warn that the resulting workspace
is in 'detached HEAD' state and 'git status' commands will warn that you are not
currently on any branch. This is expected is this situation.

Check that the last commit has the id you noted in the previous step:

  $ git log -1

(10)
If this is your first release, you might need to add your GPG encryption
key to the KEYS file. [If you have already done so, skip this section.]

Retrieve the files from the SVN repository:

  $ svn co --depth=immediates \
    https://__Your_apache_login__@svn.apache.org/repos/asf/commons/trunks-proper

and follow the instructions at the top of the "KEYS" file.


(11)
Create and transfer the artifacts to the Nexus server (a.k.a. "deploy").

Because the artifacts must be cryptographically signed, this step requires that
a profile named "release" exists in the maven "settings.xml" configuration file
which will contain the identifier of your GPG key (cf. sample "settings.xml" 
file).

You can then run

  $ mvn clean deploy -Prelease

which will transfer the artifacts to the Nexus repository located at
  https://repository.apache.org/index.html#stagingRepositories

This process transfers more files than really needed in the the "staging" (i.e.
non official) maven repository. The files expected in the repository are
commons-math3-3.4.pom, commons-math3-3.4.jar, commons-math3-3.4.javadoc,
commons-math3-3.4.sources, commons-math3-3.4.test-sources commons-math3-3.4.tests,
the associated fingerprints (<file-name>.md5 and <file-name>.sha1) and the signatures
<file-name>.asc. Note that Nexus automatically adds "md5" and "sha1" checksums files
to the "asc" files (cryptographic signature). These fingerprints on signatures are
spurious and have to be manually removed from Nexus staging area. The process also
transfers the complete source and binaries distributions files
commons-math3-3.4.-bin.tar.gz, commons-math3-3.4.-bin.zip, commons-math3-3.4.-src.tar.gz,
commons-math3-3.4.-src.zip as well as the associated .md5 and .sha1 fingerprints and the
.asc signatures. These are not really maven artifacts but rather distribution archives,
and they belong elsewhere, so they must also been removed from the Nexus staging
repository.

As a measure of sanity check,  repository must be manually "closed" before other
people review the deliverables just created.
How to "close" the staging repository is explained at this page:
  http://books.sonatype.com/nexus-book/reference/staging-repositories.html#staging-sect-closing

(12)
Upload the other distribution files to the Apache servers.

The archive files have been created during the previous step. They have been put
in the .m2 local repository. The RELEASE_NOTES.txt file hase been created earlier
and is still in the checkout directory of the release candidate. The README.html
file can be copied from the release area of the Apache dist server.
All these files can be uploaded to the development area of the Apache dist server
using the following commands:

 $ cd /tmp
 $ svn cp https://dist.apache.org/repos/dist/release/commons/math/README.html \
          https://dist.apache.org/repos/dist/dev/commons/math/README.html
 $ svn checkout https://dist.apache.org/repos/dist/dev/commons/math
 $ cd math

edit README.html with released version number

 $ cp ~/.m2/repository/org/apache/commons/commons-math3/3.4/*-bin.* binaries
 $ cp ~/.m2/repository/org/apache/commons/commons-math3/3.4/*-src.* source
 $ cp <path-to-the-RC-workspace>/RELEASE-NOTES.txt .
 $ svn add README.html RELEASE-NOTES.txt binaries/* source/*
 $ svn commit -m "Creating distribution files for 3.4 RC1"


(13)
As the web site staging area is shared among all commons components and therefore
can be published before vote ends, it is not recommended to use the standard staging
area for the release candidate. So you will just archive the transfer the site it on
your apache personal area for review. Here is how to do this using lftp to initiate
the sftp transfer (lftp supports a mirror command for recursive transfers, don't
forget the -R flag for uploading instead of downloading the site):

  $ mvn site
  $ cd target
  $ mv site commons-math-3.4-RC1-site
  $ lftp sftp://__Your_apache_login__@home.apache.org/
     lftp you@home.apache.org:~> cd public_html
     lftp you@home.apache.org:~/public_html> mirror -R commons-math-3.4-RC1-site
     lftp you@home.apache.org:~/public_html> bye


(14)
Call to vote by sending a message to the "dev" ML with subject
"[VOTE][RC1] Release Commons Math 3.4". You can use the following example as
a starting point, replacing the URLs with the appropriate ones:
----------
This is a [VOTE] for releasing Apache Commons Math 3.4 from release candidate 1.

Tag name:
  MATH_3_4_RC1 (signature can be checked from git using 'git tag -v')

Tag URL:
  <https://git-wip-us.apache.org/repos/asf?p=commons-math.git;a=commit;h=cf4a9d70c9ac24dd7196995390171150e4e56451>

Commit ID the tag points at:
  cf4a9d70c9ac24dd7196995390171150e4e56451

Site:
  <http://home.apache.org/~__Your_apache_login__/commons-math-3.4-RC1-site>

Distribution files:
  https://dist.apache.org/repos/dist/dev/commons/math/

Distribution files hashes (SHA1):
  e02c981d49c1f12b1fc237e69cb551a5620e57b4 commons-math3-3.4-bin.tar.gz
  11965eb97033d4d6ef0aeb902f1450641f40d3c5 commons-math3-3.4-bin.zip
  ce3efda70ac8f850f15154b38438bc337adc027a commons-math3-3.4-src.tar.gz
  d343c885a9d6eea611403f7f92ff580911363681 commons-math3-3.4-src.zip

KEYS file to check signatures:
  http://www.apache.org/dist/commons/KEYS

Maven artifacts:
  https://repository.apache.org/content/repositories/orgapachecommons-051/org/apache/commons/commons-math3/3.4/

[ ] +1 Release it.
[ ] +0 Go ahead; I don't care.
[ ] -0 There are a few minor glitches: ...
[ ] -1 No, do not release it because ...

This vote will close in 72 hours, at YYYY-MM-DDThh:mm:ssZ (this is UTC
time).
----------


(15)
If some blocking problems have been found in the release deliverables, cancel
the vote by sending a "[CANCEL][VOTE]" message to the "dev" ML.
After correcting the problems, you'll likely have to start again from step 3,
4 or 5.


(16)
After at least 72 hours have elapsed, send a "[VOTE][RESULT]" mail to
summarize the outcome of the vote. This should tally the votes cast,
and state which are binding (PMC members).


(17)
The distribution files must be moved from the development area to the release
area of the Apache dist server:

$ svnmucc -U https://dist.apache.org/repos/dist \
          rm release/commons/math/README.html \
          mv dev/commons/math/README.html release/commons/math/README.html \
          rm release/commons/math/RELEASE-NOTES.txt \
          mv dev/commons/math/RELEASE-NOTES.txt release/commons/math/RELEASE-NOTES.txt \
          mv dev/commons/math/binaries/commons-math3-3.4-bin.tar.gz release/commons/math/binaries/commons-math3-3.4-bin.tar.gz \
          mv dev/commons/math/binaries/commons-math3-3.4-bin.tar.gz.asc release/commons/math/binaries/commons-math3-3.4-bin.tar.gz.asc \
          mv dev/commons/math/binaries/commons-math3-3.4-bin.tar.gz.md5 release/commons/math/binaries/commons-math3-3.4-bin.tar.gz.md5 \
          mv dev/commons/math/binaries/commons-math3-3.4-bin.tar.gz.sha1 release/commons/math/binaries/commons-math3-3.4-bin.tar.gz.sha1 \
          mv dev/commons/math/binaries/commons-math3-3.4-bin.zip release/commons/math/binaries/commons-math3-3.4-bin.zip \
          mv dev/commons/math/binaries/commons-math3-3.4-bin.zip.asc release/commons/math/binaries/commons-math3-3.4-bin.zip.asc \
          mv dev/commons/math/binaries/commons-math3-3.4-bin.zip.md5 release/commons/math/binaries/commons-math3-3.4-bin.zip.md5 \
          mv dev/commons/math/binaries/commons-math3-3.4-bin.zip.sha1 release/commons/math/binaries/commons-math3-3.4-bin.zip.sha1 \
          mv dev/commons/math/source/commons-math3-3.4-src.tar.gz release/commons/math/source/commons-math3-3.4-src.tar.gz \
          mv dev/commons/math/source/commons-math3-3.4-src.tar.gz.asc release/commons/math/source/commons-math3-3.4-src.tar.gz.asc \
          mv dev/commons/math/source/commons-math3-3.4-src.tar.gz.md5 release/commons/math/source/commons-math3-3.4-src.tar.gz.md5 \
          mv dev/commons/math/source/commons-math3-3.4-src.tar.gz.sha1 release/commons/math/source/commons-math3-3.4-src.tar.gz.sha1 \
          mv dev/commons/math/source/commons-math3-3.4-src.zip release/commons/math/source/commons-math3-3.4-src.zip \
          mv dev/commons/math/source/commons-math3-3.4-src.zip.asc release/commons/math/source/commons-math3-3.4-src.zip.asc \
          mv dev/commons/math/source/commons-math3-3.4-src.zip.md5 release/commons/math/source/commons-math3-3.4-src.zip.md5 \
          mv dev/commons/math/source/commons-math3-3.4-src.zip.sha1 release/commons/math/source/commons-math3-3.4-src.zip.sha1 \
          -m "Publish commons-math 3.4 Release"


(18)
Release (a.k.a. "promote") the artifacts on the Nexus server, as shown here:
  http://books.sonatype.com/nexus-book/reference/staging-repositories.html#staging-sect-releasing


(19)
Publish the web site. This is done by first committing the web site to the staging area, and then
by publishing the staging area (which is shared among all commons compoents.

In order to commit the web site to the staging area, look at the subversion workspace that was
automatically checked out during the 'mvn site' command in folder site-content. You can also check
it out directly by yourself elsewhere:

  svn checkout https://svn.apache.org/repos/infra/websites/production/commons/content/proper/commons-math site-content

Remove all files there (except .svn folder) and move all the files from the site.
You may want to adjust manually some parts like fixing broken relative links or
copying the content of the current apidocs to javadocs/api-3.4.

 $ cd site-content
 $ rm -fr *
 $ cp -pR ../target/site/* .

Check for possibly new files:
 $ svn status
and "svn add" them if necessary.

Commit the new contents of the web site:
 $ svn commit -m "updating site after official release of version 3.4"

Beware the commit command may be very long (several hours ...). The web site will be available
for review at:
  http://commons.staging.apache.org/proper/commons-math/
 
Publishing the staging web site is done directly from a browser at URL:
  https://cms.apache.org/commons/publish

(20)
The javadocs for several version is kept available on the website under the javadocs directory.
This corresponds to a huge number of files which never changes, so they are not retrieved by
default in the working copy when running 'svn checkout'. These javadocs must therefore be
copied manually using server side copy from the apidocs directory after release, in order for
the links to former versions to work. This is done as follows:

  $ svn cp -m "copying 3.4 apidocs to versioned directory for the long-term links" \
        https://svn.apache.org/repos/infra/websites/production/commons/content/proper/commons-math/apidocs \
        https://svn.apache.org/repos/infra/websites/production/commons/content/proper/commons-math/javadocs/api-3.4

(21)
Put the official final tag to point at the same commit as the last release candidate tag:

  $ git tag -s -m "RC1 becomes the 3.4 official version." MATH_3_4 cf4a9d70c9ac24dd7196995390171150e4e56451
  $ git push --tags


(22)
Clean up files and prepare for next version (here we assume it will be 3.5):

edit "doap_math.rdf" to add the just released version date.

edit "pom.xml" so it contains
 
       <version>3.5-SNAPSHOT</version>

edit "src/changes/changes.xml" to add a new section for the next release, setting
the release date to "TBD" and the description to the empty string.

Double-check "pom.xml" *really* has a -SNAPSHOT version and commit everything:

  $ git add doap_math.rdf pom.xml src/changes/changes.xml
  $ git commit -m "preparing next version 3.5"
  $ git push


(23)
Switch back to master and merge the X.Y-release branch

  $ git checkout master
  $ get merge X.Y-release
  $ git push


(24)
Allow for the web site mirrors to be updated (possibly several hours); then
send (from your apache account) a release announcement to the following ML:
  announce@apache.org
  dev@commons.apache.org
  user@commons.apache.org
