aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Collingbourne <pcc@google.com>2024-03-28 20:05:07 -0700
committerPeter Collingbourne <pcc@google.com>2024-03-29 15:13:43 -0700
commita41eb3d6a97249914e6e3245b0b9bda434a9aa57 (patch)
treef1455ff90cc0234d5617456b9a97594f54443b7e
parent19cd8dc9e1a8529804ecedd29714416db84cbe25 (diff)
downloadadb-a41eb3d6a97249914e6e3245b0b9bda434a9aa57.tar.gz
adb: Add a -q flag to push/pull/sync.
The -q (quiet) flag suppresses progress messages written to stderr. This is intended to be used by external tools that consider file transfer to be an implementation detail and don't want the progress messages to be visible to the user, while at the same time allowing the user to see error messages and warnings. Bug: 328531087 Change-Id: Iee08d9c4c68c20a69a7204a91b8ad16581e21f15
-rw-r--r--client/adb_install.cpp2
-rw-r--r--client/commandline.cpp43
-rw-r--r--client/fastdeploy.cpp2
-rw-r--r--client/file_sync_client.cpp13
-rw-r--r--client/file_sync_client.h6
-rw-r--r--client/line_printer.cpp4
-rw-r--r--client/line_printer.h2
7 files changed, 48 insertions, 24 deletions
diff --git a/client/adb_install.cpp b/client/adb_install.cpp
index b861ce22..5a1e1b09 100644
--- a/client/adb_install.cpp
+++ b/client/adb_install.cpp
@@ -287,7 +287,7 @@ static int install_app_legacy(int argc, const char** argv, bool use_fastdeploy)
}
}
- if (do_sync_push(apk_file, apk_dest.c_str(), false, CompressionType::Any, false)) {
+ if (do_sync_push(apk_file, apk_dest.c_str(), false, CompressionType::Any, false, false)) {
result = pm_command(argc, argv);
delete_device_file(apk_dest);
}
diff --git a/client/commandline.cpp b/client/commandline.cpp
index c07be210..8efc9918 100644
--- a/client/commandline.cpp
+++ b/client/commandline.cpp
@@ -139,21 +139,24 @@ static void help() {
"file transfer:\n"
" push [--sync] [-z ALGORITHM] [-Z] LOCAL... REMOTE\n"
" copy local files/directories to device\n"
- " --sync: only push files that have different timestamps on the host than the device\n"
" -n: dry run: push files to device without storing to the filesystem\n"
- " -z: enable compression with a specified algorithm (any/none/brotli/lz4/zstd)\n"
+ " -q: suppress progress messages\n"
" -Z: disable compression\n"
+ " -z: enable compression with a specified algorithm (any/none/brotli/lz4/zstd)\n"
+ " --sync: only push files that have different timestamps on the host than the device\n"
" pull [-a] [-z ALGORITHM] [-Z] REMOTE... LOCAL\n"
" copy files/dirs from device\n"
" -a: preserve file timestamp and mode\n"
- " -z: enable compression with a specified algorithm (any/none/brotli/lz4/zstd)\n"
+ " -q: suppress progress messages\n"
" -Z: disable compression\n"
+ " -z: enable compression with a specified algorithm (any/none/brotli/lz4/zstd)\n"
" sync [-l] [-z ALGORITHM] [-Z] [all|data|odm|oem|product|system|system_ext|vendor]\n"
" sync a local build from $ANDROID_PRODUCT_OUT to the device (default all)\n"
- " -n: dry run: push files to device without storing to the filesystem\n"
" -l: list files that would be copied, but don't copy them\n"
- " -z: enable compression with a specified algorithm (any/none/brotli/lz4/zstd)\n"
+ " -n: dry run: push files to device without storing to the filesystem\n"
+ " -q: suppress progress messages\n"
" -Z: disable compression\n"
+ " -z: enable compression with a specified algorithm (any/none/brotli/lz4/zstd)\n"
"\n"
"shell:\n"
" shell [-e ESCAPE] [-n] [-Tt] [-x] [COMMAND...]\n"
@@ -1302,7 +1305,7 @@ static CompressionType parse_compression_type(const std::string& str, bool allow
}
static void parse_push_pull_args(const char** arg, int narg, std::vector<const char*>* srcs,
- const char** dst, bool* copy_attrs, bool* sync,
+ const char** dst, bool* copy_attrs, bool* sync, bool* quiet,
CompressionType* compression, bool* dry_run) {
*copy_attrs = false;
if (const char* adb_compression = getenv("ADB_COMPRESSION")) {
@@ -1333,6 +1336,8 @@ static void parse_push_pull_args(const char** arg, int narg, std::vector<const c
if (sync != nullptr) {
*sync = true;
}
+ } else if (!strcmp(*arg, "-q")) {
+ *quiet = true;
} else if (!strcmp(*arg, "--")) {
ignore_flags = true;
} else {
@@ -1942,27 +1947,29 @@ int adb_commandline(int argc, const char** argv) {
bool copy_attrs = false;
bool sync = false;
bool dry_run = false;
+ bool quiet = false;
CompressionType compression = CompressionType::Any;
std::vector<const char*> srcs;
const char* dst = nullptr;
- parse_push_pull_args(&argv[1], argc - 1, &srcs, &dst, &copy_attrs, &sync, &compression,
- &dry_run);
+ parse_push_pull_args(&argv[1], argc - 1, &srcs, &dst, &copy_attrs, &sync, &quiet,
+ &compression, &dry_run);
if (srcs.empty() || !dst) {
error_exit("push requires <source> and <destination> arguments");
}
- return do_sync_push(srcs, dst, sync, compression, dry_run) ? 0 : 1;
+ return do_sync_push(srcs, dst, sync, compression, dry_run, quiet) ? 0 : 1;
} else if (!strcmp(argv[0], "pull")) {
bool copy_attrs = false;
+ bool quiet = false;
CompressionType compression = CompressionType::None;
std::vector<const char*> srcs;
const char* dst = ".";
- parse_push_pull_args(&argv[1], argc - 1, &srcs, &dst, &copy_attrs, nullptr, &compression,
- nullptr);
+ parse_push_pull_args(&argv[1], argc - 1, &srcs, &dst, &copy_attrs, nullptr, &quiet,
+ &compression, nullptr);
if (srcs.empty()) error_exit("pull requires an argument");
- return do_sync_pull(srcs, dst, copy_attrs, compression) ? 0 : 1;
+ return do_sync_pull(srcs, dst, copy_attrs, compression, nullptr, quiet) ? 0 : 1;
} else if (!strcmp(argv[0], "install")) {
if (argc < 2) error_exit("install requires an argument");
return install_app(argc, argv);
@@ -1979,6 +1986,7 @@ int adb_commandline(int argc, const char** argv) {
std::string src;
bool list_only = false;
bool dry_run = false;
+ bool quiet = false;
CompressionType compression = CompressionType::Any;
if (const char* adb_compression = getenv("ADB_COMPRESSION"); adb_compression) {
@@ -1986,7 +1994,7 @@ int adb_commandline(int argc, const char** argv) {
}
int opt;
- while ((opt = getopt(argc, const_cast<char**>(argv), "lnz:Z")) != -1) {
+ while ((opt = getopt(argc, const_cast<char**>(argv), "lnz:Zq")) != -1) {
switch (opt) {
case 'l':
list_only = true;
@@ -2000,8 +2008,11 @@ int adb_commandline(int argc, const char** argv) {
case 'Z':
compression = CompressionType::None;
break;
+ case 'q':
+ quiet = true;
+ break;
default:
- error_exit("usage: adb sync [-l] [-n] [-z ALGORITHM] [-Z] [PARTITION]");
+ error_exit("usage: adb sync [-l] [-n] [-z ALGORITHM] [-Z] [-q] [PARTITION]");
}
}
@@ -2010,7 +2021,7 @@ int adb_commandline(int argc, const char** argv) {
} else if (optind + 1 == argc) {
src = argv[optind];
} else {
- error_exit("usage: adb sync [-l] [-n] [-z ALGORITHM] [-Z] [PARTITION]");
+ error_exit("usage: adb sync [-l] [-n] [-z ALGORITHM] [-Z] [-q] [PARTITION]");
}
std::vector<std::string> partitions{"data", "odm", "oem", "product",
@@ -2021,7 +2032,7 @@ int adb_commandline(int argc, const char** argv) {
std::string src_dir{product_file(partition)};
if (!directory_exists(src_dir)) continue;
found = true;
- if (!do_sync_sync(src_dir, "/" + partition, list_only, compression, dry_run)) {
+ if (!do_sync_sync(src_dir, "/" + partition, list_only, compression, dry_run, quiet)) {
return 1;
}
}
diff --git a/client/fastdeploy.cpp b/client/fastdeploy.cpp
index bc4b91bb..adf31554 100644
--- a/client/fastdeploy.cpp
+++ b/client/fastdeploy.cpp
@@ -112,7 +112,7 @@ static void push_to_device(const void* data, size_t byte_count, const char* dst,
// but can't be removed until after the push.
unix_close(tf.release());
- if (!do_sync_push(srcs, dst, sync, CompressionType::Any, false)) {
+ if (!do_sync_push(srcs, dst, sync, CompressionType::Any, false, false)) {
error_exit("Failed to push fastdeploy agent to device.");
}
}
diff --git a/client/file_sync_client.cpp b/client/file_sync_client.cpp
index 4c8fd042..410f4128 100644
--- a/client/file_sync_client.cpp
+++ b/client/file_sync_client.cpp
@@ -292,6 +292,10 @@ class SyncConnection {
bool IsValid() { return fd >= 0; }
+ void SetQuiet(bool quiet) {
+ line_printer_.quiet_ = quiet;
+ }
+
void NewTransfer() {
current_ledger_.Reset();
}
@@ -1442,9 +1446,10 @@ static bool copy_local_dir_remote(SyncConnection& sc, std::string lpath, std::st
}
bool do_sync_push(const std::vector<const char*>& srcs, const char* dst, bool sync,
- CompressionType compression, bool dry_run) {
+ CompressionType compression, bool dry_run, bool quiet) {
SyncConnection sc;
if (!sc.IsValid()) return false;
+ sc.SetQuiet(quiet);
bool success = true;
bool dst_exists;
@@ -1664,9 +1669,10 @@ static bool copy_remote_dir_local(SyncConnection& sc, std::string rpath, std::st
}
bool do_sync_pull(const std::vector<const char*>& srcs, const char* dst, bool copy_attrs,
- CompressionType compression, const char* name) {
+ CompressionType compression, const char* name, bool quiet) {
SyncConnection sc;
if (!sc.IsValid()) return false;
+ sc.SetQuiet(quiet);
bool success = true;
struct stat st;
@@ -1774,9 +1780,10 @@ bool do_sync_pull(const std::vector<const char*>& srcs, const char* dst, bool co
}
bool do_sync_sync(const std::string& lpath, const std::string& rpath, bool list_only,
- CompressionType compression, bool dry_run) {
+ CompressionType compression, bool dry_run, bool quiet) {
SyncConnection sc;
if (!sc.IsValid()) return false;
+ sc.SetQuiet(quiet);
bool success = copy_local_dir_remote(sc, lpath, rpath, true, list_only, compression, dry_run);
if (!list_only) {
diff --git a/client/file_sync_client.h b/client/file_sync_client.h
index cb8ca932..200a9ae8 100644
--- a/client/file_sync_client.h
+++ b/client/file_sync_client.h
@@ -23,9 +23,9 @@
bool do_sync_ls(const char* path);
bool do_sync_push(const std::vector<const char*>& srcs, const char* dst, bool sync,
- CompressionType compression, bool dry_run);
+ CompressionType compression, bool dry_run, bool quiet);
bool do_sync_pull(const std::vector<const char*>& srcs, const char* dst, bool copy_attrs,
- CompressionType compression, const char* name = nullptr);
+ CompressionType compression, const char* name = nullptr, bool quiet = false);
bool do_sync_sync(const std::string& lpath, const std::string& rpath, bool list_only,
- CompressionType compression, bool dry_run);
+ CompressionType compression, bool dry_run, bool quiet);
diff --git a/client/line_printer.cpp b/client/line_printer.cpp
index 50c03e81..ce6a6985 100644
--- a/client/line_printer.cpp
+++ b/client/line_printer.cpp
@@ -68,6 +68,10 @@ static void Out(const std::string& s) {
}
void LinePrinter::Print(string to_print, LineType type) {
+ if (quiet_ && type == LineType::INFO) {
+ return;
+ }
+
if (!smart_terminal_) {
if (type == LineType::INFO) {
info_line_ = to_print + "\n";
diff --git a/client/line_printer.h b/client/line_printer.h
index 4c4c7c6f..34f5c54d 100644
--- a/client/line_printer.h
+++ b/client/line_printer.h
@@ -26,6 +26,8 @@ struct LinePrinter {
bool is_smart_terminal() const { return smart_terminal_; }
void set_smart_terminal(bool smart) { smart_terminal_ = smart; }
+ bool quiet_ = false;
+
enum LineType { INFO, WARNING, ERROR };
/// Outputs the given line. INFO output will be overwritten.