Brian Ray created GROOVY-9016:
---------------------------------

             Summary: picocli-based CliBuilder can be tricked into greedily 
consuming option as an arg
                 Key: GROOVY-9016
                 URL: https://issues.apache.org/jira/browse/GROOVY-9016
             Project: Groovy
          Issue Type: Bug
          Components: command line processing
    Affects Versions: 2.5.6
         Environment: >>First encountered<<
Groovy 2.4.15 - no bug
Groovy 2.5.6 - bug

Win 8.1 Pro
Zulu OpenJDK 1.8.0_202

>>Minimal replication<<
Groovy 2.4.8 (distro package) - no bug
OpenJDK 1.8.0_181 (distro package)
Debian 8

groovy:2.5.6-jre8-alpine Docker image
OpenJdk 1.8.0_191 (in image)
Debian 8 + Alpine 8 (in image)
            Reporter: Brian Ray


Stumbled across this edge case upgrading from 2.4.x to 2.5.6. Given the 
following {{CliBuilder}} based script,
{code:java}
final cli = new CliBuilder()
cli.with {
  f(
    longOpt: "firstOpt",
    "first option",
    required: false,
    args: 1,
    argName: "firstOpt",
  )
}

final opts = cli.parse(args)

println """
  firstOpt=$opts.firstOpt
  args=${ opts.arguments() }
"""
{code}
Passing an option value containing the character combo {{+=}} can trigger 
greedy assignment to args. Here is the pre-2.5 behavior.
{noformat}
$ ~/cli_greedy_arg.groovy -f+= bat

  firstOpt=+=
  args=[bat]

$ ~/cli_greedy_arg.groovy -f'+=' bat

  firstOpt=+=
  args=[bat]

$ ~/cli_greedy_arg.groovy -f"+=" bat

  firstOpt=+=
  args=[bat]

$ ~/cli_greedy_arg.groovy -f="+=" bat

  firstOpt==+=
  args=[bat]
{noformat}
That odd option value is captured properly each time.

Bumping up to 2.5.6 that option value tricks picocli (I'm guessing) into 
consuming the opt value as an arg in three out of four attempts.
{noformat}
$ docker run --rm -v "$PWD":/home/groovy/scripts -w /home/groovy/scripts 
groovy:2.5.6-jre8
-alpine groovy cli_greedy_arg.groovy -f+= bat

  firstOpt=false
  args=[-f+=, bat]

$ docker run --rm -v "$PWD":/home/groovy/scripts -w /home/groovy/scripts 
groovy:2.5.6-jre8
-alpine groovy cli_greedy_arg.groovy -f'+=' bat

  firstOpt=false
  args=[-f+=, bat]

$ docker run --rm -v "$PWD":/home/groovy/scripts -w /home/groovy/scripts 
groovy:2.5.6-jre8
-alpine groovy cli_greedy_arg.groovy -f"+=" bat

  firstOpt=false
  args=[-f+=, bat]

$ docker run --rm -v "$PWD":/home/groovy/scripts -w /home/groovy/scripts 
groovy:2.5.6-jre8
-alpine groovy cli_greedy_arg.groovy -f="+=" bat

  firstOpt=+=
  args=[bat]
{noformat}
 



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

Reply via email to