Skip to content

Commit b303144

Browse files
fmeumcopybara-github
authored andcommitted
Fix common .bazelrc behavior for flag expansions
When a flag specified with `common` in a `.bazelrc` file expanded to a flag unsupported by the current command, it resulted in an error rather than the flag being ignored. Fixes #18130 (comment) Closes #20720. PiperOrigin-RevId: 597271727 Change-Id: Ieaba4dc00e13495a859e1eedf802759ad7dbf774
1 parent df187f4 commit b303144

File tree

2 files changed

+37
-3
lines changed

2 files changed

+37
-3
lines changed

src/main/java/com/google/devtools/common/options/OptionsParserImpl.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -544,7 +544,7 @@ private OptionsParserImplResult parse(
544544
parsedOption = result.parsedOptionDescription;
545545
}
546546
if (parsedOption.isPresent()) {
547-
handleNewParsedOption(parsedOption.get());
547+
handleNewParsedOption(parsedOption.get(), fallbackData);
548548
}
549549
priority = OptionPriority.nextOptionPriority(priority);
550550
}
@@ -644,7 +644,7 @@ void setOptionValueAtSpecificPriorityWithoutExpansion(
644644
}
645645

646646
/** Takes care of tracking the parsed option's value in relation to other options. */
647-
private void handleNewParsedOption(ParsedOptionDescription parsedOption)
647+
private void handleNewParsedOption(ParsedOptionDescription parsedOption, OptionsData fallbackData)
648648
throws OptionsParsingException {
649649
OptionDefinition optionDefinition = parsedOption.getOptionDefinition();
650650
ExpansionBundle expansionBundle = setOptionValue(parsedOption);
@@ -658,7 +658,7 @@ private void handleNewParsedOption(ParsedOptionDescription parsedOption)
658658
optionDefinition.hasImplicitRequirements() ? parsedOption : null,
659659
optionDefinition.isExpansionOption() ? parsedOption : null,
660660
expansionBundle.expansionArgs,
661-
/* fallbackData= */ null);
661+
fallbackData);
662662
if (!optionsParserImplResult.getResidue().isEmpty()) {
663663

664664
// Throw an assertion here, because this indicates an error in the definition of this

src/test/java/com/google/devtools/common/options/OptionsParserTest.java

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2589,6 +2589,40 @@ public void fallbackOptions_optionsParsingDifferently() {
25892589
assertThat(e).hasCauseThat().isInstanceOf(DuplicateOptionDeclarationException.class);
25902590
}
25912591

2592+
public static class ExpandingOptions extends OptionsBase {
2593+
@Option(
2594+
name = "foo",
2595+
category = "one",
2596+
documentationCategory = OptionDocumentationCategory.UNCATEGORIZED,
2597+
effectTags = {OptionEffectTag.NO_OP},
2598+
expansion = {"--nobar"},
2599+
defaultValue = "null")
2600+
public Void foo;
2601+
}
2602+
2603+
public static class ExpandingOptionsFallback extends OptionsBase {
2604+
@Option(
2605+
name = "bar",
2606+
category = "one",
2607+
documentationCategory = OptionDocumentationCategory.UNCATEGORIZED,
2608+
effectTags = {OptionEffectTag.NO_OP},
2609+
defaultValue = "true")
2610+
public boolean bar;
2611+
}
2612+
2613+
@Test
2614+
public void fallbackOptions_expansionToNegativeBooleanFlag() throws OptionsParsingException {
2615+
OpaqueOptionsData fallbackData =
2616+
OptionsParser.getFallbackOptionsData(
2617+
ImmutableList.of(ExpandingOptions.class, ExpandingOptionsFallback.class));
2618+
OptionsParser parser = OptionsParser.builder().optionsClasses(ExpandingOptions.class).build();
2619+
parser.parseWithSourceFunction(
2620+
PriorityCategory.RC_FILE, o -> ".bazelrc", ImmutableList.of("--foo"), fallbackData);
2621+
2622+
assertThat(parser.getOptions(ExpandingOptions.class)).isNotNull();
2623+
assertThat(parser.getOptions(ExpandingOptionsFallback.class)).isNull();
2624+
}
2625+
25922626
private static OptionInstanceOrigin createInvocationPolicyOrigin() {
25932627
return createInvocationPolicyOrigin(/*implicitDependent=*/ null, /*expandedFrom=*/ null);
25942628
}

0 commit comments

Comments
 (0)