From ebf601d340c570d2666a1293a144975938a063f2 Mon Sep 17 00:00:00 2001 From: Andrew Pellegrini Date: Wed, 20 Jul 2016 17:47:49 +0000 Subject: Add target names for mergee manifests to generate more helpful error messages from manifest merging when using manifest_merger="android" on android_binary rules. -- MOS_MIGRATED_REVID=127962630 --- .../lib/rules/android/ApplicationManifest.java | 19 ++++----- .../rules/android/ManifestMergerActionBuilder.java | 45 ++++++++++++++++++---- 2 files changed, 47 insertions(+), 17 deletions(-) (limited to 'src/main/java/com/google/devtools') diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/ApplicationManifest.java b/src/main/java/com/google/devtools/build/lib/rules/android/ApplicationManifest.java index 8992776ec2..1511af5b5e 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/ApplicationManifest.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/ApplicationManifest.java @@ -19,7 +19,7 @@ import static com.google.devtools.build.lib.syntax.Type.STRING; import com.google.common.base.Joiner; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; -import com.google.common.collect.ImmutableSortedSet; +import com.google.common.collect.ImmutableSortedMap; import com.google.common.collect.Iterables; import com.google.common.collect.Lists; import com.google.devtools.build.lib.actions.Artifact; @@ -30,6 +30,7 @@ import com.google.devtools.build.lib.analysis.TransitiveInfoCollection; import com.google.devtools.build.lib.analysis.actions.FileWriteAction; import com.google.devtools.build.lib.analysis.actions.SpawnAction; import com.google.devtools.build.lib.analysis.config.CompilationMode; +import com.google.devtools.build.lib.cmdline.Label; import com.google.devtools.build.lib.rules.android.AndroidConfiguration.AndroidManifestMerger; import com.google.devtools.build.lib.rules.android.AndroidResourcesProvider.ResourceContainer; import com.google.devtools.build.lib.rules.android.AndroidResourcesProvider.ResourceType; @@ -202,7 +203,7 @@ public final class ApplicationManifest { } public ApplicationManifest mergeWith(RuleContext ruleContext, ResourceDependencies resourceDeps) { - Iterable mergeeManifests = getMergeeManifests(resourceDeps.getResources()); + Map mergeeManifests = getMergeeManifests(resourceDeps.getResources()); boolean legacy = true; if (ruleContext.isLegalFragment(AndroidConfiguration.class) @@ -216,16 +217,16 @@ public final class ApplicationManifest { } if (legacy) { - if (!Iterables.isEmpty(mergeeManifests)) { + if (!mergeeManifests.isEmpty()) { Artifact outputManifest = ruleContext.getUniqueDirectoryArtifact( ruleContext.getRule().getName() + "_merged", "AndroidManifest.xml", ruleContext.getBinOrGenfilesDirectory()); AndroidManifestMergeHelper.createMergeManifestAction(ruleContext, getManifest(), - mergeeManifests, ImmutableList.of("all"), outputManifest); + mergeeManifests.keySet(), ImmutableList.of("all"), outputManifest); return new ApplicationManifest(ruleContext, outputManifest); } } else { - if (!Iterables.isEmpty(mergeeManifests) || !manifestValues.isEmpty()) { + if (!mergeeManifests.isEmpty() || !manifestValues.isEmpty()) { Artifact outputManifest = ruleContext.getUniqueDirectoryArtifact( ruleContext.getRule().getName() + "_merged", "AndroidManifest.xml", ruleContext.getBinOrGenfilesDirectory()); @@ -243,13 +244,13 @@ public final class ApplicationManifest { return this; } - private static Iterable getMergeeManifests( + private static Map getMergeeManifests( Iterable resourceContainers) { - ImmutableSortedSet.Builder builder = - ImmutableSortedSet.orderedBy(Artifact.EXEC_PATH_COMPARATOR); + ImmutableSortedMap.Builder builder = + ImmutableSortedMap.orderedBy(Artifact.EXEC_PATH_COMPARATOR); for (ResourceContainer r : resourceContainers) { if (r.isManifestExported()) { - builder.add(r.getManifest()); + builder.put(r.getManifest(), r.getLabel()); } } return builder.build(); diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/ManifestMergerActionBuilder.java b/src/main/java/com/google/devtools/build/lib/rules/android/ManifestMergerActionBuilder.java index 21174401a0..4d480579df 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/ManifestMergerActionBuilder.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/ManifestMergerActionBuilder.java @@ -13,17 +13,20 @@ // limitations under the License. package com.google.devtools.build.lib.rules.android; +import com.google.common.base.Function; +import com.google.common.base.Functions; import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableMap; import com.google.devtools.build.lib.actions.Artifact; import com.google.devtools.build.lib.analysis.RuleConfiguredTarget.Mode; import com.google.devtools.build.lib.analysis.RuleContext; import com.google.devtools.build.lib.analysis.actions.ActionConstructionContext; import com.google.devtools.build.lib.analysis.actions.CustomCommandLine; import com.google.devtools.build.lib.analysis.actions.SpawnAction; +import com.google.devtools.build.lib.cmdline.Label; import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder; import java.util.Iterator; -import java.util.List; import java.util.Map; import java.util.Map.Entry; @@ -35,7 +38,7 @@ public class ManifestMergerActionBuilder { private final SpawnAction.Builder spawnActionBuilder; private Artifact manifest; - private List mergeeManifests; + private Map mergeeManifests; private boolean isLibrary; private Map manifestValues; private String customPackage; @@ -51,8 +54,8 @@ public class ManifestMergerActionBuilder { return this; } - public ManifestMergerActionBuilder setMergeeManifests(Iterable mergeeManifests) { - this.mergeeManifests = ImmutableList.copyOf(mergeeManifests); + public ManifestMergerActionBuilder setMergeeManifests(Map mergeeManifests) { + this.mergeeManifests = ImmutableMap.copyOf(mergeeManifests); return this; } @@ -89,8 +92,15 @@ public class ManifestMergerActionBuilder { inputs.add(manifest); if (mergeeManifests != null && !mergeeManifests.isEmpty()) { - builder.addJoinExecPaths("--mergeeManifests", ":", mergeeManifests); - inputs.addAll(mergeeManifests); + builder.add("--mergeeManifests") + .add(mapToDictionaryString(mergeeManifests, + new Function() { + @Override public String apply(Artifact input) { + return input.getExecPathString(); + } + }, + null /* valueConverter */)); + inputs.addAll(mergeeManifests.keySet()); } if (isLibrary) { @@ -120,14 +130,33 @@ public class ManifestMergerActionBuilder { .build(context)); } + private static final Function ESCAPER = new Function() { + @Override public String apply(String value) { + return value.replace(":", "\\:").replace(",", "\\,"); + } + }; + private String mapToDictionaryString(Map map) { + return mapToDictionaryString(map, Functions.toStringFunction(), Functions.toStringFunction()); + } + + private String mapToDictionaryString(Map map, + Function keyConverter, + Function valueConverter) { + if (keyConverter == null) { + keyConverter = Functions.toStringFunction(); + } + if (valueConverter == null) { + valueConverter = Functions.toStringFunction(); + } + StringBuilder sb = new StringBuilder(); Iterator> iter = map.entrySet().iterator(); while (iter.hasNext()) { Entry entry = iter.next(); - sb.append(entry.getKey().toString().replace(":", "\\:").replace(",", "\\,")); + sb.append(Functions.compose(ESCAPER, keyConverter).apply(entry.getKey())); sb.append(':'); - sb.append(entry.getValue().toString().replace(":", "\\:").replace(",", "\\,")); + sb.append(Functions.compose(ESCAPER, valueConverter).apply(entry.getValue())); if (iter.hasNext()) { sb.append(','); } -- cgit v1.2.3