This is an automated email from the ASF dual-hosted git repository. ggregory pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/commons-cli.git
commit 42be7926be5599342a812c170b03ab73f8cbb35c Author: Gary D. Gregory <[email protected]> AuthorDate: Tue Jul 29 11:19:32 2025 -0400 [CLI-347] Options.addOptionGroup(OptionGroup) does not remove required options from requiredOpts list --- src/changes/changes.xml | 1 + src/main/java/org/apache/commons/cli/Options.java | 4 +++- src/test/java/org/apache/commons/cli/OptionsTest.java | 15 +++++++++++++++ 3 files changed, 19 insertions(+), 1 deletion(-) diff --git a/src/changes/changes.xml b/src/changes/changes.xml index 4524d670..a5b5d8f7 100644 --- a/src/changes/changes.xml +++ b/src/changes/changes.xml @@ -37,6 +37,7 @@ <action type="fix" issue="CLI-341" dev="ggregory" due-to="Ruiqi Dong, Gary Gregory">HelpFormatter infinite loop with 0 width input.</action> <action type="fix" issue="CLI-349" dev="ggregory" due-to="Leo Fernandes, Gary Gregory">Fail faster with a more precise NullPointerException: Option.processValue() throws NullPointerException when passed null value with value separator configured.</action> <action type="fix" issue="CLI-344" dev="ggregory" due-to="Ruiqi Dong, Gary Gregory">Fail faster with a more precise NullPointerException: DefaultParser.parse() throws NullPointerException when options parameter is null.</action> + <action type="fix" issue="CLI-347" dev="ggregory" due-to="Ruiqi Dong, Gary Gregory">Options.addOptionGroup(OptionGroup) does not remove required options from requiredOpts list.</action> <!-- ADD --> <action type="add" issue="CLI-339" dev="ggregory" due-to="Claude Warren, Gary Gregory">Help formatter extension in the new package #314.</action> <action type="add" dev="ggregory" due-to="Gary Gregory">CommandLine.Builder implements Supplier<CommandLine>.</action> diff --git a/src/main/java/org/apache/commons/cli/Options.java b/src/main/java/org/apache/commons/cli/Options.java index f4ea07f7..ec067690 100644 --- a/src/main/java/org/apache/commons/cli/Options.java +++ b/src/main/java/org/apache/commons/cli/Options.java @@ -155,8 +155,10 @@ public class Options implements Serializable { // OptionGroup, either the group is required or // nothing is required option.setRequired(false); + final String key = option.getKey(); + requiredOpts.remove(key); addOption(option); - optionGroups.put(option.getKey(), group); + optionGroups.put(key, group); } return this; } diff --git a/src/test/java/org/apache/commons/cli/OptionsTest.java b/src/test/java/org/apache/commons/cli/OptionsTest.java index b0cf553a..1ce1c211 100644 --- a/src/test/java/org/apache/commons/cli/OptionsTest.java +++ b/src/test/java/org/apache/commons/cli/OptionsTest.java @@ -36,6 +36,21 @@ import org.junit.jupiter.api.Test; @SuppressWarnings("deprecation") // tests some deprecated classes class OptionsTest { + @Test + void testRequiredOptionInGroupShouldNotBeInRequiredList() { + final String key = "a"; + final Option option = new Option(key, "along", false, "Option A"); + option.setRequired(true); + final Options options = new Options(); + options.addOption(option); + assertTrue(options.getRequiredOptions().contains(key)); + final OptionGroup optionGroup = new OptionGroup(); + optionGroup.addOption(option); + options.addOptionGroup(optionGroup); + assertFalse(options.getOption(key).isRequired()); + assertFalse(options.getRequiredOptions().contains(key), "Option in group shouldn't be in required options list."); + } + private void assertToStrings(final Option option) { // Should never throw. // Should return a String, not null.
