Apache Commons CLI
Version 1.5.0
Release Notes


This document contains the release notes for this version of the Apache Commons 
CLI Component of the Apache Commons Project. Commons CLI provides a simple API
for working with the command line arguments and options.

Apache Commons CLI provides a simple API for presenting, processing and validating a Command Line Interface.

New features and bug fixes (Java 7).

Changes in this version include:

New Features
============

o CLI-217:  Accommodate toggling partial matching in DefaultParser. Thanks to Rubin Simons.
o CLI-274:  Option parser type EXISTING_FILE_VALUE not check file existing Thanks to Béla Schaum.
o CLI-271:  CommandLine.getXXX and CommandLine.hasXXX should accept an Option as a parameter Thanks to Christoph Läubrich.
o CLI-276:  Adjust access-modifier of checkRequiredOptions() to protected. Thanks to Jason Dillon.
o CLI-282:  TypeHandler should throw ParseException for an unsupported class. Thanks to Alex Nordlund.
o           Added setter for Builder.option #33. Thanks to Waldemar Sojka, Gary Gregory.
o           Add Option unit tests #76. Thanks to Waldemar Sojka, Gary Gregory.

Fixed Bugs
==========

o           Fix NPE in DefaultParser.isLongOption(String). Thanks to Gary Gregory.
o CLI-279:  @param or @return lines should end with a period in CommandLine.java Thanks to Krishna Mohan Rao Kandunoori.
o           Replace deprecated FindBugs with SpotBugs. Thanks to Gary Gregory.
o           Replace CLIRR with JApiCmp. Thanks to Gary Gregory.
o           Option Javadocs grammar nits #55. Thanks to Elliotte Rusty Harold.
o           Minor Improvements #57, #61. Thanks to Arturo Bernal, Gary Gregory.
o CLI-254:  Input "test" gets parsed as test, quotes die #58. Thanks to stoty.
o CLI-287:  Allow whitespace-only header and footer #26. Thanks to MrQubo, Gary Gregory.

Updates
=======

o CLI-294:  Update Java from version 5 to 7.
o           Docs: Replace OptionBuilder in usage page #30. Thanks to Mincong Huang.
o           Remove deprecated sudo setting. #36. Thanks to dengliming.
o           Bump junit:junit from 4.12 to 4.13.2, #53, #60. Thanks to Gary Gregory, Dependabot.
o           Bump commons-parent from 48 to 52. Thanks to Dependabot.
o           Bump maven-pmd-plugin from 3.12.0 to 3.15.0, #44, #54, #67. Thanks to Dependabot.
o           Bump actions/checkout from v2.3.1 to v2.3.5 #46, #72. Thanks to Dependabot.
o           Bump actions/setup-java from v1.4.2 to v2 #50. Thanks to Dependabot, Gary Gregory.
o           Bump maven-antrun-plugin from 1.7 to 3.0.0 #43. Thanks to Dependabot.
o           Bump maven-checkstyle-plugin from 2.15 to 3.1.2 #41. Thanks to Gary Gregory.
o           Bump checkstyle to 9.0.1 #68. Thanks to Gary Gregory.
o           Bump actions/cache from 2 to 2.1.6 #64, #65. Thanks to Dependabot.
o           Bump commons.animal-sniffer.version 1.19 -> 1.20. Thanks to Gary Gregory.
o           Bump maven-bundle-plugin 5.1.1 -> 5.1.2. Thanks to Gary Gregory.
o           Bump biz.aQute.bndlib.version 5.1.2 -> 6.0.0. Thanks to Gary Gregory.
o           Bump spotbugs from 4.4.1 to 4.4.2 #70. Thanks to Dependabot.
o           Bump spotbugs-maven-plugin from 4.4.1 to 4.4.2.2 #71. Thanks to Dependabot.


Historical list of changes: https://commons.apache.org/proper/commons-cli/changes-report.html

For complete information on Apache Commons CLI, including instructions on how to submit bug reports,
patches, or suggestions for improvement, see the Apache Apache Commons CLI website:

https://commons.apache.org/proper/commons-cli/

Download page: https://commons.apache.org/proper/commons-cli/download_cli.cgi

Have fun!
The Apache Commons Team

------------------------------------------------------------------------------

            Apache Commons CLI
                Version 1.4
               Release Notes


INTRODUCTION:

This document contains the release notes for this version of the Commons CLI
package. Commons CLI provides a simple API for working with the command line
arguments and options.

