From: Victoria Dye <vdye@xxxxxxxxxx> Update 'create_diagnostics_archive()' to take an argument 'mode'. When archiving diagnostics for a repository, 'mode' is used to selectively include/exclude information based on its value. The initial options for 'mode' are: * DIAGNOSE_NONE: do not collect any diagnostics or create an archive (no-op). * DIAGNOSE_STATS: collect basic repository metadata (Git version, repo path, filesystem available space) as well as sizing and count statistics for the repository's objects and packfiles. * DIAGNOSE_ALL: collect basic repository metadata, sizing/count statistics, and copies of the '.git', '.git/hooks', '.git/info', '.git/logs', and '.git/objects/info' directories. These modes are introduced to provide users the option to collect diagnostics without the sensitive information included in copies of '.git' dir contents. At the moment, only 'scalar diagnose' uses 'create_diagnostics_archive()' (with a hardcoded 'DIAGNOSE_ALL' mode to match existing functionality), but more callers will be introduced in subsequent patches. Helped-by: Derrick Stolee <derrickstolee@xxxxxxxxxx> Signed-off-by: Victoria Dye <vdye@xxxxxxxxxx> --- contrib/scalar/scalar.c | 2 +- diagnose.c | 19 +++++++++++++------ diagnose.h | 9 ++++++++- 3 files changed, 22 insertions(+), 8 deletions(-) diff --git a/contrib/scalar/scalar.c b/contrib/scalar/scalar.c index 3983def760a..d538b8b8f14 100644 --- a/contrib/scalar/scalar.c +++ b/contrib/scalar/scalar.c @@ -534,7 +534,7 @@ static int cmd_diagnose(int argc, const char **argv) goto diagnose_cleanup; } - res = create_diagnostics_archive(&zip_path); + res = create_diagnostics_archive(&zip_path, DIAGNOSE_ALL); diagnose_cleanup: strbuf_release(&zip_path); diff --git a/diagnose.c b/diagnose.c index 509d582f0ea..aadc3d4b21f 100644 --- a/diagnose.c +++ b/diagnose.c @@ -132,7 +132,7 @@ static int add_directory_to_archiver(struct strvec *archiver_args, return res; } -int create_diagnostics_archive(struct strbuf *zip_path) +int create_diagnostics_archive(struct strbuf *zip_path, enum diagnose_mode mode) { struct strvec archiver_args = STRVEC_INIT; char **argv_copy = NULL; @@ -140,6 +140,11 @@ int create_diagnostics_archive(struct strbuf *zip_path) struct strbuf buf = STRBUF_INIT; int res; + if (mode == DIAGNOSE_NONE) { + res = 0; + goto diagnose_cleanup; + } + stdout_fd = dup(STDOUT_FILENO); if (stdout_fd < 0) { res = error_errno(_("could not duplicate stdout")); @@ -177,11 +182,13 @@ int create_diagnostics_archive(struct strbuf *zip_path) loose_objs_stats(&buf, ".git/objects"); strvec_push(&archiver_args, buf.buf); - if ((res = add_directory_to_archiver(&archiver_args, ".git", 0)) || - (res = add_directory_to_archiver(&archiver_args, ".git/hooks", 0)) || - (res = add_directory_to_archiver(&archiver_args, ".git/info", 0)) || - (res = add_directory_to_archiver(&archiver_args, ".git/logs", 1)) || - (res = add_directory_to_archiver(&archiver_args, ".git/objects/info", 0))) + /* Only include this if explicitly requested */ + if (mode == DIAGNOSE_ALL && + ((res = add_directory_to_archiver(&archiver_args, ".git", 0)) || + (res = add_directory_to_archiver(&archiver_args, ".git/hooks", 0)) || + (res = add_directory_to_archiver(&archiver_args, ".git/info", 0)) || + (res = add_directory_to_archiver(&archiver_args, ".git/logs", 1)) || + (res = add_directory_to_archiver(&archiver_args, ".git/objects/info", 0)))) goto diagnose_cleanup; strvec_pushl(&archiver_args, "--prefix=", diff --git a/diagnose.h b/diagnose.h index 06dca69bdac..9bb6049bf0c 100644 --- a/diagnose.h +++ b/diagnose.h @@ -2,7 +2,14 @@ #define DIAGNOSE_H #include "strbuf.h" +#include "parse-options.h" -int create_diagnostics_archive(struct strbuf *zip_path); +enum diagnose_mode { + DIAGNOSE_NONE, + DIAGNOSE_STATS, + DIAGNOSE_ALL +}; + +int create_diagnostics_archive(struct strbuf *zip_path, enum diagnose_mode mode); #endif /* DIAGNOSE_H */ -- gitgitgadget