diff options
Diffstat (limited to 'src/objc_tools/plmerge/java/com/google/devtools/build/xcode/plmerge/PlMerge.java')
-rw-r--r-- | src/objc_tools/plmerge/java/com/google/devtools/build/xcode/plmerge/PlMerge.java | 115 |
1 files changed, 79 insertions, 36 deletions
diff --git a/src/objc_tools/plmerge/java/com/google/devtools/build/xcode/plmerge/PlMerge.java b/src/objc_tools/plmerge/java/com/google/devtools/build/xcode/plmerge/PlMerge.java index ea13c29ab9..40eaa57ade 100644 --- a/src/objc_tools/plmerge/java/com/google/devtools/build/xcode/plmerge/PlMerge.java +++ b/src/objc_tools/plmerge/java/com/google/devtools/build/xcode/plmerge/PlMerge.java @@ -15,6 +15,7 @@ package com.google.devtools.build.xcode.plmerge; import com.google.common.collect.ImmutableMap; +import com.google.devtools.build.xcode.plmerge.proto.PlMergeProtos.Control; import com.google.devtools.common.options.Option; import com.google.devtools.common.options.Options; import com.google.devtools.common.options.OptionsBase; @@ -24,81 +25,123 @@ import com.google.devtools.common.options.OptionsParsingException; import com.dd.plist.NSObject; import java.io.IOException; +import java.io.InputStream; import java.nio.file.FileSystem; import java.nio.file.FileSystems; -import java.nio.file.Path; -import java.util.ArrayList; +import java.nio.file.Files; import java.util.List; /** * Entry point for the {@code plmerge} tool, which merges the data from one or more plists into a * single binary plist. This tool's functionality is similar to that of the * {@code builtin-infoPlistUtility} in Xcode. + * + * <p>For backwards compatibility, PlMerge can consume either a control protobuf, passed using + * --control, or the command line arguments --source_file, --out_file, --primary_bundle_id, + * and --fallback_bundle_id. If a --control is not provided, PlMerge will fall back on the other + * command line arguments. If --control is provided, all other command line arguments are ignored. */ public class PlMerge { + /** * Options for {@link PlMerge}. */ public static class PlMergeOptions extends OptionsBase { + @Option( - name = "source_file", - help = "Paths to the plist files to merge. These can be binary, XML, or ASCII format. " - + "Repeat this flag to specify multiple files. Required.", - allowMultiple = true, - defaultValue = "null") + name = "source_file", + help = + "Paths to the plist files to merge. These can be binary, XML, or ASCII format. " + + "Repeat this flag to specify multiple files. Required.", + allowMultiple = true, + defaultValue = "null" + ) public List<String> sourceFiles; - @Option( - name = "out_file", - help = "Path to the output file. Required.", - defaultValue = "null") + @Option(name = "out_file", help = "Path to the output file. Required.", defaultValue = "null") public String outFile; @Option( - name = "primary_bundle_id", - help = "A reverse-DNS string identifier for this bundle associated with output binary " - + "plist. This flag overrides the bundle id specified in field CFBundleIdentifier in " - + "the associated plist file.", - defaultValue = "null") + name = "primary_bundle_id", + help = + "A reverse-DNS string identifier for this bundle associated with output binary " + + "plist. This flag overrides the bundle id specified in field CFBundleIdentifier in " + + "the associated plist file.", + defaultValue = "null" + ) public String primaryBundleId; @Option( - name = "fallback_bundle_id", - help = "A fallback reverse-DNS string identifier for this bundle when the bundle " - + "identifier is not specified in flag primary_bundle_id or associated plist file", - defaultValue = "null") + name = "fallback_bundle_id", + help = + "A fallback reverse-DNS string identifier for this bundle when the bundle " + + "identifier is not specified in flag primary_bundle_id or associated plist file", + defaultValue = "null" + ) public String fallbackBundleId; + + @Option( + name = "control", + help = + "Absolute path of the Control protobuf. Data can be passed to plmerge through this " + + "protobuf or through source_file, out_file, primary_bundle_id and " + + "fallback_bundle_id.", + defaultValue = "null" + ) + public String controlPath; } + + public static void main(String[] args) throws OptionsParsingException, IOException { - public static void main(String[] args) throws IOException, OptionsParsingException { + FileSystem fileSystem = FileSystems.getDefault(); OptionsParser parser = OptionsParser.newOptionsParser(PlMergeOptions.class); parser.parse(args); PlMergeOptions options = parser.getOptions(PlMergeOptions.class); - if (options.sourceFiles.isEmpty()) { - missingArg("At least one --source_file"); - } - if (options.outFile == null) { - missingArg("--out_file"); - } - FileSystem fileSystem = FileSystems.getDefault(); - List<Path> sourceFilePaths = new ArrayList<>(); - for (String sourceFile : options.sourceFiles) { - sourceFilePaths.add(fileSystem.getPath(sourceFile)); + MergingArguments data = null; + + if (usingControlProtobuf(options)) { + InputStream in = Files.newInputStream(fileSystem.getPath(options.controlPath)); + Control control = Control.parseFrom(in); + validateControl(control); + data = new MergingArguments(control); + } else if (usingCommandLineArgs(options)) { + data = new MergingArguments(options); + } else { + missingArg("Either --control or --out_file and at least one --source_file"); } - PlistMerging merging = PlistMerging.from(sourceFilePaths, ImmutableMap.<String, NSObject>of(), - ImmutableMap.<String, String>of(), new KeysToRemoveIfEmptyString()); - if (options.primaryBundleId != null || options.fallbackBundleId != null) { + PlistMerging merging = + PlistMerging.from( + data, + ImmutableMap.<String, NSObject>of(), + new KeysToRemoveIfEmptyString("CFBundleIconFile", "NSPrincipalClass")); + if (data.getPrimaryBundleId() != null || data.getFallbackBundleId() != null) { // Only set the bundle identifier if we were passed arguments to do so. // This prevents CFBundleIdentifiers being put into strings files. - merging.setBundleIdentifier(options.primaryBundleId, options.fallbackBundleId); + merging.setBundleIdentifier(data.getPrimaryBundleId(), data.getFallbackBundleId()); } - merging.writePlist(fileSystem.getPath(options.outFile)); + merging.writePlist(fileSystem.getPath(data.getOutFile())); } + private static void validateControl(Control control) { + if (control.getSourceFileList().isEmpty()) { + missingArg("At least one source_file"); + } else if (!control.hasOutFile()) { + missingArg("out_file"); + } + } + private static void missingArg(String flag) { throw new IllegalArgumentException(flag + " is required:\n" + Options.getUsage(PlMergeOptions.class)); } + + private static boolean usingControlProtobuf(PlMergeOptions options) { + return options.controlPath != null; + } + + private static boolean usingCommandLineArgs(PlMergeOptions options) { + return (!options.sourceFiles.isEmpty()) && (options.outFile != null); + } } |