Re: [CLI] - new FormatHelper produces poorly formatted option groups

Damien Carbonne <[email protected]> Wed, 5 Nov 2025 23:06:51 +0100
Newsgroups gmane.comp.jakarta.commons.user
Message-ID <[email protected]>
Hi Gary,

Using commons-cli-1.11.0-SNAPSHOT, the output of the sample code is now:
  usage:  Command -o1 | -o2

  Options     Description
  -o1         Descr
  -o2         Descr

usage: Command -o1 | -o2
  -o1   Descr
  -o2   Descr

If the group is declared optional, then the output is:
  usage:  Command [-o1 | -o2]

  Options     Description
  -o1         Descr
  -o2         Descr

usage: Command [-o1 | -o2]
  -o1   Descr
  -o2   Descr

This seems correct and consistent.

Thank you.
Damien

Le 05/11/2025 à 13:34, Gary Gregory a écrit :
> Hello Damien and all,
>
> This issue has been fixed with Claude's PR
> https://github.com/apache/commons-cli/pull/411
>
> Thank you, Claude!
>
> Damien: Would you please test with a local git master build or a
> snapshot dependency from
> https://repository.apache.org/content/repositories/snapshots/ ?
>
> Thank you,
> Gary
>
> On Thu, Oct 30, 2025 at 3:22 PM Damien Carbonne
> <[email protected]> wrote:
>> I think that the issue is here, in
>> org.apache.commons.cli.help.AbstractHelpFormatter:
>>
>> public final void printHelp(final String cmdLineSyntax, final String
>> header, final Options options, final String footer, final boolean
>> autoUsage) throws IOException {
>>      printHelp(cmdLineSyntax, header, options.getOptions(), footer,
>> autoUsage); // Here groups are lost
>> }
>>
>> Options contains groups, but Iterable<Option> (returned by
>> options.getOptions()) does not.
>> Therefore, the called printHelp is unable to format options correctly.
>>
>> One could construct Options from Iterable<Option> and revert the calls.
>>
>>
>> Le 30/10/2025 à 16:05, Claude Warren a écrit :
>>> I was on my phone when I first read this.  But now I wonder how this is
>>> wrong.
>>>
>>> The example adds 2 options o1 and o2 and a group comprising the 2 and the
>>> expected output contains o1, o2, and o3.  Where did o3 get its name?  I
>>> assume o3 is intended to be the group of 01 and 02, but I don't think those
>>> were ever delineated in the output.  Am I missing something?
>>>
>>>
>>>
>>> On Thu, Oct 30, 2025 at 12:47 PM Claude Warren <[email protected]> wrote:
>>>
>>>> Looks likeregression.  I will take a look later today.
>>>>
>>>> Claude
>>>>
>>>> LinkedIn: http://www.linkedin.com/in/claudewarren
>>>>
>>>> On Thu 30 Oct 2025, 12:12 Gary Gregory, <[email protected]> wrote:
>>>>
>>>>> Claude, any thoughts here? I was just about to push a release candidate...
>>>>>
>>>>> Gary
>>>>>
>>>>> On Sun, Oct 26, 2025 at 10:38 AM Damien Carbonne
>>>>> <[email protected]> wrote:
>>>>>> Hi,
>>>>>>
>>>>>> When using the new HelpFormatter (commons-cli-1.10.0), option groups are
>>>>>> poorly formatted.
>>>>>>
>>>>>> This looks like a regression.
>>>>>> The following code shows the difference between the new HelpFormatter
>>>>>> and the deprecated one:
>>>>>> -------------------------------------
>>>>>> import java.io.IOException;
>>>>>>
>>>>>> import org.apache.commons.cli.Option;
>>>>>> import org.apache.commons.cli.OptionGroup;
>>>>>> import org.apache.commons.cli.Options;
>>>>>>
>>>>>> public class CliTest {
>>>>>>        public static void main(String[] args) throws IOException {
>>>>>>            // create options and groups
>>>>>>            final Option o1 = new Option("o1", "Descr");
>>>>>>            final Option o2 = new Option("o2", "Descr");
>>>>>>
>>>>>>            final Options options = new Options();
>>>>>>            options.addOption(o1);
>>>>>>            options.addOption(o2);
>>>>>>
>>>>>>            final OptionGroup group = new OptionGroup();
>>>>>>            group.addOption(o1);
>>>>>>            group.addOption(o2);
>>>>>>            options.addOptionGroup(group);
>>>>>>
>>>>>>            //format options with new formatter
>>>>>>            final org.apache.commons.cli.help.HelpFormatter newFormatter =
>>>>>>
>>>>> org.apache.commons.cli.help.HelpFormatter.builder().setShowSince(false).get();
>>>>>>            newFormatter.printHelp("Command", null, options, null, true);
>>>>>>
>>>>>>            // format options with old formatter
>>>>>>            final org.apache.commons.cli.HelpFormatter oldFormatter =
>>>>>>                    new org.apache.commons.cli.HelpFormatter();
>>>>>>            oldFormatter.printHelp("Command", null, options, null, true);
>>>>>>        }
>>>>>> }
>>>>>> -------------------------------------
>>>>>>
>>>>>> The output is:
>>>>>> -------------------------------------
>>>>>> usage:  Command [-o1] [-o2]
>>>>>>     Options     Description
>>>>>>     -o1         Descr
>>>>>>     -o2         Descr
>>>>>>
>>>>>>
>>>>>> usage: Command [-o1 | -o2]
>>>>>>     -o1   Descr
>>>>>>     -o2   Descr
>>>>>> -------------------------------------
>>>>>>
>>>>>> Groups are not shown any more.
>>>>>> I would expect the new formatter output to look like this:
>>>>>> -------------------------------------
>>>>>> usage: Command [-o1 | -o2]
>>>>>> Options Description
>>>>>> -o1 Descr
>>>>>> -o2 Descr
>>>>>> -o3 Descr
>>>>>> -------------------------------------
>>>>>>
>>>>>> Regards,
>>>>>> Damien Carbonne
>>>>>>
>>>>>> ---------------------------------------------------------------------
>>>>>> To unsubscribe, e-mail: [email protected]
>>>>>> For additional commands, e-mail: [email protected]
>>>>>>
>>
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: [email protected]
>> For additional commands, e-mail: [email protected]
>>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [email protected]
> For additional commands, e-mail: [email protected]
>