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)