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&lt;CommandLine&gt;.</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.

Reply via email to