diff --git a/src/main/java/com/google/devtools/build/lib/runtime/BlazeOptionHandler.java b/src/main/java/com/google/devtools/build/lib/runtime/BlazeOptionHandler.java index 9c862cb7019863..a2d89175d5aaa4 100644 --- a/src/main/java/com/google/devtools/build/lib/runtime/BlazeOptionHandler.java +++ b/src/main/java/com/google/devtools/build/lib/runtime/BlazeOptionHandler.java @@ -490,7 +490,7 @@ DetailedExitCode parseOptions(List args, ExtendedEventHandler eventHandl // to improve the user experience, but not required for safety or correctness. optionsPolicyEnforcer.enforce(optionsParser, commandAnnotation.name()); // Print warnings for odd options usage - for (String warning : optionsParser.getWarnings()) { + for (String warning : getFilteredWarnings(optionsParser)) { eventHandler.handle(Event.warn(warning)); } CommonCommandOptions commonOptions = optionsParser.getOptions(CommonCommandOptions.class); @@ -704,4 +704,20 @@ private static void partitionCommandLineArgs( } } } + + public static ImmutableList getFilteredWarnings(OptionsParser parser) { + CommonCommandOptions commonOptions = parser.getOptions(CommonCommandOptions.class); + Preconditions.checkNotNull(commonOptions, + "getWarnings can only be called after options parsing"); + + ImmutableList.Builder warnings = ImmutableList.builder(); + for (String warning : parser.getWarnings()) { + if (!commonOptions.reportDuplicateOptionsAndConfigs && warning.contains( + "was expanded to from both")) { + continue; + } + warnings.add(warning); + } + return warnings.build(); + } } diff --git a/src/main/java/com/google/devtools/build/lib/runtime/CommonCommandOptions.java b/src/main/java/com/google/devtools/build/lib/runtime/CommonCommandOptions.java index 9657df3e263d68..1384a07a0ce34b 100644 --- a/src/main/java/com/google/devtools/build/lib/runtime/CommonCommandOptions.java +++ b/src/main/java/com/google/devtools/build/lib/runtime/CommonCommandOptions.java @@ -532,6 +532,14 @@ public String getTypeDescription() { + " them.") public boolean heuristicallyDropNodes; + @Option( + name = "snowflake_report_duplicate_options_and_configs", + defaultValue = "true", + documentationCategory = OptionDocumentationCategory.LOGGING, + effectTags = {OptionEffectTag.TERMINAL_OUTPUT}, + help = "If enabled, reports flags and configs that were expanded multiple times as warnings.") + public boolean reportDuplicateOptionsAndConfigs; + /** The option converter to check that the user can only specify legal profiler tasks. */ public static class ProfilerTaskConverter extends EnumConverter { public ProfilerTaskConverter() { diff --git a/src/main/java/com/google/devtools/build/lib/runtime/ConfigExpander.java b/src/main/java/com/google/devtools/build/lib/runtime/ConfigExpander.java index 92fe5f1356c195..0b985d037b28e6 100644 --- a/src/main/java/com/google/devtools/build/lib/runtime/ConfigExpander.java +++ b/src/main/java/com/google/devtools/build/lib/runtime/ConfigExpander.java @@ -150,7 +150,11 @@ static void expandConfigOptions( // At this point, we've expanded everything, identify duplicates, if any, to warn about // re-application. - List configs = optionsParser.getOptions(CommonCommandOptions.class).configs; + CommonCommandOptions commonOptions = optionsParser.getOptions(CommonCommandOptions.class); + if (!commonOptions.reportDuplicateOptionsAndConfigs) { + return; + } + List configs = commonOptions.configs; Set configSet = new HashSet<>(); LinkedHashSet duplicateConfigs = new LinkedHashSet<>(); for (String configValue : configs) {