diff options
Diffstat (limited to 'src/tools/android/java/com/google/devtools/build')
5 files changed, 76 insertions, 64 deletions
diff --git a/src/tools/android/java/com/google/devtools/build/android/Converters.java b/src/tools/android/java/com/google/devtools/build/android/Converters.java index 9475449b7d..63f59801aa 100644 --- a/src/tools/android/java/com/google/devtools/build/android/Converters.java +++ b/src/tools/android/java/com/google/devtools/build/android/Converters.java @@ -22,11 +22,14 @@ import com.google.common.collect.ImmutableMap; import com.google.devtools.common.options.Converter; import com.google.devtools.common.options.EnumConverter; import com.google.devtools.common.options.OptionsParsingException; +import java.io.File; import java.lang.reflect.ParameterizedType; import java.nio.file.FileSystems; import java.nio.file.Files; import java.nio.file.InvalidPathException; import java.nio.file.Path; +import java.util.ArrayList; +import java.util.Collections; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; @@ -283,6 +286,49 @@ public final class Converters { } } + /** + * Validating converter for a list of Paths. + * A Path is considered valid if it resolves to a file. + */ + public static class PathListConverter implements Converter<List<Path>> { + + private final PathConverter baseConverter; + + public PathListConverter() { + this(false); + } + + protected PathListConverter(boolean mustExist) { + baseConverter = new PathConverter(mustExist); + } + + @Override + public List<Path> convert(String input) throws OptionsParsingException { + List<Path> list = new ArrayList<>(); + for (String piece : input.split(File.pathSeparator)) { + if (!piece.isEmpty()) { + list.add(baseConverter.convert(piece)); + } + } + return Collections.unmodifiableList(list); + } + + @Override + public String getTypeDescription() { + return "a colon-separated list of paths"; + } + } + + /** + * Validating converter for a list of Paths. The list is considered valid if all Paths resolve to + * a file that exists. + */ + public static class ExistingPathListConverter extends PathListConverter { + public ExistingPathListConverter() { + super(true); + } + } + // Commas that are not escaped by a backslash. private static final String UNESCAPED_COMMA_REGEX = "(?<!\\\\)\\,"; // Colons that are not escaped by a backslash. diff --git a/src/tools/android/java/com/google/devtools/build/android/LibraryRClassGeneratorAction.java b/src/tools/android/java/com/google/devtools/build/android/LibraryRClassGeneratorAction.java index a7555879af..935454729d 100644 --- a/src/tools/android/java/com/google/devtools/build/android/LibraryRClassGeneratorAction.java +++ b/src/tools/android/java/com/google/devtools/build/android/LibraryRClassGeneratorAction.java @@ -15,10 +15,10 @@ package com.google.devtools.build.android; import com.google.common.base.Stopwatch; import com.google.common.base.Strings; -import com.google.common.collect.ImmutableList; import com.google.devtools.build.android.AndroidResourceMerger.MergingException; import com.google.devtools.build.android.AndroidResourceProcessor.AaptConfigOptions; import com.google.devtools.build.android.Converters.PathConverter; +import com.google.devtools.build.android.Converters.PathListConverter; import com.google.devtools.common.options.Option; import com.google.devtools.common.options.OptionDocumentationCategory; import com.google.devtools.common.options.OptionsBase; @@ -68,10 +68,9 @@ public class LibraryRClassGeneratorAction { public String packageForR; @Option( - name = "symbol", - allowMultiple = true, + name = "symbols", defaultValue = "", - converter = PathConverter.class, + converter = PathListConverter.class, documentationCategory = OptionDocumentationCategory.UNCATEGORIZED, effectTags = {OptionEffectTag.UNKNOWN}, category = "config", @@ -88,9 +87,6 @@ public class LibraryRClassGeneratorAction { optionsParser.parseAndExitUponError(args); AaptConfigOptions aaptConfigOptions = optionsParser.getOptions(AaptConfigOptions.class); Options options = optionsParser.getOptions(Options.class); - if (options.symbols == null) { - options.symbols = ImmutableList.of(); - } logger.fine( String.format("Option parsing finished at %sms", timer.elapsed(TimeUnit.MILLISECONDS))); try (ScopedTemporaryDirectory scopedTmp = diff --git a/src/tools/android/java/com/google/devtools/build/android/ResourceShrinkerAction.java b/src/tools/android/java/com/google/devtools/build/android/ResourceShrinkerAction.java index 87854b4f7f..7abbb0c8b3 100644 --- a/src/tools/android/java/com/google/devtools/build/android/ResourceShrinkerAction.java +++ b/src/tools/android/java/com/google/devtools/build/android/ResourceShrinkerAction.java @@ -26,6 +26,7 @@ import com.google.devtools.build.android.AndroidResourceProcessor.AaptConfigOpti import com.google.devtools.build.android.AndroidResourceProcessor.FlagAaptOptions; import com.google.devtools.build.android.Converters.ExistingPathConverter; import com.google.devtools.build.android.Converters.PathConverter; +import com.google.devtools.build.android.Converters.PathListConverter; import com.google.devtools.build.android.Converters.VariantTypeConverter; import com.google.devtools.common.options.Converters.CommaSeparatedOptionListConverter; import com.google.devtools.common.options.Option; @@ -62,7 +63,7 @@ import org.xml.sax.SAXException; * --resources path to processed resources zip * --rTxt path to processed resources R.txt * --primaryManifest path to processed resources AndroidManifest.xml - * --dependencyManifest path to dependency library manifest (repeated flag) + * --dependencyManifests paths to dependency library manifests * --shrunkResourceApk path to write shrunk ap_ * --shrunkResources path to write shrunk resources zip * </pre> @@ -129,14 +130,13 @@ public class ResourceShrinkerAction { public Path primaryManifest; @Option( - name = "dependencyManifest", - allowMultiple = true, + name = "dependencyManifests", defaultValue = "", category = "input", - converter = PathConverter.class, + converter = PathListConverter.class, documentationCategory = OptionDocumentationCategory.UNCATEGORIZED, effectTags = {OptionEffectTag.UNKNOWN}, - help = "Paths to the manifests of the dependencies. Specify one path per flag." + help = "A list of paths to the manifests of the dependencies." ) public List<Path> dependencyManifests; @@ -236,9 +236,6 @@ public class ResourceShrinkerAction { optionsParser.parseAndExitUponError(args); aaptConfigOptions = optionsParser.getOptions(AaptConfigOptions.class); options = optionsParser.getOptions(Options.class); - if (options.dependencyManifests == null) { - options.dependencyManifests = ImmutableList.of(); - } AndroidResourceProcessor resourceProcessor = new AndroidResourceProcessor(stdLogger); // Setup temporary working directories. diff --git a/src/tools/android/java/com/google/devtools/build/android/ideinfo/JarFilter.java b/src/tools/android/java/com/google/devtools/build/android/ideinfo/JarFilter.java index 976649fda2..354fddfcf1 100644 --- a/src/tools/android/java/com/google/devtools/build/android/ideinfo/JarFilter.java +++ b/src/tools/android/java/com/google/devtools/build/android/ideinfo/JarFilter.java @@ -27,6 +27,7 @@ import com.google.common.util.concurrent.ListenableFuture; import com.google.common.util.concurrent.ListeningExecutorService; import com.google.common.util.concurrent.MoreExecutors; import com.google.devtools.build.android.Converters.PathConverter; +import com.google.devtools.build.android.Converters.PathListConverter; import com.google.devtools.build.lib.ideinfo.androidstudio.PackageManifestOuterClass.ArtifactLocation; import com.google.devtools.build.lib.ideinfo.androidstudio.PackageManifestOuterClass.JavaSourcePackage; import com.google.devtools.build.lib.ideinfo.androidstudio.PackageManifestOuterClass.PackageManifest; @@ -64,58 +65,46 @@ public final class JarFilter { /** The options for a {@JarFilter} action. */ public static final class JarFilterOptions extends OptionsBase { @Option( - name = "filter_jar", - allowMultiple = true, + name = "filter_jars", documentationCategory = OptionDocumentationCategory.UNCATEGORIZED, effectTags = {OptionEffectTag.UNKNOWN}, defaultValue = "null", - converter = PathConverter.class, + converter = PathListConverter.class, category = "input", - help = - "Paths to target output jars to filter for generated sources. You may use this flag " - + "multiple times, specify each path with a separate instance of the flag." + help = "A list of the paths to target output jars to filter for generated sources." ) public List<Path> filterJars; @Option( - name = "filter_source_jar", - allowMultiple = true, + name = "filter_source_jars", documentationCategory = OptionDocumentationCategory.UNCATEGORIZED, effectTags = {OptionEffectTag.UNKNOWN}, defaultValue = "null", - converter = PathConverter.class, + converter = PathListConverter.class, category = "input", - help = - "Paths to target output source jars to filter for generated sources. You may use this " - + "flag multiple times, specify each path with a separate instance of the flag." + help = "A list of the paths to target output source jars to filter for generated sources." ) public List<Path> filterSourceJars; @Option( - name = "keep_java_file", - allowMultiple = true, + name = "keep_java_files", documentationCategory = OptionDocumentationCategory.UNCATEGORIZED, effectTags = {OptionEffectTag.UNKNOWN}, defaultValue = "null", - converter = PathConverter.class, + converter = PathListConverter.class, category = "input", - help = - "Path of target input java files to keep. You may use this flag multiple times, " - + "specify each path with a separate instance of the flag." + help = "A list of target input java files to keep." ) public List<Path> keepJavaFiles; @Option( - name = "keep_source_jar", - allowMultiple = true, + name = "keep_source_jars", documentationCategory = OptionDocumentationCategory.UNCATEGORIZED, effectTags = {OptionEffectTag.UNKNOWN}, defaultValue = "null", - converter = PathConverter.class, + converter = PathListConverter.class, category = "input", - help = - "Path of target input .srcjar files to keep. You may use this flag multiple times, " - + "specify each path with a separate instance of the flag." + help = "A list of target input .srcjar files to keep." ) public List<Path> keepSourceJars; @@ -146,12 +135,11 @@ public final class JarFilter { @Deprecated @Option( - name = "jar", - allowMultiple = true, + name = "jars", documentationCategory = OptionDocumentationCategory.UNCATEGORIZED, effectTags = {OptionEffectTag.UNKNOWN}, defaultValue = "null", - converter = PathConverter.class, + converter = PathListConverter.class, category = "input", help = "A list of the paths to jars to filter for generated sources." ) @@ -247,25 +235,10 @@ public final class JarFilter { args = parseParamFileIfUsed(args); OptionsParser optionsParser = OptionsParser.newOptionsParser(JarFilterOptions.class); optionsParser.parseAndExitUponError(args); - JarFilterOptions options = optionsParser.getOptions(JarFilterOptions.class); - if (options.filterJars == null) { - options.filterJars = ImmutableList.of(); - } - if (options.filterSourceJars == null) { - options.filterSourceJars = ImmutableList.of(); - } - if (options.keepJavaFiles == null) { - options.keepJavaFiles = ImmutableList.of(); - } - if (options.keepSourceJars == null) { - options.keepSourceJars = ImmutableList.of(); - } - if (options.jars == null) { - options.jars = ImmutableList.of(); - } // Migrate options from v1 jar filter - if (options.filterJars.isEmpty() && options.jars != null) { + JarFilterOptions options = optionsParser.getOptions(JarFilterOptions.class); + if (options.filterJars == null && options.jars != null) { options.filterJars = options.jars; } if (options.filteredJar == null && options.output != null) { diff --git a/src/tools/android/java/com/google/devtools/build/android/ideinfo/PackageParser.java b/src/tools/android/java/com/google/devtools/build/android/ideinfo/PackageParser.java index 46b4702916..a248d4587a 100644 --- a/src/tools/android/java/com/google/devtools/build/android/ideinfo/PackageParser.java +++ b/src/tools/android/java/com/google/devtools/build/android/ideinfo/PackageParser.java @@ -22,6 +22,7 @@ import com.google.common.util.concurrent.ListenableFuture; import com.google.common.util.concurrent.ListeningExecutorService; import com.google.common.util.concurrent.MoreExecutors; import com.google.devtools.build.android.Converters.PathConverter; +import com.google.devtools.build.android.Converters.PathListConverter; import com.google.devtools.build.lib.ideinfo.androidstudio.PackageManifestOuterClass.ArtifactLocation; import com.google.devtools.build.lib.ideinfo.androidstudio.PackageManifestOuterClass.JavaSourcePackage; import com.google.devtools.build.lib.ideinfo.androidstudio.PackageManifestOuterClass.PackageManifest; @@ -80,16 +81,15 @@ public class PackageParser { public Path outputManifest; @Option( - name = "sources_execution_path", - allowMultiple = true, + name = "sources_execution_paths", defaultValue = "null", - converter = PathConverter.class, + converter = PathListConverter.class, category = "input", documentationCategory = OptionDocumentationCategory.UNCATEGORIZED, effectTags = {OptionEffectTag.UNKNOWN}, help = - "The execution paths of the java source files. You may use this flag multiple times, " - + "each instance should specify one path." + "The execution paths of the java source files. The expected format is a " + + "colon-separated list." ) public List<Path> sourcesExecutionPaths; } |