Skip to content

Commit 3a7236b

Browse files
keertkWyverald
andauthored
Allow WORKSPACE and WORKSPACE-loaded .bzl files to see Bzlmod root module's mappings (bazelbuild#17818)
Currently, we evaluate WORKSPACE (`WorkspaceFileFunction`) and WORKSPACE-loaded .bzl files (`BzlLoadFunction` with `BzlLoadValue.KeyForWorkspace`) with the repo mapping purely computed from previous WORKSPACE chunks. This is unlike BUILD-loaded .bzl files from WORKSPACE-defined repos (`BzlLoadFunction` with `BzlLoadValue.KeyForBuild`, which is the same as `RepositoryMappingFunction`), which take the mappings of the Bzlmod root module into account. This CL fixes that discrepancy by doing the same "repo mapping composition" everywhere. Fixes bazelbuild#17655 RELNOTES: Fixed an issue where WORKSPACE and WORKSPACE-loaded .bzl files couldn't see the Bzlmod root module's mappings when Bzlmod is enabled. PiperOrigin-RevId: 515318590 Change-Id: I4babc922f6cdb932d17ce18d9a9d9d427dbed2eb Co-authored-by: Googler <[email protected]>
1 parent fb695ed commit 3a7236b

File tree

9 files changed

+206
-62
lines changed

9 files changed

+206
-62
lines changed

src/main/java/com/google/devtools/build/lib/cmdline/RepositoryMapping.java

+31-9
Original file line numberDiff line numberDiff line change
@@ -49,16 +49,18 @@ public abstract class RepositoryMapping {
4949
abstract RepositoryName ownerRepo();
5050

5151
public static RepositoryMapping create(
52-
Map<String, RepositoryName> repositoryMapping, RepositoryName ownerRepo) {
53-
return new AutoValue_RepositoryMapping(
54-
ImmutableMap.copyOf(Preconditions.checkNotNull(repositoryMapping)),
55-
Preconditions.checkNotNull(ownerRepo));
52+
Map<String, RepositoryName> entries, RepositoryName ownerRepo) {
53+
return createInternal(
54+
Preconditions.checkNotNull(entries), Preconditions.checkNotNull(ownerRepo));
5655
}
5756

58-
public static RepositoryMapping createAllowingFallback(
59-
Map<String, RepositoryName> repositoryMapping) {
60-
return new AutoValue_RepositoryMapping(
61-
ImmutableMap.copyOf(Preconditions.checkNotNull(repositoryMapping)), null);
57+
public static RepositoryMapping createAllowingFallback(Map<String, RepositoryName> entries) {
58+
return createInternal(Preconditions.checkNotNull(entries), null);
59+
}
60+
61+
private static RepositoryMapping createInternal(
62+
Map<String, RepositoryName> entries, RepositoryName ownerRepo) {
63+
return new AutoValue_RepositoryMapping(ImmutableMap.copyOf(entries), ownerRepo);
6264
}
6365

6466
/**
@@ -68,7 +70,7 @@ public static RepositoryMapping createAllowingFallback(
6870
public RepositoryMapping withAdditionalMappings(Map<String, RepositoryName> additionalMappings) {
6971
HashMap<String, RepositoryName> allMappings = new HashMap<>(additionalMappings);
7072
allMappings.putAll(entries());
71-
return new AutoValue_RepositoryMapping(ImmutableMap.copyOf(allMappings), ownerRepo());
73+
return createInternal(allMappings, ownerRepo());
7274
}
7375

7476
/**
@@ -114,4 +116,24 @@ public Optional<String> getInverse(RepositoryName postMappingName) {
114116
.map(Entry::getKey)
115117
.findFirst();
116118
}
119+
120+
/**
121+
* Creates a new {@link RepositoryMapping} instance that is the equivalent of composing this
122+
* {@link RepositoryMapping} with another one. That is, {@code a.composeWith(b).get(name) ===
123+
* b.get(a.get(name))} (treating {@code b} as allowing fallback).
124+
*
125+
* <p>Since we're treating the result of {@code a.get(name)} as an apparent repo name instead of a
126+
* canonical repo name, this only really makes sense when {@code a} does not use strict deps (i.e.
127+
* allows fallback).
128+
*/
129+
public RepositoryMapping composeWith(RepositoryMapping other) {
130+
Preconditions.checkArgument(
131+
!usesStrictDeps(), "only an allow-fallback mapping can be composed with other mappings");
132+
HashMap<String, RepositoryName> entries = new HashMap<>(other.entries());
133+
for (Map.Entry<String, RepositoryName> entry : entries().entrySet()) {
134+
RepositoryName mappedName = other.get(entry.getValue().getName());
135+
entries.put(entry.getKey(), mappedName.isVisible() ? mappedName : entry.getValue());
136+
}
137+
return createInternal(entries, null);
138+
}
117139
}

src/main/java/com/google/devtools/build/lib/skyframe/BzlLoadFunction.java

+37-18
Original file line numberDiff line numberDiff line change
@@ -165,7 +165,7 @@ public static BzlLoadFunction create(
165165
// (b) The memory overhead of the extra Skyframe node and edge per bzl file is pure
166166
// waste.
167167
new InliningAndCachingGetter(packageFactory, hashFunction, bzlCompileCache),
168-
/*cachedBzlLoadDataManager=*/ null);
168+
/* cachedBzlLoadDataManager= */ null);
169169
}
170170

