diff options
author | Googler <noreply@google.com> | 2017-05-24 22:20:45 +0200 |
---|---|---|
committer | Irina Iancu <elenairina@google.com> | 2017-05-26 09:36:15 +0200 |
commit | d0e58c4790f499afa5d1fcafb2f9e4c3f47b3ca0 (patch) | |
tree | 15af629799daa35970627d59fe138a7b17e17e58 /src | |
parent | 721ea3e46922df63205e0ba87e49a50449e2f78b (diff) |
Automated g4 rollback of commit e2edf2e141a09c025a958d580c7cac7b57c70d83.
*** Reason for rollback ***
Rollforward with fix.
*** Original change description ***
Automated g4 rollback of commit c78c947e6a8cbb323304f872a3dcabb989a3d76b.
*** Reason for rollback ***
Breaks android targets in the nightly - see []
*** Original change description ***
Do not retain transitive data in AndroidLocalTestBase...
***
ROLLBACK_OF=156745610
RELNOTES: None
PiperOrigin-RevId: 157028029
Diffstat (limited to 'src')
10 files changed, 178 insertions, 111 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/RunfilesSupport.java b/src/main/java/com/google/devtools/build/lib/analysis/RunfilesSupport.java index e53fc3efbd..549204bd3f 100644 --- a/src/main/java/com/google/devtools/build/lib/analysis/RunfilesSupport.java +++ b/src/main/java/com/google/devtools/build/lib/analysis/RunfilesSupport.java @@ -20,6 +20,8 @@ import com.google.devtools.build.lib.actions.Artifact; import com.google.devtools.build.lib.analysis.RuleConfiguredTarget.Mode; import com.google.devtools.build.lib.analysis.SourceManifestAction.ManifestType; import com.google.devtools.build.lib.analysis.actions.ActionConstructionContext; +import com.google.devtools.build.lib.analysis.actions.CommandLine; +import com.google.devtools.build.lib.analysis.actions.CustomCommandLine; import com.google.devtools.build.lib.analysis.actions.SymlinkTreeAction; import com.google.devtools.build.lib.analysis.config.BuildConfiguration; import com.google.devtools.build.lib.analysis.config.RunUnder; @@ -76,19 +78,23 @@ public final class RunfilesSupport { private final Artifact sourcesManifest; private final Artifact owningExecutable; private final boolean createSymlinks; - private final ImmutableList<String> args; + private final CommandLine args; /** * Creates the RunfilesSupport helper with the given executable and runfiles. * * @param ruleContext the rule context to create the runfiles support for * @param executable the executable for whose runfiles this runfiles support is responsible, may - * be null + * be null * @param runfiles the runfiles * @param appendingArgs to be added after the rule's args */ - private RunfilesSupport(RuleContext ruleContext, Artifact executable, Runfiles runfiles, - List<String> appendingArgs, boolean createSymlinks) { + private RunfilesSupport( + RuleContext ruleContext, + Artifact executable, + Runfiles runfiles, + CommandLine appendingArgs, + boolean createSymlinks) { owningExecutable = Preconditions.checkNotNull(executable); this.createSymlinks = createSymlinks; @@ -121,10 +127,8 @@ public final class RunfilesSupport { ruleContext, artifactsMiddleman, runfilesManifest); sourcesManifest = createSourceManifest(ruleContext, runfiles); - args = ImmutableList.<String>builder() - .addAll(ruleContext.getTokenizedStringListAttr("args")) - .addAll(appendingArgs) - .build(); + ImmutableList<String> args = ruleContext.getTokenizedStringListAttr("args"); + this.args = CommandLine.concat(args, appendingArgs); } /** @@ -356,11 +360,8 @@ public final class RunfilesSupport { } } - /** - * Returns the unmodifiable list of expanded and tokenized 'args' attribute - * values. - */ - public List<String> getArgs() { + /** Returns the unmodifiable list of expanded and tokenized 'args' attribute values. */ + public CommandLine getArgs() { return args; } @@ -370,7 +371,11 @@ public final class RunfilesSupport { */ public static RunfilesSupport withExecutable(RuleContext ruleContext, Runfiles runfiles, Artifact executable) { - return new RunfilesSupport(ruleContext, executable, runfiles, ImmutableList.<String>of(), + return new RunfilesSupport( + ruleContext, + executable, + runfiles, + CommandLine.EMPTY, ruleContext.shouldCreateRunfilesSymlinks()); } @@ -380,8 +385,8 @@ public final class RunfilesSupport { */ public static RunfilesSupport withExecutable(RuleContext ruleContext, Runfiles runfiles, Artifact executable, boolean createSymlinks) { - return new RunfilesSupport(ruleContext, executable, runfiles, ImmutableList.<String>of(), - createSymlinks); + return new RunfilesSupport( + ruleContext, executable, runfiles, CommandLine.EMPTY, createSymlinks); } /** @@ -389,7 +394,24 @@ public final class RunfilesSupport { */ public static RunfilesSupport withExecutable(RuleContext ruleContext, Runfiles runfiles, Artifact executable, List<String> appendingArgs) { - return new RunfilesSupport(ruleContext, executable, runfiles, - ImmutableList.copyOf(appendingArgs), ruleContext.shouldCreateRunfilesSymlinks()); + return new RunfilesSupport( + ruleContext, + executable, + runfiles, + CustomCommandLine.builder().add(appendingArgs).build(), + ruleContext.shouldCreateRunfilesSymlinks()); + } + + /** + * Creates and returns a RunfilesSupport object for the given rule, executable, runfiles and args. + */ + public static RunfilesSupport withExecutable( + RuleContext ruleContext, Runfiles runfiles, Artifact executable, CommandLine appendingArgs) { + return new RunfilesSupport( + ruleContext, + executable, + runfiles, + appendingArgs, + ruleContext.shouldCreateRunfilesSymlinks()); } } diff --git a/src/main/java/com/google/devtools/build/lib/analysis/actions/CommandLine.java b/src/main/java/com/google/devtools/build/lib/analysis/actions/CommandLine.java index 1d3e0bebb8..7bc670569a 100644 --- a/src/main/java/com/google/devtools/build/lib/analysis/actions/CommandLine.java +++ b/src/main/java/com/google/devtools/build/lib/analysis/actions/CommandLine.java @@ -19,10 +19,17 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.Iterables; import com.google.devtools.build.lib.actions.Artifact.ArtifactExpander; import com.google.devtools.build.lib.collect.CollectionUtils; -import com.google.devtools.build.lib.util.Preconditions; /** A representation of a list of arguments, often a command executed by {@link SpawnAction}. */ public abstract class CommandLine { + public static final CommandLine EMPTY = + new CommandLine() { + @Override + public Iterable<String> arguments() { + return ImmutableList.of(); + } + }; + /** * Returns the command line. */ @@ -55,18 +62,42 @@ public abstract class CommandLine { * Returns a {@link CommandLine} that is constructed by prepending the {@code executableArgs} to * {@code commandLine}. */ - CommandLine prepend(final ImmutableList<String> executableArgs) { - final CommandLine self = this; - Preconditions.checkState(!executableArgs.isEmpty()); + public static CommandLine concat( + final ImmutableList<String> executableArgs, final CommandLine commandLine) { + if (executableArgs.isEmpty()) { + return commandLine; + } + return new CommandLine() { + @Override + public Iterable<String> arguments() { + return Iterables.concat(executableArgs, commandLine.arguments()); + } + + @Override + public Iterable<String> arguments(ArtifactExpander artifactExpander) { + return Iterables.concat(executableArgs, commandLine.arguments(artifactExpander)); + } + }; + } + + /** + * Returns a {@link CommandLine} that is constructed by appending the {@code args} to {@code + * commandLine}. + */ + public static CommandLine concat( + final CommandLine commandLine, final ImmutableList<String> args) { + if (args.isEmpty()) { + return commandLine; + } return new CommandLine() { @Override public Iterable<String> arguments() { - return Iterables.concat(executableArgs, self.arguments()); + return Iterables.concat(commandLine.arguments(), args); } @Override public Iterable<String> arguments(ArtifactExpander artifactExpander) { - return Iterables.concat(executableArgs, self.arguments(artifactExpander)); + return Iterables.concat(commandLine.arguments(artifactExpander), args); } }; } diff --git a/src/main/java/com/google/devtools/build/lib/analysis/actions/ParamFileHelper.java b/src/main/java/com/google/devtools/build/lib/analysis/actions/ParamFileHelper.java index e39401ac04..d1253c98e0 100644 --- a/src/main/java/com/google/devtools/build/lib/analysis/actions/ParamFileHelper.java +++ b/src/main/java/com/google/devtools/build/lib/analysis/actions/ParamFileHelper.java @@ -137,7 +137,7 @@ public final class ParamFileHelper { return commandLine; } - return commandLine.prepend(ImmutableList.copyOf(executableArgs)); + return CommandLine.concat(ImmutableList.copyOf(executableArgs), commandLine); } /** diff --git a/src/main/java/com/google/devtools/build/lib/exec/TestStrategy.java b/src/main/java/com/google/devtools/build/lib/exec/TestStrategy.java index 7d98a9a942..4326269ccf 100644 --- a/src/main/java/com/google/devtools/build/lib/exec/TestStrategy.java +++ b/src/main/java/com/google/devtools/build/lib/exec/TestStrategy.java @@ -17,6 +17,7 @@ package com.google.devtools.build.lib.exec; import com.google.common.annotations.VisibleForTesting; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; +import com.google.common.collect.Iterables; import com.google.common.collect.Lists; import com.google.common.io.ByteStreams; import com.google.common.io.Closeables; @@ -188,7 +189,7 @@ public abstract class TestStrategy implements TestActionContext { // Execute the test using the alias in the runfiles tree, as mandated by the Test Encyclopedia. args.add(execSettings.getExecutable().getRootRelativePath().getCallablePathString()); - args.addAll(execSettings.getArgs()); + Iterables.addAll(args, execSettings.getArgs().arguments()); return ImmutableList.copyOf(args); } diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLibrary.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLibrary.java index eae1f2dfb4..a6d7f39718 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLibrary.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLibrary.java @@ -67,7 +67,9 @@ public abstract class AndroidLibrary implements RuleConfiguredTargetFactory { return null; } checkResourceInlining(ruleContext); - NestedSetBuilder<Aar> transitiveAars = collectTransitiveAars(ruleContext); + NestedSetBuilder<Aar> transitiveAars = NestedSetBuilder.naiveLinkOrder(); + NestedSetBuilder<Artifact> transitiveAarArtifacts = NestedSetBuilder.stableOrder(); + collectTransitiveAars(ruleContext, transitiveAars, transitiveAarArtifacts); NestedSetBuilder<Artifact> proguardConfigsbuilder = NestedSetBuilder.stableOrder(); proguardConfigsbuilder.addTransitive(new ProguardLibrary(ruleContext).collectProguardSpecs()); @@ -148,12 +150,12 @@ public abstract class AndroidLibrary implements RuleConfiguredTargetFactory { // applicationManifest has already been checked for nullness above in this method ApplicationManifest applicationManifest = androidSemantics.getManifestForRule(ruleContext); aar = Aar.create(aarOut, applicationManifest.getManifest()); - transitiveAars.add(aar); + addAarToProvider(aar, transitiveAars, transitiveAarArtifacts); } else if (AndroidCommon.getAndroidResources(ruleContext) != null) { primaryResources = Iterables.getOnlyElement( AndroidCommon.getAndroidResources(ruleContext).getDirectAndroidResources()); aar = Aar.create(aarOut, primaryResources.getManifest()); - transitiveAars.add(aar); + addAarToProvider(aar, transitiveAars, transitiveAarArtifacts); } else { // there are no local resources and resources attribute was not specified either aar = null; @@ -234,12 +236,26 @@ public abstract class AndroidLibrary implements RuleConfiguredTargetFactory { if (!JavaCommon.isNeverLink(ruleContext)) { builder.add( AndroidLibraryAarProvider.class, - AndroidLibraryAarProvider.create(aar, transitiveAars.build())); + AndroidLibraryAarProvider.create( + aar, transitiveAars.build(), transitiveAarArtifacts.build())); } return builder.build(); } + private void addAarToProvider( + Aar aar, + NestedSetBuilder<Aar> transitiveAars, + NestedSetBuilder<Artifact> transitiveAarArtifacts) { + transitiveAars.add(aar); + if (aar.getAar() != null) { + transitiveAarArtifacts.add(aar.getAar()); + } + if (aar.getManifest() != null) { + transitiveAarArtifacts.add(aar.getManifest()); + } + } + private void checkResourceInlining(RuleContext ruleContext) { AndroidResourcesProvider resources = AndroidCommon.getAndroidResources(ruleContext); if (resources == null) { @@ -256,13 +272,15 @@ public abstract class AndroidLibrary implements RuleConfiguredTargetFactory { } } - private NestedSetBuilder<Aar> collectTransitiveAars(RuleContext ruleContext) { - NestedSetBuilder<Aar> builder = NestedSetBuilder.naiveLinkOrder(); + private void collectTransitiveAars( + RuleContext ruleContext, + NestedSetBuilder<Aar> transitiveAars, + NestedSetBuilder<Artifact> transitiveAarArtifacts) { for (AndroidLibraryAarProvider library : AndroidCommon.getTransitivePrerequisites( ruleContext, Mode.TARGET, AndroidLibraryAarProvider.class)) { - builder.addTransitive(library.getTransitiveAars()); + transitiveAars.addTransitive(library.getTransitiveAars()); + transitiveAarArtifacts.addTransitive(library.getTransitiveAarArtifacts()); } - return builder; } private NestedSetBuilder<Artifact> collectTransitiveResourceJars(RuleContext ruleContext) { diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLibraryAarProvider.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLibraryAarProvider.java index ff9236e9ce..d4a8a8afdd 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLibraryAarProvider.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLibraryAarProvider.java @@ -28,14 +28,19 @@ import javax.annotation.Nullable; @Immutable public abstract class AndroidLibraryAarProvider implements TransitiveInfoProvider { - public static AndroidLibraryAarProvider create(@Nullable Aar aar, NestedSet<Aar> transitiveAars) { - return new AutoValue_AndroidLibraryAarProvider(aar, transitiveAars); + public static AndroidLibraryAarProvider create( + @Nullable Aar aar, + NestedSet<Aar> transitiveAars, + NestedSet<Artifact> transitiveAarArtifacts) { + return new AutoValue_AndroidLibraryAarProvider(aar, transitiveAars, transitiveAarArtifacts); } @Nullable public abstract Aar getAar(); public abstract NestedSet<Aar> getTransitiveAars(); + public abstract NestedSet<Artifact> getTransitiveAarArtifacts(); + /** The .aar file and associated AndroidManifest.xml contributed by a single target. */ @AutoValue @Immutable diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLocalTestBase.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLocalTestBase.java index de6987ed71..09180a6ff0 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLocalTestBase.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLocalTestBase.java @@ -17,7 +17,7 @@ import static com.google.devtools.build.lib.packages.BuildType.LABEL_LIST; import static com.google.devtools.build.lib.rules.java.DeployArchiveBuilder.Compression.COMPRESSED; import static com.google.devtools.build.lib.vfs.FileSystemUtils.replaceExtension; -import com.google.common.base.Joiner; +import com.google.common.base.Function; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import com.google.common.collect.Iterables; @@ -32,6 +32,7 @@ import com.google.devtools.build.lib.analysis.Runfiles; import com.google.devtools.build.lib.analysis.RunfilesProvider; import com.google.devtools.build.lib.analysis.RunfilesSupport; import com.google.devtools.build.lib.analysis.TransitiveInfoCollection; +import com.google.devtools.build.lib.analysis.actions.CustomCommandLine; import com.google.devtools.build.lib.collect.nestedset.NestedSet; import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder; import com.google.devtools.build.lib.rules.RuleConfiguredTargetFactory; @@ -58,12 +59,9 @@ import com.google.devtools.build.lib.rules.java.OneVersionCheckActionBuilder; import com.google.devtools.build.lib.rules.java.SingleJarActionBuilder; import com.google.devtools.build.lib.rules.java.proto.GeneratedExtensionRegistryProvider; import com.google.devtools.build.lib.syntax.Type; -import com.google.devtools.build.lib.util.Preconditions; import com.google.devtools.build.lib.vfs.PathFragment; import java.util.ArrayList; -import java.util.LinkedHashSet; import java.util.List; -import java.util.Set; /** * An base implementation for the "android_local_test" rule. @@ -209,16 +207,51 @@ public abstract class AndroidLocalTestBase implements RuleConfiguredTargetFactor ruleContext.getPrerequisites( "deps", Mode.TARGET, AndroidLibraryAarProvider.class))); - Runfiles defaultRunfiles = - collectDefaultRunfiles(ruleContext, javaCommon, filesToBuild, androidAarProviders); - - ImmutableList<String> cmdLineArgs = - ImmutableList.of( - "--android_libraries=" + getTransitiveLibrariesArg(androidAarProviders), - "--strict_libraries=" + getStrictLibrariesArg(androidAarProviders)); + NestedSetBuilder<Aar> transitiveAarsBuilder = NestedSetBuilder.naiveLinkOrder(); + NestedSetBuilder<Aar> strictAarsBuilder = NestedSetBuilder.naiveLinkOrder(); + NestedSetBuilder<Artifact> transitiveAarArtifactsBuilder = NestedSetBuilder.stableOrder(); + for (AndroidLibraryAarProvider aarProvider : androidAarProviders) { + transitiveAarsBuilder.addTransitive(aarProvider.getTransitiveAars()); + transitiveAarArtifactsBuilder.addTransitive(aarProvider.getTransitiveAarArtifacts()); + if (aarProvider.getAar() != null) { + strictAarsBuilder.add(aarProvider.getAar()); + } + } + NestedSet<Aar> transitiveAars = transitiveAarsBuilder.build(); + NestedSet<Aar> strictAars = strictAarsBuilder.build(); + NestedSet<Artifact> transitiveAarArtifacts = transitiveAarArtifactsBuilder.build(); + Runfiles defaultRunfiles = + collectDefaultRunfiles(ruleContext, javaCommon, filesToBuild, transitiveAarArtifacts); + + CustomCommandLine.Builder cmdLineArgs = CustomCommandLine.builder(); + if (!transitiveAars.isEmpty()) { + cmdLineArgs.addJoinValues( + "--android_libraries", + ",", + transitiveAars, + new Function<Aar, String>() { + @Override + public String apply(Aar aar) { + return aarCmdLineArg(aar); + } + }); + } + if (!strictAars.isEmpty()) { + cmdLineArgs.addJoinValues( + "--strict_libraries", + ",", + strictAars, + new Function<Aar, String>() { + @Override + public String apply(Aar aar) { + return aarCmdLineArg(aar); + } + }); + } RunfilesSupport runfilesSupport = - RunfilesSupport.withExecutable(ruleContext, defaultRunfiles, executable, cmdLineArgs); + RunfilesSupport.withExecutable( + ruleContext, defaultRunfiles, executable, cmdLineArgs.build()); // Create the deploy jar and make it dependent on the runfiles middleman if an executable is // created. Do not add the deploy jar to files to build, so we will only build it when it gets @@ -293,6 +326,12 @@ public abstract class AndroidLocalTestBase implements RuleConfiguredTargetFactor .build(); } + private static String aarCmdLineArg(Aar aar) { + return aar.getManifest().getRootRelativePathString() + + ":" + + aar.getAar().getRootRelativePathString(); + } + protected abstract JavaSemantics createJavaSemantics(); protected abstract void addExtraProviders( @@ -363,7 +402,7 @@ public abstract class AndroidLocalTestBase implements RuleConfiguredTargetFactor RuleContext ruleContext, JavaCommon javaCommon, NestedSet<Artifact> filesToBuild, - Iterable<AndroidLibraryAarProvider> androidLibraryAarProviders) { + NestedSet<Artifact> transitiveAarArtifacts) { Runfiles.Builder builder = new Runfiles.Builder(ruleContext.getWorkspaceName()); builder.addTransitiveArtifacts(filesToBuild); builder.addArtifacts(javaCommon.getJavaCompilationArtifacts().getRuntimeJars()); @@ -384,17 +423,7 @@ public abstract class AndroidLocalTestBase implements RuleConfiguredTargetFactor builder.addTargets(depsForRunfiles, JavaRunfilesProvider.TO_RUNFILES); builder.addTargets(depsForRunfiles, RunfilesProvider.DEFAULT_RUNFILES); - - for (AndroidLibraryAarProvider aarProvider : androidLibraryAarProviders) { - if (aarProvider.getAar() != null) { - builder.addArtifact(aarProvider.getAar().getAar()); - builder.addArtifact(aarProvider.getAar().getManifest()); - } - for (Aar aar : aarProvider.getTransitiveAars()) { - builder.addArtifact(aar.getAar()); - builder.addArtifact(aar.getManifest()); - } - } + builder.addTransitiveArtifacts(transitiveAarArtifacts); if (ruleContext.getConfiguration().isCodeCoverageEnabled()) { Artifact instrumentedJar = javaCommon.getJavaCompilationArtifacts().getInstrumentedJar(); @@ -436,38 +465,4 @@ public abstract class AndroidLocalTestBase implements RuleConfiguredTargetFactor } return testClass; } - - protected static String getTransitiveLibrariesArg( - Iterable<AndroidLibraryAarProvider> aarProviders) { - Set<String> args = new LinkedHashSet<>(); - - for (AndroidLibraryAarProvider aarProvider : aarProviders) { - for (Aar aar : aarProvider.getTransitiveAars()) { - Preconditions.checkNotNull(aar.getAar()); - Preconditions.checkNotNull(aar.getManifest()); - args.add( - aar.getManifest().getRootRelativePathString() - + ":" - + aar.getAar().getRootRelativePathString()); - } - } - return Joiner.on(",").join(args); - } - - protected static String getStrictLibrariesArg(Iterable<AndroidLibraryAarProvider> aarProviders) { - Set<String> args = new LinkedHashSet<>(); - - for (AndroidLibraryAarProvider aarProvider : aarProviders) { - Aar aar = aarProvider.getAar(); - if (aar != null) { - Preconditions.checkNotNull(aar.getAar()); - Preconditions.checkNotNull(aar.getManifest()); - args.add( - aar.getManifest().getRootRelativePathString() - + ":" - + aar.getAar().getRootRelativePathString()); - } - } - return Joiner.on(",").join(args); - } } diff --git a/src/main/java/com/google/devtools/build/lib/rules/test/TestRunnerAction.java b/src/main/java/com/google/devtools/build/lib/rules/test/TestRunnerAction.java index dec8790a47..71eaac6850 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/test/TestRunnerAction.java +++ b/src/main/java/com/google/devtools/build/lib/rules/test/TestRunnerAction.java @@ -211,7 +211,7 @@ public class TestRunnerAction extends AbstractAction implements NotifyOnActionCa protected String computeKey() { Fingerprint f = new Fingerprint(); f.addString(GUID); - f.addStrings(executionSettings.getArgs()); + f.addStrings(executionSettings.getArgs().arguments()); f.addString(executionSettings.getTestFilter() == null ? "" : executionSettings.getTestFilter()); RunUnder runUnder = executionSettings.getRunUnder(); f.addString(runUnder == null ? "" : runUnder.getValue()); diff --git a/src/main/java/com/google/devtools/build/lib/rules/test/TestTargetExecutionSettings.java b/src/main/java/com/google/devtools/build/lib/rules/test/TestTargetExecutionSettings.java index 9d3947cbc1..5a01bcb0ba 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/test/TestTargetExecutionSettings.java +++ b/src/main/java/com/google/devtools/build/lib/rules/test/TestTargetExecutionSettings.java @@ -15,7 +15,6 @@ package com.google.devtools.build.lib.rules.test; import com.google.common.collect.ImmutableList; -import com.google.common.collect.Iterables; import com.google.devtools.build.lib.actions.Artifact; import com.google.devtools.build.lib.analysis.FilesToRunProvider; import com.google.devtools.build.lib.analysis.RuleConfiguredTarget.Mode; @@ -23,21 +22,20 @@ import com.google.devtools.build.lib.analysis.RuleContext; import com.google.devtools.build.lib.analysis.Runfiles; import com.google.devtools.build.lib.analysis.RunfilesSupport; import com.google.devtools.build.lib.analysis.TransitiveInfoCollection; +import com.google.devtools.build.lib.analysis.actions.CommandLine; import com.google.devtools.build.lib.analysis.config.BuildConfiguration; import com.google.devtools.build.lib.analysis.config.RunUnder; import com.google.devtools.build.lib.packages.TargetUtils; import com.google.devtools.build.lib.util.Preconditions; import com.google.devtools.build.lib.vfs.Path; -import java.util.List; - /** * Container for common test execution settings shared by all * all TestRunnerAction instances for the given test target. */ public final class TestTargetExecutionSettings { - private final List<String> testArguments; + private final CommandLine testArguments; private final String testFilter; private final int totalShards; private final RunUnder runUnder; @@ -55,10 +53,8 @@ public final class TestTargetExecutionSettings { Preconditions.checkArgument(shards >= 0); BuildConfiguration config = ruleContext.getConfiguration(); - List<String> targetArgs = runfilesSupport.getArgs(); - testArguments = targetArgs.isEmpty() - ? config.getTestArguments() - : ImmutableList.copyOf(Iterables.concat(targetArgs, config.getTestArguments())); + CommandLine targetArgs = runfilesSupport.getArgs(); + testArguments = CommandLine.concat(targetArgs, ImmutableList.copyOf(config.getTestArguments())); totalShards = shards; runUnder = config.getRunUnder(); @@ -81,7 +77,7 @@ public final class TestTargetExecutionSettings { : runUnderTarget.getProvider(FilesToRunProvider.class).getExecutable(); } - public List<String> getArgs() { + public CommandLine getArgs() { return testArguments; } diff --git a/src/main/java/com/google/devtools/build/lib/runtime/commands/RunCommand.java b/src/main/java/com/google/devtools/build/lib/runtime/commands/RunCommand.java index 2c6d4e0d5e..cf98f997e7 100644 --- a/src/main/java/com/google/devtools/build/lib/runtime/commands/RunCommand.java +++ b/src/main/java/com/google/devtools/build/lib/runtime/commands/RunCommand.java @@ -16,11 +16,13 @@ package com.google.devtools.build.lib.runtime.commands; import com.google.common.annotations.VisibleForTesting; import com.google.common.collect.ImmutableList; +import com.google.common.collect.Iterables; import com.google.common.collect.Lists; import com.google.devtools.build.lib.actions.Artifact; import com.google.devtools.build.lib.analysis.ConfiguredTarget; import com.google.devtools.build.lib.analysis.FilesToRunProvider; import com.google.devtools.build.lib.analysis.RunfilesSupport; +import com.google.devtools.build.lib.analysis.actions.CommandLine; import com.google.devtools.build.lib.analysis.config.BuildConfiguration; import com.google.devtools.build.lib.analysis.config.RunUnder; import com.google.devtools.build.lib.buildtool.BuildRequest; @@ -224,18 +226,15 @@ public class RunCommand implements BlazeCommand { return ExitCode.LOCAL_ENVIRONMENTAL_ERROR; } - List<String> args = runTargetArgs; + List<String> args = Lists.newArrayList(); FilesToRunProvider provider = targetToRun.getProvider(FilesToRunProvider.class); RunfilesSupport runfilesSupport = provider == null ? null : provider.getRunfilesSupport(); if (runfilesSupport != null && runfilesSupport.getArgs() != null) { - List<String> targetArgs = runfilesSupport.getArgs(); - if (!targetArgs.isEmpty()) { - args = Lists.newArrayListWithCapacity(targetArgs.size() + runTargetArgs.size()); - args.addAll(targetArgs); - args.addAll(runTargetArgs); - } + CommandLine targetArgs = runfilesSupport.getArgs(); + Iterables.addAll(args, targetArgs.arguments()); } + args.addAll(runTargetArgs); String productName = env.getRuntime().getProductName(); // |