                         Apache Commons Release Plugin
                                  Version 1.6
                                 Release Notes

INTRODUCTION
============
This document contains the release notes for the 1.6 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-128:  Release plugin cleans up staging area before staging


CHANGES
=======
o Update Apache Commons Codec from 1.11 to 1.12.

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

                         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