171171
public static BzlLoadFunction createForInlining(
@@ -188,7 +188,7 @@ public SkyValue compute(SkyKey skyKey, Environment env)
188188
throws SkyFunctionException, InterruptedException {
189189
BzlLoadValue.Key key = (BzlLoadValue.Key) skyKey.argument();
190190
try {
191-
return computeInternal(key, env, /*inliningState=*/ null);
191+
return computeInternal(key, env, /* inliningState= */ null);
192192
} catch (BzlLoadFailedException e) {
193193
throw new BzlLoadFunctionException(e);
194194
}
@@ -455,12 +455,12 @@ private InliningState(
455455
static InliningState create(Environment env) {
456456
return new InliningState(
457457
new RecordingSkyFunctionEnvironment(env, x -> {}, x -> {}, x -> {}),
458-
/*cachedDataBuilder=*/ null,
459-
/*loadStack=*/ new LinkedHashSet<>(),
460-
/*successfulLoads=*/ new HashMap<>(),
461-
/*unsuccessfulLoads=*/ new HashSet<>(),
458+
/* cachedDataBuilder= */ null,
459+
/* loadStack= */ new LinkedHashSet<>(),
460+
/* successfulLoads= */ new HashMap<>(),
461+
/* unsuccessfulLoads= */ new HashSet<>(),
462462
// No parent value to mutate
463-
/*childCachedDataHandler=*/ x -> {});
463+
/* childCachedDataHandler= */ x -> {});
464464
}
465465

466466
/**
@@ -598,7 +598,10 @@ private StarlarkBuiltinsValue getBuiltins(
598598
env.getValueOrThrow(StarlarkBuiltinsValue.key(), BuiltinsFailedException.class);
599599
} else {
600600
return StarlarkBuiltinsFunction.computeInline(
601-
StarlarkBuiltinsValue.key(), inliningState, packageFactory, /*bzlLoadFunction=*/ this);
601+
StarlarkBuiltinsValue.key(),
602+
inliningState,
603+
packageFactory,
604+
/* bzlLoadFunction= */ this);
602605
}
603606
} catch (BuiltinsFailedException e) {
604607
throw BzlLoadFailedException.builtinsFailed(key.getLabel(), e);
@@ -776,7 +779,7 @@ private BzlLoadValue computeInternalWithCompiledBzl(
776779
loadValues,
777780
loadKeys,
778781
programLoads,
779-
/*demoteErrorsToWarnings=*/ !builtins.starlarkSemantics.getBool(
782+
/* demoteErrorsToWarnings= */ !builtins.starlarkSemantics.getBool(
780783
BuildLanguageOptions.CHECK_BZL_VISIBILITY),
781784
env.getListener());
782785

@@ -845,7 +848,8 @@ private BzlLoadValue computeInternalWithCompiledBzl(
845848
private static RepositoryMapping getRepositoryMapping(
846849
BzlLoadValue.Key key, StarlarkSemantics semantics, Environment env)
847850
throws InterruptedException {
848-
if (key.isBuiltins() && !semantics.getBool(BuildLanguageOptions.ENABLE_BZLMOD)) {
851+
boolean bzlmod = semantics.getBool(BuildLanguageOptions.ENABLE_BZLMOD);
852+
if (key.isBuiltins() && !bzlmod) {
849853
// Without Bzlmod, builtins .bzls never have a repo mapping defined for them, so return
850854
// without requesting a RepositoryMappingValue. (NB: In addition to being a slight
851855
// optimization, this avoids adding a reverse dependency on the special //external package,
@@ -862,21 +866,37 @@ private static RepositoryMapping getRepositoryMapping(
862866
if (key instanceof BzlLoadValue.KeyForWorkspace) {
863867
// Still during workspace file evaluation
864868
BzlLoadValue.KeyForWorkspace keyForWorkspace = (BzlLoadValue.KeyForWorkspace) key;
869+
RepositoryMapping pureWorkspaceMapping;
865870
if (keyForWorkspace.getWorkspaceChunk() == 0) {
866871
// There is no previous workspace chunk
867-
return RepositoryMapping.ALWAYS_FALLBACK;
872+
pureWorkspaceMapping = RepositoryMapping.ALWAYS_FALLBACK;
868873
} else {
869874
SkyKey workspaceFileKey =
870875
WorkspaceFileValue.key(
871876
keyForWorkspace.getWorkspacePath(), keyForWorkspace.getWorkspaceChunk() - 1);
872877
WorkspaceFileValue workspaceFileValue = (WorkspaceFileValue) env.getValue(workspaceFileKey);
873878
// Note: we know for sure that the requested WorkspaceFileValue is fully computed so we do
874879
// not need to check if it is null
875-
return RepositoryMapping.createAllowingFallback(
876-
workspaceFileValue.getRepositoryMapping().getOrDefault(repoName, ImmutableMap.of()));
877-
// NOTE(wyv): this means that, in the WORKSPACE file, we can't load from a repo generated by
878-
// bzlmod. If that's a problem, we should "fall back" to the bzlmod case below.
880+
pureWorkspaceMapping =
881+
RepositoryMapping.createAllowingFallback(
882+
workspaceFileValue
883+
.getRepositoryMapping()
884+
.getOrDefault(repoName, ImmutableMap.of()));
885+
}
886+
if (!bzlmod) {
887+
// Without Bzlmod, we just return the mapping purely computed from WORKSPACE stuff.
888+
return pureWorkspaceMapping;
889+
}
890+
// If Bzlmod is in play, we need to make sure that pure WORKSPACE mapping is composed with the
891+
// root module's mapping (just like how all WORKSPACE repos can see what the root module sees
892+
// _after_ WORKSPACE evaluation).
893+
RepositoryMappingValue rootModuleMappingValue =
894+
(RepositoryMappingValue)
895+
env.getValue(RepositoryMappingValue.KEY_FOR_ROOT_MODULE_WITHOUT_WORKSPACE_REPOS);
896+
if (rootModuleMappingValue == null) {
897+
return null;
879898
}
899+
return pureWorkspaceMapping.composeWith(rootModuleMappingValue.getRepositoryMapping());
880900
}
881901

882902
if (key instanceof BzlLoadValue.KeyForBzlmod) {
@@ -903,9 +923,8 @@ private static RepositoryMapping getRepositoryMapping(
903923
}
904924
}
905925

906-
// This is either a .bzl loaded from BUILD files, or a .bzl loaded for bzlmod (in which case the
907-
// .bzl file *has* to be from a Bazel module anyway). So we can just use the full repo mapping
908-
// from RepositoryMappingFunction.
926+
// This is either a .bzl loaded from BUILD files, or a .bzl loaded for bzlmod, so we can just
927+
// use the full repo mapping from RepositoryMappingFunction.
909928
RepositoryMappingValue repositoryMappingValue =
910929
(RepositoryMappingValue) env.getValue(RepositoryMappingValue.key(repoName));
911930
if (repositoryMappingValue == null) {

src/main/java/com/google/devtools/build/lib/skyframe/RepositoryMappingFunction.java

+5-15
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515
package com.google.devtools.build.lib.skyframe;
1616

1717
import com.google.common.collect.ImmutableMap;
18-
import com.google.common.collect.Maps;
1918
import com.google.devtools.build.lib.bazel.bzlmod.BazelModuleResolutionValue;
2019
import com.google.devtools.build.lib.bazel.bzlmod.ModuleExtensionId;
2120
import com.google.devtools.build.lib.bazel.bzlmod.ModuleKey;
@@ -213,26 +212,17 @@ private SkyValue computeFromWorkspace(
213212
if (externalPackage.containsErrors()) {
214213
throw new RepositoryMappingFunctionException();
215214
}
215+
RepositoryMapping workspaceMapping =
216+
RepositoryMapping.createAllowingFallback(
217+
externalPackage.getRepositoryMapping(repositoryName));
216218
if (rootModuleRepoMapping == null) {
217219
// This means Bzlmod is disabled.
218-
return RepositoryMappingValue.withMapping(
219-
RepositoryMapping.createAllowingFallback(
220-
externalPackage.getRepositoryMapping(repositoryName)));
220+
return RepositoryMappingValue.withMapping(workspaceMapping);
221221
}
222222
// If Bzlmod is in play, we need to make sure that WORKSPACE repos see all repos that root
223223
// module can see, taking care to compose the existing WORKSPACE mapping with the main repo
224224
// mapping from Bzlmod.
225-
return RepositoryMappingValue.withMapping(
226-
RepositoryMapping.createAllowingFallback(
227-
Maps.transformValues(
228-
externalPackage.getRepositoryMapping(repositoryName),
229-
toRepo -> {
230-
RepositoryName mappedName = rootModuleRepoMapping.get(toRepo.getName());
231-
// If the Bzlmod-only main repo mapping doesn't contain this repo, don't touch
232-
// it.
233-
return mappedName.isVisible() ? mappedName : toRepo;
234-
}))
235-
.withAdditionalMappings(rootModuleRepoMapping));
225+
return RepositoryMappingValue.withMapping(workspaceMapping.composeWith(rootModuleRepoMapping));
236226
}
237227

238228
private static Optional<ModuleExtensionId> maybeGetModuleExtensionForRepo(

src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceFileFunction.java

+16-7
Original file line numberDiff line numberDiff line change
@@ -120,14 +120,14 @@ public SkyValue compute(SkyKey skyKey, Environment env)
120120
RepositoryDelegatorFunction.RESOLVED_FILE_INSTEAD_OF_WORKSPACE.get(env));
121121
boolean useWorkspaceResolvedFile = resolvedFile.isPresent();
122122

123+
final boolean bzlmod = starlarkSemantics.getBool(BuildLanguageOptions.ENABLE_BZLMOD);
123124
boolean useWorkspaceBzlmodFile = false;
124125
RootedPath workspaceBzlmodFile =
125126
RootedPath.toRootedPath(
126127
workspaceFile.getRoot(),
127128
workspaceFile.getRootRelativePath().replaceName("WORKSPACE.bzlmod"));
128129
// We only need to check WORKSPACE.bzlmod when the resolved file isn't used.
129-
if (!useWorkspaceResolvedFile
130-
&& starlarkSemantics.getBool(BuildLanguageOptions.ENABLE_BZLMOD)) {
130+
if (!useWorkspaceResolvedFile && bzlmod) {
131131
FileValue workspaceBzlmodFileValue =
132132
(FileValue) env.getValue(FileValue.key(workspaceBzlmodFile));
133133
if (workspaceBzlmodFileValue == null) {
@@ -266,6 +266,15 @@ public SkyValue compute(SkyKey skyKey, Environment env)
266266
.getRepositoryMapping()
267267
.getOrDefault(RepositoryName.MAIN, ImmutableMap.of()));
268268
}
269+
if (bzlmod) {
270+
RepositoryMappingValue rootModuleMapping =
271+
(RepositoryMappingValue)
272+
env.getValue(RepositoryMappingValue.KEY_FOR_ROOT_MODULE_WITHOUT_WORKSPACE_REPOS);
273+
if (rootModuleMapping == null) {
274+
return null;
275+
}
276+
repoMapping = repoMapping.composeWith(rootModuleMapping.getRepositoryMapping());
277+
}
269278

270279
Package.Builder builder =
271280
packageFactory.newExternalPackageBuilder(
@@ -274,12 +283,12 @@ public SkyValue compute(SkyKey skyKey, Environment env)
274283
if (chunks.isEmpty()) {
275284
return new WorkspaceFileValue(
276285
buildAndReportEvents(builder, env),
277-
/* loadedModules = */ ImmutableMap.<String, Module>of(),
278-
/* loadToChunkMap = */ ImmutableMap.<String, Integer>of(),
279-
/* bindings = */ ImmutableMap.<String, Object>of(),
286+
/* loadedModules= */ ImmutableMap.<String, Module>of(),
287+
/* loadToChunkMap= */ ImmutableMap.<String, Integer>of(),
288+
/* bindings= */ ImmutableMap.<String, Object>of(),
280289
workspaceFile,
281-
/* idx = */ 0, // first fragment
282-
/* hasNext = */ false);
290+
/* idx= */ 0, // first fragment
291+
/* hasNext= */ false);
283292
}
284293

285294
List<StarlarkFile> chunk = chunks.get(key.getIndex());

src/test/java/com/google/devtools/build/lib/cmdline/RepositoryMappingTest.java

+31-1
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ public void neverFallback() throws Exception {
4747
}
4848

4949
@Test
50-
public void additionalMappings() throws Exception {
50+
public void additionalMappings_basic() throws Exception {
5151
RepositoryMapping mapping =
5252
RepositoryMapping.create(
5353
ImmutableMap.of("A", RepositoryName.create("com_foo_bar_a")),
@@ -59,4 +59,34 @@ public void additionalMappings() throws Exception {
5959
.isEqualTo(
6060
RepositoryName.create("C").toNonVisible(RepositoryName.create("fake_owner_repo")));
6161
}
62+
63+
@Test
64+
public void additionalMappings_precedence() throws Exception {
65+
RepositoryMapping mapping =
66+
RepositoryMapping.createAllowingFallback(ImmutableMap.of("A", RepositoryName.create("A1")))
67+
.withAdditionalMappings(ImmutableMap.of("A", RepositoryName.create("A2")));
68+
assertThat(mapping.get("A")).isEqualTo(RepositoryName.create("A1"));
69+
}
70+
71+
@Test
72+
public void composeWith() throws Exception {
73+
RepositoryMapping mapping =
74+
RepositoryMapping.createAllowingFallback(
75+
ImmutableMap.of(
76+
"A", RepositoryName.create("A_mapped"), "B", RepositoryName.create("B_mapped")))
77+
.composeWith(
78+
RepositoryMapping.create(
79+
ImmutableMap.of(
80+
"A",
81+
RepositoryName.create("A_mapped_differently"),
82+
"A_mapped",
83+
RepositoryName.create("A_mapped_twice"),
84+
"C",
85+
RepositoryName.create("C_mapped")),
86+
RepositoryName.create("blah")));
87+
assertThat(mapping.get("A")).isEqualTo(RepositoryName.create("A_mapped_twice"));
88+
assertThat(mapping.get("B")).isEqualTo(RepositoryName.create("B_mapped"));
89+
assertThat(mapping.get("C")).isEqualTo(RepositoryName.create("C_mapped"));
90+
assertThat(mapping.get("D")).isEqualTo(RepositoryName.create("D"));
91+
}
6292
}

src/test/java/com/google/devtools/build/lib/rules/repository/BUILD

+1
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ java_library(
4444
"//src/main/java/com/google/devtools/build/lib/skyframe:package_lookup_function",
4545
"//src/main/java/com/google/devtools/build/lib/skyframe:precomputed_function",
4646
"//src/main/java/com/google/devtools/build/lib/skyframe:precomputed_value",
47+
"//src/main/java/com/google/devtools/build/lib/skyframe:repository_mapping_function",
4748
"//src/main/java/com/google/devtools/build/lib/skyframe:sky_functions",
4849
"//src/main/java/com/google/devtools/build/lib/skyframe:skyframe_cluster",
4950
"//src/main/java/com/google/devtools/build/lib/starlarkbuildapi/repository",

src/test/java/com/google/devtools/build/lib/rules/repository/RepositoryDelegatorTest.java

+2
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@
6868
import com.google.devtools.build.lib.skyframe.PackageLookupFunction.CrossRepositoryLabelViolationStrategy;
6969
import com.google.devtools.build.lib.skyframe.PrecomputedFunction;
7070
import com.google.devtools.build.lib.skyframe.PrecomputedValue;
71+
import com.google.devtools.build.lib.skyframe.RepositoryMappingFunction;
7172
import com.google.devtools.build.lib.skyframe.SkyFunctions;
7273
import com.google.devtools.build.lib.skyframe.WorkspaceFileFunction;
7374
import com.google.devtools.build.lib.starlarkbuildapi.repository.RepositoryBootstrap;
@@ -220,6 +221,7 @@ public void setupDelegator() throws Exception {
220221
new IgnoredPackagePrefixesFunction(
221222
/*ignoredPackagePrefixesFile=*/ PathFragment.EMPTY_FRAGMENT))
222223
.put(SkyFunctions.RESOLVED_HASH_VALUES, new ResolvedHashesFunction())
224+
.put(SkyFunctions.REPOSITORY_MAPPING, new RepositoryMappingFunction())
223225
.put(
224226
SkyFunctions.MODULE_FILE,
225227
new ModuleFileFunction(registryFactory, rootPath, ImmutableMap.of()))

src/test/java/com/google/devtools/build/lib/skyframe/RepositoryMappingFunctionTest.java

+16-12
Original file line numberDiff line numberDiff line change
@@ -62,25 +62,29 @@ private EvaluationResult<RepositoryMappingValue> eval(SkyKey key)
6262
ModifiedFileSet.builder().modify(PathFragment.create("WORKSPACE")).build(),
6363
Root.fromPath(rootDirectory));
6464
return SkyframeExecutorTestUtils.evaluate(
65-
getSkyframeExecutor(), key, /*keepGoing=*/ false, reporter);
65+
getSkyframeExecutor(), key, /* keepGoing= */ false, reporter);
6666
}
6767

6868
@Before
6969
public void setUpForBzlmod() throws Exception {
7070
setBuildLanguageOptions("--enable_bzlmod");
7171
scratch.file("MODULE.bazel");
72+
}
73+
74+
@Override
75+
protected ImmutableList<PrecomputedValue.Injected> extraPrecomputedValues() throws Exception {
7276
registry = FakeRegistry.DEFAULT_FACTORY.newFakeRegistry(scratch.dir("modules").getPathString());
73-
ModuleFileFunction.REGISTRIES.set(
74-
getSkyframeExecutor().getDifferencerForTesting(), ImmutableList.of(registry.getUrl()));
75-
ModuleFileFunction.IGNORE_DEV_DEPS.set(getSkyframeExecutor().getDifferencerForTesting(), false);
76-
ModuleFileFunction.MODULE_OVERRIDES.set(
77-
getSkyframeExecutor().getDifferencerForTesting(), ImmutableMap.of());
78-
BazelModuleResolutionFunction.ALLOWED_YANKED_VERSIONS.set(
79-
getSkyframeExecutor().getDifferencerForTesting(), ImmutableList.of());
80-
BazelModuleResolutionFunction.CHECK_DIRECT_DEPENDENCIES.set(
81-
getSkyframeExecutor().getDifferencerForTesting(), CheckDirectDepsMode.WARNING);
82-
BazelModuleResolutionFunction.BAZEL_COMPATIBILITY_MODE.set(
83-
getSkyframeExecutor().getDifferencerForTesting(), BazelCompatibilityMode.ERROR);
77+
return ImmutableList.of(
78+
PrecomputedValue.injected(
79+
ModuleFileFunction.REGISTRIES, ImmutableList.of(registry.getUrl())),
80+
PrecomputedValue.injected(ModuleFileFunction.IGNORE_DEV_DEPS, false),
81+
PrecomputedValue.injected(ModuleFileFunction.MODULE_OVERRIDES, ImmutableMap.of()),
82+
PrecomputedValue.injected(
83+
BazelModuleResolutionFunction.ALLOWED_YANKED_VERSIONS, ImmutableList.of()),
84+
PrecomputedValue.injected(
85+
BazelModuleResolutionFunction.CHECK_DIRECT_DEPENDENCIES, CheckDirectDepsMode.WARNING),
86+
PrecomputedValue.injected(
87+
BazelModuleResolutionFunction.BAZEL_COMPATIBILITY_MODE, BazelCompatibilityMode.ERROR));
8488
}
8589

8690
@Override

0 commit comments

Comments
 (0)