Skip to content

Commit e43825d

Browse files
committed
Revert "Remove --incompatible_blacklisted_protos_requires_proto_info"
This reverts commit fe4a680.
1 parent 96a2551 commit e43825d

File tree

4 files changed

+79
-5
lines changed

4 files changed

+79
-5
lines changed

src/main/java/com/google/devtools/build/lib/rules/proto/ProtoConfiguration.java

+18
Original file line numberDiff line numberDiff line change
@@ -168,6 +168,19 @@ public static class Options extends FragmentOptions {
168168
help = "If true, add --allowed_public_imports to the java compile actions.")
169169
public boolean experimentalJavaProtoAddAllowedPublicImports;
170170

171+
@Option(
172+
name = "incompatible_blacklisted_protos_requires_proto_info",
173+
defaultValue = "true",
174+
documentationCategory = OptionDocumentationCategory.UNDOCUMENTED,
175+
effectTags = {OptionEffectTag.LOADING_AND_ANALYSIS},
176+
metadataTags = {
177+
OptionMetadataTag.INCOMPATIBLE_CHANGE,
178+
OptionMetadataTag.TRIGGERED_BY_ALL_INCOMPATIBLE_CHANGES
179+
},
180+
help =
181+
"If enabled, 'proto_lang_toolchain.blacklisted_protos' requires provider 'ProtoInfo'")
182+
public boolean blacklistedProtosRequiresProtoInfo;
183+
171184
@Override
172185
public FragmentOptions getHost() {
173186
Options host = (Options) super.getHost();
@@ -187,6 +200,7 @@ public FragmentOptions getHost() {
187200
host.experimentalJavaProtoAddAllowedPublicImports =
188201
experimentalJavaProtoAddAllowedPublicImports;
189202
host.generatedProtosInVirtualImports = generatedProtosInVirtualImports;
203+
host.blacklistedProtosRequiresProtoInfo = blacklistedProtosRequiresProtoInfo;
190204
return host;
191205
}
192206
}
@@ -260,4 +274,8 @@ public boolean strictPublicImports() {
260274
public boolean generatedProtosInVirtualImports() {
261275
return options.generatedProtosInVirtualImports;
262276
}
277+
278+
public boolean blacklistedProtosRequiresProtoInfo() {
279+
return options.blacklistedProtosRequiresProtoInfo;
280+
}
263281
}

src/main/java/com/google/devtools/build/lib/rules/proto/ProtoLangToolchain.java

+18-3
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,14 @@
1919
import com.google.devtools.build.lib.actions.Artifact;
2020
import com.google.devtools.build.lib.actions.MutableActionGraph.ActionConflictException;
2121
import com.google.devtools.build.lib.analysis.ConfiguredTarget;
22+
import com.google.devtools.build.lib.analysis.FileProvider;
2223
import com.google.devtools.build.lib.analysis.FilesToRunProvider;
2324
import com.google.devtools.build.lib.analysis.RuleConfiguredTargetBuilder;
2425
import com.google.devtools.build.lib.analysis.RuleConfiguredTargetFactory;
2526
import com.google.devtools.build.lib.analysis.RuleContext;
2627
import com.google.devtools.build.lib.analysis.Runfiles;
2728
import com.google.devtools.build.lib.analysis.RunfilesProvider;
29+
import com.google.devtools.build.lib.analysis.TransitiveInfoCollection;
2830
import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
2931
import com.google.devtools.build.lib.packages.Type;
3032

