// Copyright 2014 The Bazel Authors. 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.util; import com.google.common.base.Preconditions; import com.google.common.collect.Iterables; import com.google.devtools.build.lib.shell.Command; import com.google.devtools.build.lib.vfs.Path; import java.io.File; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.Map; /** * Implements {@link Command} builder. * *

TODO(bazel-team): (2010) Some of the code here is very similar to the {@link * com.google.devtools.build.lib.shell.Shell} class. This should be looked at. */ public final class CommandBuilder { private final ArrayList argv = new ArrayList<>(); private final HashMap env = new HashMap<>(); private final File workingDir; public CommandBuilder(Path workingDir) { this(workingDir.getPathFile()); } public CommandBuilder(File workingDir) { this.workingDir = Preconditions.checkNotNull(workingDir); } public CommandBuilder addArg(String arg) { Preconditions.checkNotNull(arg); argv.add(arg); return this; } public CommandBuilder addArgs(Iterable args) { Preconditions.checkArgument(!Iterables.contains(args, null)); Iterables.addAll(argv, args); return this; } public CommandBuilder addArgs(String... args) { return addArgs(Arrays.asList(args)); } public CommandBuilder addEnv(Map env) { Preconditions.checkNotNull(env); this.env.putAll(env); return this; } public CommandBuilder emptyEnv() { env.clear(); return this; } public CommandBuilder setEnv(Map env) { emptyEnv(); addEnv(env); return this; } public Command build() { Preconditions.checkState(!argv.isEmpty(), "At least one argument is expected"); return new Command(argv.toArray(new String[0]), env, workingDir); } }