aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib/analysis/LocationExpander.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/analysis/LocationExpander.java')
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/LocationExpander.java28
1 files changed, 18 insertions, 10 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/LocationExpander.java b/src/main/java/com/google/devtools/build/lib/analysis/LocationExpander.java
index 40c77720ee..0a736a3f41 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/LocationExpander.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/LocationExpander.java
@@ -28,6 +28,7 @@ import com.google.devtools.build.lib.actions.Artifact;
import com.google.devtools.build.lib.analysis.configuredtargets.RuleConfiguredTarget.Mode;
import com.google.devtools.build.lib.cmdline.Label;
import com.google.devtools.build.lib.cmdline.LabelSyntaxException;
+import com.google.devtools.build.lib.cmdline.RepositoryName;
import com.google.devtools.build.lib.packages.BuildType;
import com.google.devtools.build.lib.packages.OutputFile;
import com.google.devtools.build.lib.packages.RuleErrorConsumer;
@@ -68,23 +69,25 @@ public final class LocationExpander {
private final RuleErrorConsumer ruleErrorConsumer;
private final ImmutableMap<String, LocationFunction> functions;
+ private final ImmutableMap<RepositoryName, RepositoryName> repositoryMapping;
@VisibleForTesting
LocationExpander(
RuleErrorConsumer ruleErrorConsumer,
- Map<String, LocationFunction> functions) {
+ Map<String, LocationFunction> functions,
+ ImmutableMap<RepositoryName, RepositoryName> repositoryMapping) {
this.ruleErrorConsumer = ruleErrorConsumer;
this.functions = ImmutableMap.copyOf(functions);
+ this.repositoryMapping = repositoryMapping;
}
private LocationExpander(
RuleErrorConsumer ruleErrorConsumer,
Label root,
Supplier<Map<Label, Collection<Artifact>>> locationMap,
- boolean execPaths) {
- this(
- ruleErrorConsumer,
- allLocationFunctions(root, locationMap, execPaths));
+ boolean execPaths,
+ ImmutableMap<RepositoryName, RepositoryName> repositoryMapping) {
+ this(ruleErrorConsumer, allLocationFunctions(root, locationMap, execPaths), repositoryMapping);
}
/**
@@ -108,7 +111,8 @@ public final class LocationExpander {
// Use a memoizing supplier to avoid eagerly building the location map.
Suppliers.memoize(
() -> LocationExpander.buildLocationMap(ruleContext, labelMap, allowData)),
- execPaths);
+ execPaths,
+ ruleContext.getRule().getPackage().getRepositoryMapping());
}
/**
@@ -209,7 +213,7 @@ public final class LocationExpander {
// (2) Call appropriate function to obtain string replacement.
String functionValue = value.substring(nextWhitespace + 1, end).trim();
try {
- String replacement = functions.get(fname).apply(functionValue);
+ String replacement = functions.get(fname).apply(functionValue, repositoryMapping);
result.append(replacement);
} catch (IllegalStateException ise) {
reporter.report(ise.getMessage());
@@ -243,15 +247,19 @@ public final class LocationExpander {
}
/**
- * Looks up the label-like string in the locationMap and returns the resolved path string.
+ * Looks up the label-like string in the locationMap and returns the resolved path string. If
+ * the label-like string begins with a repository name, the repository name may be remapped
+ * using the {@code repositoryMapping}.
*
* @param arg The label-like string to be expanded, e.g. ":foo" or "//foo:bar"
+ * @param repositoryMapping map of {@code RepositoryName}s defined in the main workspace
* @return The expanded value
*/
- public String apply(String arg) {
+ public String apply(
+ String arg, ImmutableMap<RepositoryName, RepositoryName> repositoryMapping) {
Label label;
try {
- label = root.getRelative(arg);
+ label = root.getRelativeWithRemapping(arg, repositoryMapping);
} catch (LabelSyntaxException e) {
throw new IllegalStateException(
String.format(