aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib/analysis/actions/CommandLine.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/analysis/actions/CommandLine.java')
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/actions/CommandLine.java123
1 files changed, 123 insertions, 0 deletions
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
new file mode 100644
index 0000000000..ddadc258b5
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/analysis/actions/CommandLine.java
@@ -0,0 +1,123 @@
+// Copyright 2014 Google Inc. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.google.devtools.build.lib.analysis.actions;
+
+import com.google.common.base.Joiner;
+import com.google.common.base.Preconditions;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Iterables;
+import com.google.devtools.build.lib.collect.CollectionUtils;
+
+/**
+ * A representation of a command line to be executed by a SpawnAction.
+ */
+public abstract class CommandLine {
+ /**
+ * Returns the command line.
+ */
+ public abstract Iterable<String> arguments();
+
+ /**
+ * Returns whether the command line represents a shell command with the given shell executable.
+ * This is used to give better error messages.
+ *
+ * <p>By default, this method returns false.
+ */
+ public boolean isShellCommand() {
+ return false;
+ }
+
+ /**
+ * A default implementation of a command line backed by a copy of the given list of arguments.
+ */
+ static CommandLine ofInternal(Iterable<String> arguments, final boolean isShellCommand) {
+ final Iterable<String> immutableArguments = CollectionUtils.makeImmutable(arguments);
+ return new CommandLine() {
+ @Override
+ public Iterable<String> arguments() {
+ return immutableArguments;
+ }
+
+ @Override
+ public boolean isShellCommand() {
+ return isShellCommand;
+ }
+ };
+ }
+
+ /**
+ * Returns a {@link CommandLine} backed by a copy of the given list of arguments.
+ */
+ public static CommandLine of(Iterable<String> arguments, final boolean isShellCommand) {
+ final Iterable<String> immutableArguments = CollectionUtils.makeImmutable(arguments);
+ return new CommandLine() {
+ @Override
+ public Iterable<String> arguments() {
+ return immutableArguments;
+ }
+
+ @Override
+ public boolean isShellCommand() {
+ return isShellCommand;
+ }
+ };
+ }
+
+ /**
+ * Returns a {@link CommandLine} that is constructed by prepending the {@code executableArgs} to
+ * {@code commandLine}.
+ */
+ static CommandLine ofMixed(final ImmutableList<String> executableArgs,
+ final CommandLine commandLine, final boolean isShellCommand) {
+ Preconditions.checkState(!executableArgs.isEmpty());
+ return new CommandLine() {
+ @Override
+ public Iterable<String> arguments() {
+ return Iterables.concat(executableArgs, commandLine.arguments());
+ }
+
+ @Override
+ public boolean isShellCommand() {
+ return isShellCommand;
+ }
+ };
+ }
+
+ /**
+ * Returns a {@link CommandLine} with {@link CharSequence} arguments. This can be useful to create
+ * memory efficient command lines with {@link com.google.devtools.build.lib.util.LazyString}s.
+ */
+ public static CommandLine ofCharSequences(final ImmutableList<CharSequence> arguments) {
+ return new CommandLine() {
+ @Override
+ public Iterable<String> arguments() {
+ ImmutableList.Builder<String> builder = ImmutableList.builder();
+ for (CharSequence arg : arguments) {
+ builder.add(arg.toString());
+ }
+ return builder.build();
+ }
+ };
+ }
+
+ /**
+ * This helps when debugging Blaze code that uses {@link CommandLine}s, as you can see their
+ * content directly in the variable inspector.
+ */
+ @Override
+ public String toString() {
+ return Joiner.on(' ').join(arguments());
+ }
+}