                         Apache Commons Release Plugin
                                  Version 1.5
                                 Release Notes

INTRODUCTION
============
This document contains the release notes for the 1.5 version of Apache commons-release-plugin.
The commons-release-plugin is meant to be a mechanism for automating The Apache Commons Project's
release process.

The Apache Commons Release Plugin is a collection of Java based Maven mojos for Apache Commons
Release process. These mojos are intended to be used as a collection of steps to be strung
together for the purpose of removing the manual steps required to produce an Apache Commons Release.


Changes in this version include:

NEW FEATURES
============
o COMMONSSITE-123:  introduce configuration parameter to perfom distribution checkin using Maven settings server credentials

FIXED BUGS
==========
o ReadmeHtmlVelocityDelegate, accommodate for artifactIds ending in numbers
o ReadmeHtmlVelocityDelegate, bcel's artifactId != commons-bcel, but is just bcel
o COMMONSSITE-122:  stage-distributions mojo assumes site directory has basename 'site'

CHANGES
=======
o vote-txt, use github as opposed to git-wip
o Drop sha-256 and leave sha-512 only
o commons.jacoco.version: 0.8.0 -> 0.8.2; java 11 compatibility

=============================================================================

                         Apache Commons Release Plugin
                                  Version 1.4
                                 Release Notes

FIXED BUGS
==========
o Check the result of checking out files from the SCM.

CHANGES
=======
o Better error message when files cannot be checked in to the SCM.
o COMMONSSITE-120: [release-plugin] Use SHA-256 and SHA-512, not MD5, not SHA-1.
o Update Apache Commons Compress from 1.17 to 1.18.


=============================================================================

                         Apache Commons Release Plugin
                                  Version 1.3
                                 Release Notes

NEW FEATURES
============
o COMMONSSITE-112:  Add a vote.txt file.
o COMMONSSITE-108:  Adding README.html and HEADER.html to staged release


CHANGES
=======
o COMMONSSITE-117: Remove md5 signatures from release artifacts.
o COMMONSSITE-113: Put unpacked site in scm dev dist directory for navigating purposes.
o Update platform requirement from Java 7 to Java 8.


=============================================================================

                         Apache Commons Release Plugin
                                  Version 1.2
                                 Release Notes

FIXED BUGS
==========

o COMMONSSITE-107: Adding ./target/commons-release-plugin/scm/RELEASE-NOTES.txt
                   to svn as opposed to ./RELEASE-NOTES.txt


=============================================================================

                         Apache Commons Release Plugin
                                  Version 1.1
                                 Release Notes

NEW FEATURES
============

o COMMONSSITE-98:  Making the project more multi-module compatible

FIXED BUGS
==========

o COMMONSSITE-104: Sha1 signature files now reflect actual signatures.
o COMMONSSITE-102: Commons Release Plugin doesn't work with Commons Release Plugin
o COMMONSSITE-101: Make -Dcommons.release.dryRun=true our commit toggle



=============================================================================

                         Apache Commons Release Plugin
                                  Version 1.0
                                 Release Notes

NEW FEATURES
============

o COMMONSSITE-96:   Create commons-release-component project skeleton.
o COMMONSSITE-99:   Prepare Standard Build integrations, travis, jacoco, checkstyle, etc.
o COMMONSSITE-97:   Documentation for commons-release-plugin.


Historical list of changes: http://commons.apache.org/release-plugin/changes-report.html

For complete information on the Apache commons-release-plugin, including instructions on how
to submit bug reports, patches, or suggestions for improvement, see the Apache commons-release-plugin's
website:

http://commons.apache.org/release-plugin/

Have fun!
-Apache Commons Release Plugin team