@@ -34,9 +36,22 @@ public class ProtoLangToolchain implements RuleConfiguredTargetFactory {
3436
public ConfiguredTarget create(RuleContext ruleContext)
3537
throws InterruptedException, RuleErrorException, ActionConflictException {
3638
NestedSetBuilder<Artifact> blacklistedProtos = NestedSetBuilder.stableOrder();
37-
for (ProtoInfo protoInfo :
38-
ruleContext.getPrerequisites("blacklisted_protos", ProtoInfo.PROVIDER)) {
39-
blacklistedProtos.addTransitive(protoInfo.getOriginalTransitiveProtoSources());
39+
for (TransitiveInfoCollection protos : ruleContext.getPrerequisites("blacklisted_protos")) {
40+
ProtoInfo protoInfo = protos.get(ProtoInfo.PROVIDER);
41+
if (protoInfo == null
42+
&& ruleContext
43+
.getFragment(ProtoConfiguration.class)
44+
.blacklistedProtosRequiresProtoInfo()) {
45+
ruleContext.ruleError(
46+
"'" + ruleContext.getLabel() + "' does not have mandatory provider 'ProtoInfo'.");
47+
}
48+
if (protoInfo != null) {
49+
blacklistedProtos.addTransitive(protoInfo.getOriginalTransitiveProtoSources());
50+
} else {
51+
// Only add files from FileProvider if |protos| is not a proto_library to avoid adding
52+
// the descriptor_set of proto_library to the list of blacklisted files.
53+
blacklistedProtos.addTransitive(protos.getProvider(FileProvider.class).getFilesToBuild());
54+
}
4055
}
4156

4257
return new RuleConfiguredTargetBuilder(ruleContext)

src/main/java/com/google/devtools/build/lib/rules/proto/ProtoLangToolchainRule.java

+5-2
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,14 @@
1818
import static com.google.devtools.build.lib.packages.BuildType.LABEL;
1919
import static com.google.devtools.build.lib.packages.BuildType.LABEL_LIST;
2020

21+
import com.google.common.collect.ImmutableList;
2122
import com.google.devtools.build.lib.analysis.BaseRuleClasses;
23+
import com.google.devtools.build.lib.analysis.FileProvider;
2224
import com.google.devtools.build.lib.analysis.RuleDefinition;
2325
import com.google.devtools.build.lib.analysis.RuleDefinitionEnvironment;
2426
import com.google.devtools.build.lib.analysis.config.ExecutionTransitionFactory;
27+
import com.google.devtools.build.lib.analysis.TransitiveInfoProvider;
2528
import com.google.devtools.build.lib.packages.RuleClass;
26-
import com.google.devtools.build.lib.packages.StarlarkProviderIdentifier;
2729
import com.google.devtools.build.lib.packages.Type;
2830

2931
/** Implements {code proto_lang_toolchain}. */
@@ -72,7 +74,8 @@ public RuleClass build(RuleClass.Builder builder, RuleDefinitionEnvironment envi
7274
.add(
7375
attr("blacklisted_protos", LABEL_LIST)
7476
.allowedFileTypes()
75-
.mandatoryProviders(StarlarkProviderIdentifier.forKey(ProtoInfo.PROVIDER.getKey())))
77+
.mandatoryBuiltinProviders(
78+
ImmutableList.<Class<? extends TransitiveInfoProvider>>of(FileProvider.class)))
7679
.requiresConfigurationFragments(ProtoConfiguration.class)
7780
.advertiseProvider(ProtoLangToolchainProvider.class)
7881
.removeAttribute("data")

src/test/java/com/google/devtools/build/lib/rules/proto/ProtoLangToolchainTest.java

+38
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,44 @@ public void protoToolchainBlacklistTransitiveProtos() throws Exception {
140140
getConfiguredTarget("//foo:toolchain").getProvider(ProtoLangToolchainProvider.class));
141141
}
142142

143+
@Test
144+
public void protoToolchainMixedBlacklist() throws Exception {
145+
// Tests legacy behaviour.
146+
useConfiguration("--incompatible_blacklisted_protos_requires_proto_info=false");
147+
148+
scratch.file(
149+
"third_party/x/BUILD",
150+
TestConstants.LOAD_PROTO_LIBRARY,
151+
"licenses(['unencumbered'])",
152+
"cc_binary(name = 'plugin', srcs = ['plugin.cc'])",
153+
"cc_library(name = 'runtime', srcs = ['runtime.cc'])",
154+
"proto_library(name = 'metadata', srcs = ['metadata.proto'])",
155+
"proto_library(",
156+
" name = 'descriptor',",
157+
" srcs = ['descriptor.proto'],",
158+
" strip_import_prefix = '/third_party')",
159+
"filegroup(name = 'any', srcs = ['any.proto'])");
160+
161+
scratch.file(
162+
"foo/BUILD",
163+
TestConstants.LOAD_PROTO_LANG_TOOLCHAIN,
164+
"proto_lang_toolchain(",
165+
" name = 'toolchain',",
166+
" command_line = 'cmd-line',",
167+
" plugin = '//third_party/x:plugin',",
168+
" runtime = '//third_party/x:runtime',",
169+
" blacklisted_protos = [",
170+
" '//third_party/x:metadata',",
171+
" '//third_party/x:descriptor',",
172+
" '//third_party/x:any']",
173+
")");
174+
175+
update(ImmutableList.of("//foo:toolchain"), false, 1, true, new EventBus());
176+
177+
validateProtoLangToolchain(
178+
getConfiguredTarget("//foo:toolchain").getProvider(ProtoLangToolchainProvider.class));
179+
}
180+
143181
@Test
144182
public void optionalFieldsAreEmpty() throws Exception {
145183
scratch.file(

0 commit comments

Comments
 (0)