blob: ff3970da6a99013381cc5552f7e05de09239ac05 [file] [log] [blame]
/*
* Copyright 2012-present Facebook, Inc.
*
* 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.facebook.buck.cli;
import com.facebook.buck.java.JavaPackageFinder;
import com.facebook.buck.util.HumanReadableException;
import com.google.common.annotations.VisibleForTesting;
import com.google.common.base.Ascii;
import com.google.common.base.Function;
import com.google.common.base.Optional;
import com.google.common.base.Splitter;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Lists;
import org.kohsuke.args4j.Option;
import java.nio.file.Path;
import java.util.List;
import javax.annotation.Nullable;
public class ProjectCommandOptions extends BuildCommandOptions {
public enum Ide {
INTELLIJ,
XCODE;
public static Ide fromString(String string) {
switch (Ascii.toLowerCase(string)) {
case "intellij":
return Ide.INTELLIJ;
case "xcode":
return Ide.XCODE;
default:
throw new HumanReadableException("Invalid ide value %s.", string);
}
}
}
private static final Ide DEFAULT_IDE_VALUE = Ide.INTELLIJ;
private static final boolean DEFAULT_READ_ONLY_VALUE = false;
private static final boolean DEFAULT_ANDROID_AUTO_GENERATE = false;
@Option(
name = "--combined-project",
usage = "Generate an xcode project of a target and its dependencies.")
private boolean combinedProject;
@Option(name = "--process-annotations", usage = "Enable annotation processing")
private boolean processAnnotations;
@Option(
name = "--with-tests",
hidden = true)
@SuppressWarnings("PMD.UnusedPrivateField")
private boolean withTests = false;
@Option(
name = "--without-tests",
usage = "When generating a project slice, exclude tests that test the code in that slice")
private boolean withoutTests = false;
@Option(
name = "--combine-test-bundles",
usage = "Combine multiple ios/osx test targets into the same bundle if they have identical " +
"settings")
private boolean combineTestBundles = false;
@Option(
name = "--ide",
usage = "The type of IDE for which to generate a project. Defaults to 'intellij' if not " +
"specified in .buckconfig.")
@Nullable
private Ide ide = null;
@Option(
name = "--read-only",
usage = "If true, generate project files read-only. Defaults to '" +
DEFAULT_READ_ONLY_VALUE + "' if not specified in .buckconfig. (Only " +
"applies to generated Xcode projects.)")
private boolean readOnly = DEFAULT_READ_ONLY_VALUE;
@Option(
name = "--dry-run",
usage = "Instead of actually generating the project, only print out the targets that " +
"would be included.")
private boolean dryRun = false;
@Option(
name = "--enable-android-auto-generate-sources",
usage = "If true, turn on auto generate of sources by Android facet. Defaults to '" +
DEFAULT_ANDROID_AUTO_GENERATE + "' if not specified in .buckconfig.")
private boolean androidAutoGenerateEnabled = DEFAULT_ANDROID_AUTO_GENERATE;
ProjectCommandOptions(BuckConfig buckConfig) {
super(buckConfig);
}
public boolean getCombinedProject() {
return combinedProject;
}
public boolean getDryRun() {
return dryRun;
}
public boolean getCombineTestBundles() {
return combineTestBundles;
}
public boolean shouldProcessAnnotations() {
return processAnnotations;
}
@VisibleForTesting
public void setProcessAnnotations(boolean value) {
processAnnotations = value;
}
public ImmutableMap<Path, String> getBasePathToAliasMap() {
return getBuckConfig().getBasePathToAliasMap();
}
public JavaPackageFinder getJavaPackageFinder() {
return getBuckConfig().createDefaultJavaPackageFinder();
}
public Optional<String> getPathToDefaultAndroidManifest() {
return getBuckConfig().getValue("project", "default_android_manifest");
}
public Optional<String> getPathToPostProcessScript() {
return getBuckConfig().getValue("project", "post_process");
}
public boolean getReadOnly() {
if (readOnly) {
return readOnly;
}
return getBuckConfig().getBooleanValue("project", "read_only", DEFAULT_READ_ONLY_VALUE);
}
public boolean isAndroidAutoGenerateEnabled() {
if (androidAutoGenerateEnabled) {
return androidAutoGenerateEnabled;
}
return getBuckConfig().getBooleanValue("project", "enable_android_auto_generate_sources",
DEFAULT_ANDROID_AUTO_GENERATE);
}
/**
* Returns true if Buck should prompt to kill a running IDE before changing its files,
* false otherwise.
*/
public boolean getIdePrompt() {
return getBuckConfig().getBooleanValue("project", "ide_prompt", true);
}
public Ide getIde() {
if (ide != null) {
return ide;
} else {
Optional<Ide> ide = getBuckConfig().getValue("project", "ide").transform(
new Function<String, Ide>() {
@Override
public Ide apply(String input) {
return Ide.fromString(input);
}
});
return ide.or(DEFAULT_IDE_VALUE);
}
}
public boolean isWithTests() {
return !withoutTests;
}
private List<String> getInitialTargets() {
Optional<String> initialTargets = getBuckConfig().getValue("project", "initial_targets");
return initialTargets.isPresent()
? Lists.newArrayList(Splitter.on(' ').trimResults().split(initialTargets.get()))
: ImmutableList.<String>of();
}
public boolean hasInitialTargets() {
return !getInitialTargets().isEmpty();
}
public BuildCommandOptions createBuildCommandOptionsWithInitialTargets(
List<String> additionalInitialTargets) {
List<String> initialTargets;
if (additionalInitialTargets.isEmpty()) {
initialTargets = getInitialTargets();
} else {
initialTargets = Lists.newArrayList();
initialTargets.addAll(getInitialTargets());
initialTargets.addAll(additionalInitialTargets);
}
BuildCommandOptions buildCommandOptions = new BuildCommandOptions(getBuckConfig());
buildCommandOptions.setArguments(initialTargets);
return buildCommandOptions;
}
}