Commons CLI 1.4 is a feature release and binary compatible with the
previous versions, except for the OptionValidator class that is no longer public
(change introduced in v1.2). Commons CLI 1.4 at least requires Java 5.0.

More information can be found on the project site at
https://commons.apache.org/cli.


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

o CLI-269: Introduce CommandLine.Builder
o CLI-267: Add an addRequiredOption method to Options.
           Thanks to Ricardo Ribeiro.


BUG FIXES
=========

o CLI-265: Optional argument picking up next regular option as its argument.
           Thanks to Martin Sandiford.
o CLI-266: HelpFormatter.setOptionComparator(null) doesn't display the values
           in inserted order. Thanks to Ravi Teja.


                Release Notes for version 1.3.1

BUG FIXES
=========

o CLI-252: LongOpt falsely detected as ambiguous. Thanks to Simon Harrer.


                Release Notes for version 1.3

NOTES
=====

A new parser is available: DefaultParser. It combines the features of the
GnuParser and the PosixParser. It also provides additional features like
partial matching for the long options, and long options without
separator (i.e like the JVM memory settings: -Xmx512m). This new parser
deprecates the previous ones.

DEPRECATIONS
============

o org.apache.commons.cli.BasicParser
    replaced by org.apache.commons.cli.DefaultParser

o org.apache.commons.cli.GnuParser
    replaced by org.apache.commons.cli.DefaultParser

o org.apache.commons.cli.OptionBuilder
    replaced by org.apache.commons.cli.Option.builder()
                org.apache.commons.cli.Option.builder(String)
                org.apache.commons.cli.Option.Builder

o org.apache.commons.cli.Parser
    replaced by org.apache.commons.cli.DefaultParser

o org.apache.commons.cli.PosixParser
    replaced by org.apache.commons.cli.DefaultParser


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

o CLI-161: PosixParser doesn't stop the parsing on "--" tokens following an
           option with an argument
o CLI-167: Support options like Java memory settings (-Xmx512M)
o CLI-181: Unified Parser
o CLI-224: Added new fluent API to create Option instances via builder class
           Option.Builder. This replaces the now deprecated OptionBuilder.
           Thanks to Duncan Jones, Brian Blount.
o CLI-160: PosixParser now supports partial long options (--ver instead of
           --version).
o CLI-169: HelpFormatter now supports setting the displayed separator of long
           options. Thanks to J. Lewis Muir.
o CLI-214: Added new method Options.addOption(String, String). Thanks to
           Alexandru Mocanu.


BUG FIXES
=========

o CLI-248: Dead links on doc page.
o CLI-234: Fixed code example in javadoc of
           "Option#Builder#valueSeparator(char)". Thanks to Greg Thomas.
o CLI-241: Clarified behavior of "OptionValidator#validateOption(String)"
           in case of null input. Thanks to Beluga Behr.
o CLI-202: Default options will now work correctly with required options that
           are missing.
o CLI-203: Default options will now work correctly together with option groups.
o CLI-205: HelpFormatter.setArgName(String) now correctly sets the argument
           name.
o CLI-204: Passing default values for not defined options to a parser will now
           trigger a ParseException instead of a NullPointerException.
o CLI-201: Default properties provided as input to the Parser.parse() methods
           are now correctly processed.
o CLI-215: CommandLine.getParsedOptionValue() now returns a String object if no
           option type has been explicitly set. Thanks to Manuel Müller.
o CLI-212: HelpFormatter now prints command-line options in the same order as
           they have been added. Thanks to Per Cederberg.
o CLI-186: Standard help text now shows mandatory arguments also for the first
           option. Thanks to Kristoff Kiefer.
o CLI-207: HelpFormatter does not strip anymore leading whitespace in the
           footer text. Thanks to Uri Moszkowicz.
o CLI-185: Strip quotes contained in argument values only if there is exactly
           one at the beginning and one at the end. Thanks to
           Einar M. R. Rosenvinge.
o CLI-184: Negative numerical arguments take precedence over numerical options.
o CLI-193: Fix possible StringIndexOutOfBoundsException in HelpFormatter.
           Thanks to Travis McLeskey.
o CLI-183: OptionGroups no longer throw an AlreadySelectedException when reused
           for several parsings.
o CLI-182: OptionGroup now selects properly an option with no short name.


CHANGES
=======

o CLI-240: Small cleanup of Option class. Thanks to Beluga Behr.
o CLI-230: Options.getRequiredOptions() now returns an unmodifiable list.
o CLI-218: Clarify javadoc for CommandLine.getOptionValue() that the first
           specified argument will be returned. Thanks to Sven.
