Skip to content

Commit 5426f16

Browse files
committed
Switch to BazelStarlarkContext
1 parent 2c03231 commit 5426f16

25 files changed

+114
-40
lines changed

src/main/java/com/google/devtools/build/lib/analysis/BazelRuleAnalysisThreadContext.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,8 @@
1414

1515
package com.google.devtools.build.lib.analysis;
1616

17+
import com.google.devtools.build.lib.cmdline.BazelStarlarkContext;
1718
import com.google.devtools.build.lib.cmdline.Label;
18-
import com.google.devtools.build.lib.packages.BazelStarlarkContext;
1919
import com.google.errorprone.annotations.CanIgnoreReturnValue;
2020
import javax.annotation.Nullable;
2121
import net.starlark.java.eval.EvalException;
@@ -33,7 +33,7 @@ public class BazelRuleAnalysisThreadContext extends BazelStarlarkContext {
3333
* @param ruleContext is the {@link RuleContext} of the rule for analysis of a rule or aspect
3434
*/
3535
public BazelRuleAnalysisThreadContext(RuleContext ruleContext) {
36-
super(Phase.ANALYSIS);
36+
super(Phase.ANALYSIS, ruleContext.getAnalysisEnvironment()::getMainRepoMapping);
3737
this.ruleContext = ruleContext;
3838
}
3939

src/main/java/com/google/devtools/build/lib/analysis/config/StarlarkDefinedConfigTransition.java

+3-3
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,8 @@
3737
import com.google.devtools.build.lib.cmdline.RepositoryMapping;
3838
import com.google.devtools.build.lib.events.Event;
3939
import com.google.devtools.build.lib.events.EventHandler;
40-
import com.google.devtools.build.lib.packages.BazelStarlarkContext;
41-
import com.google.devtools.build.lib.packages.BazelStarlarkContext.Phase;
40+
import com.google.devtools.build.lib.cmdline.BazelStarlarkContext;
41+
import com.google.devtools.build.lib.cmdline.BazelStarlarkContext.Phase;
4242
import com.google.devtools.build.lib.packages.Rule;
4343
import com.google.devtools.build.lib.packages.RuleTransitionData;
4444
import com.google.devtools.build.lib.packages.StructImpl;
@@ -552,7 +552,7 @@ public ImmutableMap<String, Map<String, Object>> evaluate(
552552
// Create a new {@link BazelStarlarkContext} for the new thread. We need to
553553
// create a new context every time because {@link BazelStarlarkContext}s
554554
// should be confined to a single thread.
555-
new BazelStarlarkContext(Phase.ANALYSIS).storeInThread(thread);
555+
new BazelStarlarkContext(Phase.ANALYSIS, /* mainRepoMapping= */ null).storeInThread(thread);
556556

557557
result =
558558
Starlark.fastcall(

src/main/java/com/google/devtools/build/lib/analysis/starlark/StarlarkRuleClassFunctions.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@
6464
import com.google.devtools.build.lib.packages.Attribute.StarlarkComputedDefaultTemplate;
6565
import com.google.devtools.build.lib.packages.AttributeTransitionData;
6666
import com.google.devtools.build.lib.packages.AttributeValueSource;
67-
import com.google.devtools.build.lib.packages.BazelStarlarkContext;
67+
import com.google.devtools.build.lib.cmdline.BazelStarlarkContext;
6868
import com.google.devtools.build.lib.packages.BuildSetting;
6969
import com.google.devtools.build.lib.packages.BuildType;
7070
import com.google.devtools.build.lib.packages.BuiltinRestriction;

src/main/java/com/google/devtools/build/lib/bazel/bzlmod/SingleExtensionEvalFunction.java

+22-4
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@
3434
import com.google.devtools.build.lib.bazel.repository.downloader.DownloadManager;
3535
import com.google.devtools.build.lib.bazel.repository.starlark.StarlarkRepositoryModule.RepositoryRuleFunction;
3636
import com.google.devtools.build.lib.cmdline.BazelModuleContext;
37+
import com.google.devtools.build.lib.cmdline.BazelStarlarkContext;
38+
import com.google.devtools.build.lib.cmdline.BazelStarlarkContext.Phase;
3739
import com.google.devtools.build.lib.cmdline.Label;
3840
import com.google.devtools.build.lib.cmdline.LabelConstants;
3941
import com.google.devtools.build.lib.cmdline.LabelSyntaxException;
@@ -132,6 +134,12 @@ public SkyValue compute(SkyKey skyKey, Environment env)
132134
if (starlarkSemantics == null) {
133135
return null;
134136
}
137+
RepositoryMappingValue mainRepoMappingValue =
138+
(RepositoryMappingValue)
139+
env.getValue(RepositoryMappingValue.KEY_FOR_ROOT_MODULE_WITHOUT_WORKSPACE_REPOS);
140+
if (mainRepoMappingValue == null) {
141+
return null;
142+
}
135143

136144
ModuleExtensionId extensionId = (ModuleExtensionId) skyKey.argument();
137145
SingleExtensionUsagesValue usagesValue =
@@ -182,7 +190,12 @@ public SkyValue compute(SkyKey skyKey, Environment env)
182190
// Run that extension!
183191
env.getListener().post(ModuleExtensionEvaluationProgress.ongoing(extensionId, "starting"));
184192
RunModuleExtensionResult moduleExtensionResult =
185-
extension.run(env, usagesValue, starlarkSemantics, extensionId);
193+
extension.run(
194+
env,
195+
usagesValue,
196+
starlarkSemantics,
197+
extensionId,
198+
mainRepoMappingValue.getRepositoryMapping());
186199
if (moduleExtensionResult == null) {
187200
return null;
188201
}
@@ -525,7 +538,8 @@ RunModuleExtensionResult run(
525538
Environment env,
526539
SingleExtensionUsagesValue usagesValue,
527540
StarlarkSemantics starlarkSemantics,
528-
ModuleExtensionId extensionId)
541+
ModuleExtensionId extensionId,
542+
RepositoryMapping repositoryMapping)
529543
throws InterruptedException, SingleExtensionEvalFunctionException;
530544
}
531545

@@ -677,7 +691,8 @@ public RunModuleExtensionResult run(
677691
Environment env,
678692
SingleExtensionUsagesValue usagesValue,
679693
StarlarkSemantics starlarkSemantics,
680-
ModuleExtensionId extensionId)
694+
ModuleExtensionId extensionId,
695+
RepositoryMapping mainRepositoryMapping)
681696
throws InterruptedException, SingleExtensionEvalFunctionException {
682697
var generatedRepoSpecs = ImmutableMap.<String, RepoSpec>builderWithExpectedSize(repos.size());
683698
// Instantiate the repos one by one.
@@ -846,7 +861,8 @@ public RunModuleExtensionResult run(
846861
Environment env,
847862
SingleExtensionUsagesValue usagesValue,
848863
StarlarkSemantics starlarkSemantics,
849-
ModuleExtensionId extensionId)
864+
ModuleExtensionId extensionId,
865+
RepositoryMapping mainRepositoryMapping)
850866
throws InterruptedException, SingleExtensionEvalFunctionException {
851867
ModuleExtensionEvalStarlarkThreadContext threadContext =
852868
new ModuleExtensionEvalStarlarkThreadContext(
@@ -870,6 +886,8 @@ public RunModuleExtensionResult run(
870886
thread.setPrintHandler(Event.makeDebugPrintHandler(env.getListener()));
871887
moduleContext = createContext(env, usagesValue, starlarkSemantics, extensionId);
872888
threadContext.storeInThread(thread);
889+
new BazelStarlarkContext(Phase.WORKSPACE, () -> mainRepositoryMapping)
890+
.storeInThread(thread);
873891
// This is used by the `Label()` constructor in Starlark, to record any attempts to resolve
874892
// apparent repo names to canonical repo names. See #20721 for why this is necessary.
875893
thread.setThreadLocal(Label.RepoMappingRecorder.class, repoMappingRecorder);

src/main/java/com/google/devtools/build/lib/bazel/repository/starlark/BUILD

+1
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ java_library(
4646
"//src/main/java/com/google/devtools/build/lib/skyframe:directory_tree_digest_value",
4747
"//src/main/java/com/google/devtools/build/lib/skyframe:ignored_package_prefixes_value",
4848
"//src/main/java/com/google/devtools/build/lib/skyframe:precomputed_value",
49+
"//src/main/java/com/google/devtools/build/lib/skyframe:repository_mapping_value",
4950
"//src/main/java/com/google/devtools/build/lib/starlarkbuildapi/repository",
5051
"//src/main/java/com/google/devtools/build/lib/util",
5152
"//src/main/java/com/google/devtools/build/lib/util:string",

src/main/java/com/google/devtools/build/lib/bazel/repository/starlark/StarlarkRepositoryFunction.java

+19-2
Original file line numberDiff line numberDiff line change
@@ -25,11 +25,12 @@
2525
import com.google.devtools.build.lib.analysis.RuleDefinition;
2626
import com.google.devtools.build.lib.bazel.repository.RepositoryResolvedEvent;
2727
import com.google.devtools.build.lib.bazel.repository.downloader.DownloadManager;
28+
import com.google.devtools.build.lib.cmdline.BazelStarlarkContext;
2829
import com.google.devtools.build.lib.cmdline.Label;
2930
import com.google.devtools.build.lib.cmdline.LabelConstants;
31+
import com.google.devtools.build.lib.cmdline.RepositoryMapping;
3032
import com.google.devtools.build.lib.cmdline.RepositoryName;
3133
import com.google.devtools.build.lib.events.Event;
32-
import com.google.devtools.build.lib.packages.BazelStarlarkContext;
3334
import com.google.devtools.build.lib.packages.Rule;
3435
import com.google.devtools.build.lib.packages.semantics.BuildLanguageOptions;
3536
import com.google.devtools.build.lib.pkgcache.PathPackageLocator;
@@ -46,6 +47,7 @@
4647
import com.google.devtools.build.lib.runtime.RepositoryRemoteExecutor;
4748
import com.google.devtools.build.lib.skyframe.IgnoredPackagePrefixesValue;
4849
import com.google.devtools.build.lib.skyframe.PrecomputedValue;
50+
import com.google.devtools.build.lib.skyframe.RepositoryMappingValue;
4951
import com.google.devtools.build.lib.vfs.FileSystemUtils;
5052
import com.google.devtools.build.lib.vfs.Path;
5153
import com.google.devtools.build.lib.vfs.PathFragment;
@@ -242,6 +244,20 @@ private RepositoryDirectoryValue.Builder fetchInternal(
242244
return null;
243245
}
244246

247+
boolean enableBzlmod = starlarkSemantics.getBool(BuildLanguageOptions.ENABLE_BZLMOD);
248+
RepositoryMapping mainRepoMapping;
249+
if (enableBzlmod || !isWorkspaceRepo(rule)) {
250+
var mainRepoMappingValue =
251+
(RepositoryMappingValue)
252+
env.getValue(RepositoryMappingValue.KEY_FOR_ROOT_MODULE_WITHOUT_WORKSPACE_REPOS);
253+
if (mainRepoMappingValue == null) {
254+
return null;
255+
}
256+
mainRepoMapping = mainRepoMappingValue.getRepositoryMapping();
257+
} else {
258+
mainRepoMapping = rule.getPackage().getRepositoryMapping();
259+
}
260+
245261
IgnoredPackagePrefixesValue ignoredPackagesValue =
246262
(IgnoredPackagePrefixesValue) env.getValue(IgnoredPackagePrefixesValue.key());
247263
if (env.valuesMissing()) {
@@ -264,7 +280,8 @@ private RepositoryDirectoryValue.Builder fetchInternal(
264280
thread.setThreadLocal(Label.RepoMappingRecorder.class, repoMappingRecorder);
265281
}
266282

267-
new BazelStarlarkContext(BazelStarlarkContext.Phase.LOADING).storeInThread(thread); // "fetch"
283+
new BazelStarlarkContext(BazelStarlarkContext.Phase.LOADING, () -> mainRepoMapping)
284+
.storeInThread(thread); // "fetch"
268285

269286
StarlarkRepositoryContext starlarkRepositoryContext =
270287
new StarlarkRepositoryContext(

src/main/java/com/google/devtools/build/lib/bazel/repository/starlark/StarlarkRepositoryModule.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@
3333
import com.google.devtools.build.lib.events.EventHandler;
3434
import com.google.devtools.build.lib.packages.Attribute;
3535
import com.google.devtools.build.lib.packages.AttributeValueSource;
36-
import com.google.devtools.build.lib.packages.BazelStarlarkContext;
36+
import com.google.devtools.build.lib.cmdline.BazelStarlarkContext;
3737
import com.google.devtools.build.lib.packages.BzlInitThreadContext;
3838
import com.google.devtools.build.lib.packages.Package;
3939
import com.google.devtools.build.lib.packages.RuleClass;

src/main/java/com/google/devtools/build/lib/cmdline/BUILD

+1
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ java_library(
1717
srcs = [
1818
"BazelCompileContext.java",
1919
"BazelModuleContext.java",
20+
"BazelStarlarkContext.java",
2021
"Label.java",
2122
"LabelCodec.java",
2223
"LabelConstants.java",

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

+1-9
Original file line numberDiff line numberDiff line change
@@ -44,13 +44,6 @@ public abstract class BazelModuleContext {
4444
/** The repository mapping applicable to the repo where the .bzl file is located in. */
4545
public abstract RepositoryMapping repoMapping();
4646

47-
/**
48-
* The repository mapping applicable to the main repository. This is purely meant to support
49-
* {@link Label#debugPrint}.
50-
*/
51-
@Nullable
52-
public abstract RepositoryMapping mainRepoMapping();
53-
5447
/** Returns the name of the module's .bzl file, as provided to the parser. */
5548
public abstract String filename();
5649

@@ -167,12 +160,11 @@ public static BazelModuleContext ofInnermostBzlOrFail(StarlarkThread thread, Str
167160
public static BazelModuleContext create(
168161
Label label,
169162
RepositoryMapping repoMapping,
170-
@Nullable RepositoryMapping mainRepoMapping,
171163
String filename,
172164
ImmutableList<Module> loads,
173165
byte[] bzlTransitiveDigest) {
174166
return new AutoValue_BazelModuleContext(
175-
label, repoMapping, mainRepoMapping, filename, loads, bzlTransitiveDigest);
167+
label, repoMapping, filename, loads, bzlTransitiveDigest);
176168
}
177169

178170
public final Label.PackageContext packageContext() {

src/main/java/com/google/devtools/build/lib/packages/BazelStarlarkContext.java src/main/java/com/google/devtools/build/lib/cmdline/BazelStarlarkContext.java

+16-2
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,11 @@
1111
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1212
// See the License for the specific language governing permissions and
1313
// limitations under the License.
14-
package com.google.devtools.build.lib.packages;
14+
package com.google.devtools.build.lib.cmdline;
1515

1616
import com.google.common.base.Preconditions;
17+
import com.google.devtools.build.lib.supplier.InterruptibleSupplier;
18+
import javax.annotation.Nullable;
1719
import net.starlark.java.eval.EvalException;
1820
import net.starlark.java.eval.Starlark;
1921
import net.starlark.java.eval.StarlarkThread;
@@ -94,19 +96,31 @@ public void storeInThread(StarlarkThread thread) {
9496

9597
// TODO(b/236456122): Eliminate Phase, migrate analysisRuleLabel to a separate context class.
9698
private final Phase phase;
99+
@Nullable private final InterruptibleSupplier<RepositoryMapping> mainRepoMappingSupplier;
97100

98101
/**
99102
* @param phase the phase to which this Starlark thread belongs
100103
*/
101-
public BazelStarlarkContext(Phase phase) {
104+
public BazelStarlarkContext(
105+
Phase phase, @Nullable InterruptibleSupplier<RepositoryMapping> mainRepoMappingSupplier) {
102106
this.phase = Preconditions.checkNotNull(phase);
107+
this.mainRepoMappingSupplier = mainRepoMappingSupplier;
103108
}
104109

105110
/** Returns the phase associated with this context. */
106111
public Phase getPhase() {
107112
return phase;
108113
}
109114

115+
/**
116+
* The repository mapping applicable to the main repository. This is purely meant to support
117+
* {@link Label#debugPrint}.
118+
*/
119+
@Nullable
120+
public RepositoryMapping getMainRepoMapping() throws InterruptedException {
121+
return mainRepoMappingSupplier == null ? null : mainRepoMappingSupplier.get();
122+
}
123+
110124
@Override
111125
public String getContextForUncheckedException() {
112126
return phase.toString();

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

+7-1
Original file line numberDiff line numberDiff line change
@@ -661,7 +661,13 @@ public void repr(Printer printer) {
661661

662662
@Override
663663
public void debugPrint(Printer printer, StarlarkThread thread) {
664-
printer.append(getDisplayForm(BazelModuleContext.ofInnermostBzlOrThrow(thread).mainRepoMapping()));
664+
RepositoryMapping mainRepoMapping;
665+
try {
666+
mainRepoMapping = BazelStarlarkContext.fromOrFail(thread).getMainRepoMapping();
667+
} catch (EvalException | InterruptedException e) {
668+
mainRepoMapping = null;
669+
}
670+
printer.append(getDisplayForm(mainRepoMapping));
665671
}
666672

667673
@Override

src/main/java/com/google/devtools/build/lib/packages/BuildGlobals.java

+1
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515

1616
import com.google.devtools.build.docgen.annot.GlobalMethods;
1717
import com.google.devtools.build.docgen.annot.GlobalMethods.Environment;
18+
import com.google.devtools.build.lib.cmdline.BazelStarlarkContext;
1819
import com.google.devtools.build.lib.cmdline.Label;
1920
import com.google.devtools.build.lib.cmdline.LabelSyntaxException;
2021
import com.google.devtools.build.lib.packages.TargetDefinitionContext.NameConflictException;

src/main/java/com/google/devtools/build/lib/packages/BzlInitThreadContext.java

+6-3
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,9 @@
1616

1717
import com.google.common.collect.ImmutableMap;
1818
import com.google.devtools.build.lib.analysis.RuleDefinitionEnvironment;
19+
import com.google.devtools.build.lib.cmdline.BazelStarlarkContext;
1920
import com.google.devtools.build.lib.cmdline.Label;
21+
import com.google.devtools.build.lib.cmdline.RepositoryMapping;
2022
import com.google.devtools.build.lib.cmdline.RepositoryName;
2123
import com.google.errorprone.annotations.CanIgnoreReturnValue;
2224
import java.util.Optional;
@@ -57,15 +59,16 @@ public final class BzlInitThreadContext extends BazelStarlarkContext
5759
* @param networkAllowlistForTests an allowlist for rule classes created by this thread
5860
* @param fragmentNameToClass a map from configuration fragment name to configuration fragment
5961
* class, such as "apple" to AppleConfiguration.class
60-
* @param symbolGenerator symbol generator for this context
62+
* @param mainRepoMapping the repository mapping of the main repository
6163
*/
6264
public BzlInitThreadContext(
6365
Label bzlFile,
6466
byte[] transitiveDigest,
6567
RepositoryName toolsRepository,
6668
Optional<Label> networkAllowlistForTests,
67-
ImmutableMap<String, Class<?>> fragmentNameToClass) {
68-
super(BazelStarlarkContext.Phase.LOADING);
69+
ImmutableMap<String, Class<?>> fragmentNameToClass,
70+
RepositoryMapping mainRepoMapping) {
71+
super(BazelStarlarkContext.Phase.LOADING, () -> mainRepoMapping);
6972
this.bzlFile = bzlFile;
7073
this.transitiveDigest = transitiveDigest;
7174
this.toolsRepository = toolsRepository;

src/main/java/com/google/devtools/build/lib/packages/Package.java

+8-2
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
import com.google.devtools.build.lib.bugreport.BugReport;
3030
import com.google.devtools.build.lib.cmdline.BazelModuleContext;
3131
import com.google.devtools.build.lib.cmdline.BazelModuleContext.LoadGraphVisitor;
32+
import com.google.devtools.build.lib.cmdline.BazelStarlarkContext;
3233
import com.google.devtools.build.lib.cmdline.Label;
3334
import com.google.devtools.build.lib.cmdline.LabelConstants;
3435
import com.google.devtools.build.lib.cmdline.LabelSyntaxException;
@@ -758,6 +759,7 @@ public static Builder newPackageBuilder(
758759
Optional<String> associatedModuleVersion,
759760
boolean noImplicitFileExport,
760761
RepositoryMapping repositoryMapping,
762+
RepositoryMapping mainRepositoryMapping,
761763
@Nullable Semaphore cpuBoundSemaphore,
762764
PackageOverheadEstimator packageOverheadEstimator,
763765
@Nullable ImmutableMap<Location, String> generatorMap,
@@ -775,6 +777,7 @@ public static Builder newPackageBuilder(
775777
associatedModuleVersion,
776778
noImplicitFileExport,
777779
repositoryMapping,
780+
mainRepositoryMapping,
778781
cpuBoundSemaphore,
779782
packageOverheadEstimator,
780783
generatorMap,
@@ -802,6 +805,7 @@ public static Builder newExternalPackageBuilder(
802805
/* associatedModuleVersion= */ Optional.empty(),
803806
noImplicitFileExport,
804807
/* repositoryMapping= */ mainRepoMapping,
808+
/* mainRepositoryMapping= */ mainRepoMapping,
805809
/* cpuBoundSemaphore= */ null,
806810
packageOverheadEstimator,
807811
/* generatorMap= */ null,
@@ -825,6 +829,7 @@ public static Builder newExternalPackageBuilderForBzlmod(
825829
/* associatedModuleVersion= */ Optional.empty(),
826830
noImplicitFileExport,
827831
repoMapping,
832+
/* mainRepoMapping= */ null,
828833
/* cpuBoundSemaphore= */ null,
829834
PackageOverheadEstimator.NOOP_ESTIMATOR,
830835
/* generatorMap= */ null,
@@ -1062,7 +1067,7 @@ public T intern(T sample) {
10621067
private boolean alreadyBuilt = false;
10631068

10641069
private Builder(
1065-
BazelStarlarkContext.Phase phase,
1070+
Phase phase,
10661071
SymbolGenerator<?> symbolGenerator,
10671072
PackageSettings packageSettings,
10681073
PackageIdentifier id,
@@ -1072,14 +1077,15 @@ private Builder(
10721077
Optional<String> associatedModuleVersion,
10731078
boolean noImplicitFileExport,
10741079
RepositoryMapping repositoryMapping,
1080+
@Nullable RepositoryMapping mainRepositoryMapping,
10751081
@Nullable Semaphore cpuBoundSemaphore,
10761082
PackageOverheadEstimator packageOverheadEstimator,
10771083
@Nullable ImmutableMap<Location, String> generatorMap,
10781084
// TODO(bazel-team): Config policy is an enum, what is null supposed to mean?
10791085
// Maybe convert null -> LEGACY_OFF, assuming that's the correct default.
10801086
@Nullable ConfigSettingVisibilityPolicy configSettingVisibilityPolicy,
10811087
@Nullable Globber globber) {
1082-
super(phase);
1088+
super(phase, mainRepositoryMapping);
10831089
this.symbolGenerator = symbolGenerator;
10841090

10851091
Metadata metadata = new Metadata();

0 commit comments

Comments
 (0)