Add a flag to convert only a subset of partitions to COW

Test: th
Change-Id: I2e9be56083b3c4d7f733e94059d372c14d136c31
diff --git a/Android.bp b/Android.bp
index 72b9f73..7049acd 100644
--- a/Android.bp
+++ b/Android.bp
@@ -1126,6 +1126,7 @@
         "libbase",
         "libcow_operation_convert",
         "libcow_size_estimator",
+        "libgflags",
         "libpayload_consumer",
         "libpayload_extent_ranges",
         "libpayload_extent_utils",
diff --git a/aosp/cow_converter.cc b/aosp/cow_converter.cc
index 2f93e3a..e464605 100644
--- a/aosp/cow_converter.cc
+++ b/aosp/cow_converter.cc
@@ -27,6 +27,7 @@
 
 #include <base/files/file_path.h>
 #include <libsnapshot/cow_writer.h>
+#include <gflags/gflags.h>
 
 #include "update_engine/common/cow_operation_convert.h"
 #include "update_engine/common/utils.h"
@@ -36,6 +37,10 @@
 #include "update_engine/update_metadata.pb.h"
 
 using android::snapshot::CowWriter;
+DEFINE_string(partitions,
+              "",
+              "Comma separated list of partitions to extract, leave empty for "
+              "extracting all partitions");
 
 namespace chromeos_update_engine {
 
@@ -77,7 +82,15 @@
 using chromeos_update_engine::MetadataParseResult;
 using chromeos_update_engine::PayloadMetadata;
 
-int main(int argc, const char* argv[]) {
+int main(int argc, char* argv[]) {
+  gflags::SetUsageMessage(
+      "A tool to extract device images from Android OTA packages");
+  gflags::ParseCommandLineFlags(&argc, &argv, true);
+  auto tokens = android::base::Tokenize(FLAGS_partitions, ",");
+  const std::set<std::string> partitions(
+      std::make_move_iterator(tokens.begin()),
+      std::make_move_iterator(tokens.end()));
+
   if (argc != 3) {
     printf("Usage: %s <payload.bin> <extracted target_file>\n", argv[0]);
     return -1;
@@ -131,6 +144,10 @@
     if (partition.estimate_cow_size() == 0) {
       continue;
     }
+    if (!partitions.empty() &&
+        partitions.count(partition.partition_name()) == 0) {
+      continue;
+    }
     LOG(INFO) << partition.partition_name();
     if (!ProcessPartition(partition, images_dir, manifest.block_size())) {
       return 6;