o CLI-227: Changed unit tests to junit 4 annotation style. Thanks to
           Duncan Jones.
o CLI-209: The javadoc of OptionBuilder now states that the class is not
           thread-safe. Thanks to Thomas Herre.
o CLI-200: Fixed typo in javadoc of class CommandLine. Thanks to
           Gerard Weatherby.
o CLI-223: Source code now uses generic types instead of raw types where
           possible. Thanks to Gerard Weatherby.
o CLI-220  Corrected javadoc for return type of
           MissingOptionException.getMissingOptions(). Thanks to Joe Casadonte.
o CLI-197: Improve description of parameter "stopAtNonOption" in method
           CommandLine.parse(Options, String[], boolean). Thanks to
           Anders Larsson.
o CLI-231: Removed DoubleCheckedLocking test from checkstyle configuration.
           Thanks to Duncan Jones.


                Release Notes for version 1.2

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

o --     : The method getOptionProperties() in the CommandLine class was added
           to retrieve easily the key/value pairs specified with options like
           -Dkey1=value1 -Dkey2=value2.
o CLI-157: GnuParser now supports long options with an '=' sign
           (ie. --foo=bar and -foo=bar)
o CLI-155: The ordering of options can be defined in help messages.


BUG FIXES
=========

o CLI-137: The number of arguments defined for an option specifies the
           arguments per occurence of the option and not for all occurences.
o CLI-164: PosixParser no longer ignores unrecognized short options.
o CLI-163: PosixParser no longer stops the bursting process of a token if
           stopAtNonOption is enabled and a non option character is
           encountered.
o CLI-165: PosixParser no longer keeps processing the tokens after an
           unrecognized long option when stopAtNonOption is enabled.
o CLI-156: Required options are properly checked if an Options instance is used
           twice to parse a command line.
o CLI-151: The line wrapping in HelpFormatter now works properly.


CHANGES
=======

o CLI-149: The message of MissingOptionException has been improved.
o CLI-86:  The exceptions have been enhanced with methods to retrieve easily
           the related options.
o CLI-141: Option.toString() now reports arguments properly.
o CLI-142: The Parser class has been changed to be more easily extendable.
o CLI-140: The following classes are now serializable: Option, OptionGroup,
           CommandLine and Options.
o --     : OptionValidator is no longer public, its methods were all private.


                Release Notes for version 1.1

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

o CLI-78:  Setting description of a Option.

CHANGES
=======

o CLI-2:   Wrong usage summary.
o CLI-5:   Dependecy on commons-lang-2.0 but commons-lang-1.0 is obtained.
o CLI-8:   Line separator as first char for helpformatter (footer) throws
           exception.
o CLI-13:  CommandLine.getOptionValue() behaves contrary to docs.
o CLI-21:  clone method in Option should use super.clone().
o CLI-23:  Passing properties in Parser does not work for options with a single
           argument.
o CLI-26:  Only long options without short option seems to be noticed.
o CLI-28:  Infinite Loop in Command-Line processing.
o CLI-29:  Options should not be able to be added more than once.
o CLI-35:  HelpFormatter doesn't sort options properly.
o CLI-38:  HelpFormatter doesn't function correctly for options with only
           LongOpt.
o CLI-44:  Document enhancement.
o CLI-45:  Documentation errors.
o CLI-51:  Parameter value "-something" misinterpreted as a parameter.
o CLI-56:  clone() method doesn't fully clone contents.
o CLI-59:  No Javadoc for HelpFormatter!.
o CLI-65:  Parser breaks up command line parms into single characters.
o CLI-67:  Missing arguments in HelpFormatter.renderOptions(..).
o CLI-69:  Error parsing option arguments.
o CLI-71:  A weakness of parser.
o CLI-129: CLI_1_BRANCH build.xml doesn't work.
o CLI-130: Remove the Commons Lang dependency.
o CLI-131: Options class returns options in random order.
o CLI-132: MissingOptionException should contain a useful error message.
o CLI-133: NullPointerException in Util.stripLeadingHyphens when passed a null
           argument.
o CLI-134: 1.1 is not backwards compatible because it adds methods to the
           CommandLineParser interface.
o CLI-135: Backwards compatibility between 1.1 and 1.0 broken due to
           Option.addValue removal.


Historical list of changes: https://commons.apache.org/cli/changes-report.html

For complete information on Commons CLI, including instructions on how to
submit bug reports, patches, or suggestions for improvement, see the
Apache Commons CLI website:

https://commons.apache.org/cli/

Have fun!
-Apache Commons CLI team
