Fix long optional args to require "=" as per documentation git-svn-id: https://svn.apache.org/repos/asf/jakarta/commons/proper/cli/branches/avalon-implementation@539978 13f79535-47bb-0310-9956-ffa450edef68
Project: http://git-wip-us.apache.org/repos/asf/commons-cli/repo Commit: http://git-wip-us.apache.org/repos/asf/commons-cli/commit/3c221ef1 Tree: http://git-wip-us.apache.org/repos/asf/commons-cli/tree/3c221ef1 Diff: http://git-wip-us.apache.org/repos/asf/commons-cli/diff/3c221ef1 Branch: refs/heads/avalon-implementation Commit: 3c221ef1b40313bcfa3b102984df23ad34ff9d33 Parents: 01de7d4 Author: Sebastian Bazley <[email protected]> Authored: Sun May 20 23:07:14 2007 +0000 Committer: Sebastian Bazley <[email protected]> Committed: Sun May 20 23:07:14 2007 +0000 ---------------------------------------------------------------------- .../apache/commons/cli/avalon/CLArgsParser.java | 16 +++++++++---- .../commons/cli/avalon/ClutilTestCase.java | 24 ++++++++++++++++++++ 2 files changed, 35 insertions(+), 5 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/commons-cli/blob/3c221ef1/src/java/org/apache/commons/cli/avalon/CLArgsParser.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/commons/cli/avalon/CLArgsParser.java b/src/java/org/apache/commons/cli/avalon/CLArgsParser.java index 7eb7e2f..36e8919 100644 --- a/src/java/org/apache/commons/cli/avalon/CLArgsParser.java +++ b/src/java/org/apache/commons/cli/avalon/CLArgsParser.java @@ -450,11 +450,6 @@ public final class CLArgsParser //should never get to here when stringIndex != 0 addOption( new CLOption( m_args[m_argIndex++] ) ); } - else if( STATE_OPTIONAL_ARG == m_state && m_isLong && m_ch != 0) - { - m_state = STATE_NORMAL; - addOption( m_option ); - } else { parseArguments(); @@ -560,12 +555,15 @@ public final class CLArgsParser return m_args[m_argIndex].charAt( m_stringIndex++ ); } + private char m_tokesep; // Keep track of token separator + private final Token nextToken( final char[] separators ) { m_ch = getChar(); if( isSeparator( m_ch, separators ) ) { + m_tokesep = m_ch; m_ch = getChar(); return new Token( TOKEN_SEPARATOR, null ); } @@ -579,6 +577,7 @@ public final class CLArgsParser } while( !isSeparator( m_ch, separators ) ); + m_tokesep = m_ch; return new Token( TOKEN_STRING, sb.toString() ); } @@ -660,6 +659,13 @@ public final class CLArgsParser return; } + if (m_isLong && '=' != m_tokesep) // Long optional arg must have = as separator + { + addOption(m_option); + m_state = STATE_NORMAL; + return; + } + if( '=' == m_ch ) // $NON-NLS-1$ { getChar(); http://git-wip-us.apache.org/repos/asf/commons-cli/blob/3c221ef1/src/test/org/apache/commons/cli/avalon/ClutilTestCase.java ---------------------------------------------------------------------- diff --git a/src/test/org/apache/commons/cli/avalon/ClutilTestCase.java b/src/test/org/apache/commons/cli/avalon/ClutilTestCase.java index 2bf2983..1e7f2ee 100644 --- a/src/test/org/apache/commons/cli/avalon/ClutilTestCase.java +++ b/src/test/org/apache/commons/cli/avalon/ClutilTestCase.java @@ -196,6 +196,30 @@ public final class ClutilTestCase assertEquals( option2.getArgument( 0 ), null ); } + public void testOptionalArgLongEquals() { + final CLOptionDescriptor[] options = new CLOptionDescriptor[] { ALL, TAINT }; + + // Check that optional args work woth long options + final String[] args = new String[] { "--taint=param", "-a" }; + + final CLArgsParser parser = new CLArgsParser(args, options); + + assertNull(parser.getErrorString(), parser.getErrorString()); + + final List clOptions = parser.getArguments(); + final int size = clOptions.size(); + + assertEquals("Option count", 2, size); + + final CLOption option0 = (CLOption) clOptions.get(0); + assertEquals("Option Code: " + option0.getDescriptor().getId(), TAINT_OPT, option0.getDescriptor().getId()); + assertEquals("Option Arg: " + option0.getArgument(0), "param", option0.getArgument(0)); + + final CLOption option2 = (CLOption) clOptions.get(1); + assertEquals(option2.getDescriptor().getId(), ALL_OPT); + assertEquals(option2.getArgument(0), null); + } + public void testShortOptArgUnenteredBeforeOtherOpt() { final CLOptionDescriptor[] options = new CLOptionDescriptor[]
