diff --git a/src/main/java/com/google/devtools/build/lib/bazel/bzlmod/BzlmodRepoRuleCreator.java b/src/main/java/com/google/devtools/build/lib/bazel/bzlmod/BzlmodRepoRuleCreator.java index 6ea74d68a11d29..a6495ef9a276c9 100644 --- a/src/main/java/com/google/devtools/build/lib/bazel/bzlmod/BzlmodRepoRuleCreator.java +++ b/src/main/java/com/google/devtools/build/lib/bazel/bzlmod/BzlmodRepoRuleCreator.java @@ -17,6 +17,7 @@ import com.google.common.collect.ImmutableList; import com.google.devtools.build.lib.analysis.BlazeDirectories; import com.google.devtools.build.lib.cmdline.LabelConstants; +import com.google.devtools.build.lib.cmdline.RepositoryMapping; import com.google.devtools.build.lib.events.ExtendedEventHandler; import com.google.devtools.build.lib.packages.NoSuchPackageException; import com.google.devtools.build.lib.packages.Package; @@ -62,6 +63,7 @@ public static Rule createRule( Root.fromPath(directories.getWorkspace()), LabelConstants.MODULE_DOT_BAZEL_FILE_NAME), "dummy_name", + RepositoryMapping.ALWAYS_FALLBACK, semantics); BuildLangTypedAttributeValuesMap attributeValues = new BuildLangTypedAttributeValuesMap(attributes); diff --git a/src/main/java/com/google/devtools/build/lib/packages/Package.java b/src/main/java/com/google/devtools/build/lib/packages/Package.java index 4682436f3d0420..aca053d7406a9c 100644 --- a/src/main/java/com/google/devtools/build/lib/packages/Package.java +++ b/src/main/java/com/google/devtools/build/lib/packages/Package.java @@ -843,13 +843,14 @@ public static Builder newExternalPackageBuilder( PackageSettings helper, RootedPath workspacePath, String workspaceName, + RepositoryMapping mainRepoMapping, StarlarkSemantics starlarkSemantics) { return new Builder( helper, LabelConstants.EXTERNAL_PACKAGE_IDENTIFIER, workspaceName, starlarkSemantics.getBool(BuildLanguageOptions.INCOMPATIBLE_NO_IMPLICIT_FILE_EXPORT), - RepositoryMapping.ALWAYS_FALLBACK) + mainRepoMapping) .setFilename(workspacePath); } diff --git a/src/main/java/com/google/devtools/build/lib/packages/PackageFactory.java b/src/main/java/com/google/devtools/build/lib/packages/PackageFactory.java index a1a9746b54a19a..98ff211aa5a440 100644 --- a/src/main/java/com/google/devtools/build/lib/packages/PackageFactory.java +++ b/src/main/java/com/google/devtools/build/lib/packages/PackageFactory.java @@ -445,9 +445,12 @@ public boolean isImmutable() { @VisibleForTesting // exposed to WorkspaceFileFunction and BzlmodRepoRuleFunction public Package.Builder newExternalPackageBuilder( - RootedPath workspacePath, String workspaceName, StarlarkSemantics starlarkSemantics) { + RootedPath workspacePath, + String workspaceName, + RepositoryMapping mainRepoMapping, + StarlarkSemantics starlarkSemantics) { return Package.newExternalPackageBuilder( - packageSettings, workspacePath, workspaceName, starlarkSemantics); + packageSettings, workspacePath, workspaceName, mainRepoMapping, starlarkSemantics); } // This function is public only for the benefit of skyframe.PackageFunction, diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceFileFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceFileFunction.java index 3ea17ab4e7f0ec..09f86788be567b 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceFileFunction.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceFileFunction.java @@ -30,6 +30,7 @@ import com.google.devtools.build.lib.cmdline.LabelConstants; import com.google.devtools.build.lib.cmdline.PackageIdentifier; import com.google.devtools.build.lib.cmdline.RepositoryMapping; +import com.google.devtools.build.lib.cmdline.RepositoryName; import com.google.devtools.build.lib.events.Event; import com.google.devtools.build.lib.events.ExtendedEventHandler.Postable; import com.google.devtools.build.lib.packages.BuildFileContainsErrorsException; @@ -238,9 +239,33 @@ public SkyValue compute(SkyKey skyKey, Environment env) // -- start of historical WorkspaceFileFunction -- // TODO(adonovan): reorganize and simplify. + // Get the state at the end of the previous chunk. + WorkspaceFileValue prevValue = null; + if (key.getIndex() > 0) { + prevValue = + (WorkspaceFileValue) + env.getValue(WorkspaceFileValue.key(workspaceFile, key.getIndex() - 1)); + if (prevValue == null) { + return null; + } + if (prevValue.next() == null) { + return prevValue; + } + } + RepositoryMapping repoMapping; + if (prevValue == null) { + repoMapping = RepositoryMapping.ALWAYS_FALLBACK; + } else { + repoMapping = + RepositoryMapping.createAllowingFallback( + prevValue + .getRepositoryMapping() + .getOrDefault(RepositoryName.MAIN, ImmutableMap.of())); + } + Package.Builder builder = packageFactory.newExternalPackageBuilder( - workspaceFile, ruleClassProvider.getRunfilesPrefix(), starlarkSemantics); + workspaceFile, ruleClassProvider.getRunfilesPrefix(), repoMapping, starlarkSemantics); if (chunks.isEmpty()) { return new WorkspaceFileValue( @@ -254,28 +279,13 @@ public SkyValue compute(SkyKey skyKey, Environment env) ImmutableMap.of()); } - // Get the state at the end of the previous chunk. - WorkspaceFileValue prevValue = null; - if (key.getIndex() > 0) { - prevValue = - (WorkspaceFileValue) - env.getValue(WorkspaceFileValue.key(workspaceFile, key.getIndex() - 1)); - if (prevValue == null) { - return null; - } - if (prevValue.next() == null) { - return prevValue; - } - } - List chunk = chunks.get(key.getIndex()); // Parse the labels in the chunk's load statements. ImmutableList> programLoads = BzlLoadFunction.getLoadsFromStarlarkFiles(chunk); ImmutableList