<!--
 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.
-->
*** THESE ITEMS REQUIRE YOUR ATTENTION ***
To: dev@commons.apache.org
Subject: [VOTE] Release @NAME@ @VERSION@ based on @RC@

We have fixed quite a few bugs and added some significant enhancements since @NAME@ @BC@ was released, so I would like to release @NAME@ @VERSION@.

@NAME@ @VERSION@ @RC@ is available for review here:
    @DISTURL@ (svn revision @RCREV@)

The Git tag @TAGNAME@ commit for this RC is @TAGCOMMIT@ which you can browse here:
    https://gitbox.apache.org/repos/asf?p=commons-@ID@.git;a=commit;h=@TAGCOMMIT@
You may checkout this tag using:
    git clone https://gitbox.apache.org/repos/asf/commons-@ID@.git --branch @TAGNAME@ @TAGNAME@

Maven artifacts are here:
    https://repository.apache.org/content/repositories/orgapachecommons-@NEXUS_REPO_ID@/@GROUPPATH@/@ARTIFACTID@/@VERSION@/

These are the artifacts and their hashes:

@SHA512LIST@


I have tested this with ***'mvn clean install site'*** using:
***
Use the output from "mvn -version" for each combination you tested.
***

Details of changes since @BC@ are in the release notes:
    @DISTURL@/RELEASE-NOTES.txt
    @SITEURL@/changes-report.html

Site:
    @SITEURL@/index.html
    (note some *relative* links are broken and the @VERSION@ directories are not yet created - these will be OK once the site is deployed.)

*** CLIRR Report (compared to @BC@):
    @SITEURL@/clirr-report.html

*** JApiCmp Report (compared to @BC@):
    @SITEURL@/japicmp.html

    ***
    Note that the above report notes several errors.
    These are considered OK for the reasons stated below.
    These exceptions are also noted in the Changes and Release Notes.

    Errors reported:
    - methods added to interface: OK because that does not affect binary compatibility.
    - etc.
    ***

RAT Report:
    @SITEURL@/rat-report.html

KEYS:
  https://www.apache.org/dist/commons/KEYS

Please review the release candidate and vote.
This vote will close no sooner than 72 hours from now.

  [ ] +1 Release these artifacts
  [ ] +0 OK, but...
  [ ] -0 OK, but really should fix...
  [ ] -1 I oppose this release because...

Thank you,

@RMNAME@,
Release Manager (using key @RMKEY@)

For following is intended as a helper and refresher for reviewers.

Validating a release candidate
==============================

These guidelines are NOT complete.

Requirements: Git, Java, Maven.

You can validate a release from a release candidate (RC) tag as follows.

1) Clone and checkout the RC tag

git clone https://gitbox.apache.org/repos/asf/commons-@ID@.git --branch @TAGNAME@ @TAGNAME@
cd @TAGNAME@

2) Check Apache licenses

This step is not required if the site includes a RAT report page which you then must check.

mvn apache-rat:check

3) Check binary compatibility

Older components still use Apache Clirr:

This step is not required if the site includes a Clirr report page which you then must check.

mvn clirr:check

Newer components use JApiCmp with the japicmp Maven Profile:

This step is not required if the site includes a JApiCmp report page which you then must check.

mvn install -DskipTests -P japicmp japicmp:cmp

4) Build the package

mvn -V clean package

You can record the Maven and Java version produced by -V in your VOTE reply.
To gather OS information from a command line:
Windows: ver
Linux: uname -a

5) Build the site for a single module project

Note: Some plugins require the components to be installed instead of packaged.

mvn site
Check the site reports in:
- Windows: target\site\index.html
- Linux: target/site/index.html

6) Build the site for a multi-module project

mvn site
mvn site:stage
Check the site reports in:
- Windows: target\site\index.html
- Linux: target/site/index.html

-the end-
