Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.kernel.org/pub/scm/git/git.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVictoria Dye <vdye@github.com>2022-08-12 23:10:14 +0300
committerJunio C Hamano <gitster@pobox.com>2022-08-12 23:20:02 +0300
commit33cba726f03e1e06b10b85cf4a1cbd1017810486 (patch)
treecd8c7fdd2b4655f4226aede0429a715e630fc67c /diagnose.c
parentbb2c34956ad4fab1e7619327219fb5a5a49f571b (diff)
diagnose.c: add option to configure archive contents
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. Finally, refactor from a hardcoded set of 'add_directory_to_archiver()' calls to iterative invocations gated by 'DIAGNOSE_ALL'. This allows for easier future modification of the set of directories to archive and improves error reporting when 'add_directory_to_archiver()' fails. Helped-by: Derrick Stolee <derrickstolee@github.com> Signed-off-by: Victoria Dye <vdye@github.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'diagnose.c')
-rw-r--r--diagnose.c39
1 files changed, 31 insertions, 8 deletions
diff --git a/diagnose.c b/diagnose.c
index f0dcbfe1a2..9270056db2 100644
--- a/diagnose.c
+++ b/diagnose.c
@@ -8,6 +8,11 @@
#include "object-store.h"
#include "packfile.h"
+struct archive_dir {
+ const char *path;
+ int recursive;
+};
+
static void dir_file_stats_objects(const char *full_path, size_t full_path_len,
const char *file_name, void *data)
{
@@ -132,13 +137,25 @@ 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;
int stdout_fd = -1, archiver_fd = -1;
struct strbuf buf = STRBUF_INIT;
- int res;
+ int res, i;
+ struct archive_dir archive_dirs[] = {
+ { ".git", 0 },
+ { ".git/hooks", 0 },
+ { ".git/info", 0 },
+ { ".git/logs", 1 },
+ { ".git/objects/info", 0 }
+ };
+
+ if (mode == DIAGNOSE_NONE) {
+ res = 0;
+ goto diagnose_cleanup;
+ }
stdout_fd = dup(STDOUT_FILENO);
if (stdout_fd < 0) {
@@ -177,12 +194,18 @@ 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)))
- goto diagnose_cleanup;
+ /* Only include this if explicitly requested */
+ if (mode == DIAGNOSE_ALL) {
+ for (i = 0; i < ARRAY_SIZE(archive_dirs); i++) {
+ if (add_directory_to_archiver(&archiver_args,
+ archive_dirs[i].path,
+ archive_dirs[i].recursive)) {
+ res = error_errno(_("could not add directory '%s' to archiver"),
+ archive_dirs[i].path);
+ goto diagnose_cleanup;
+ }
+ }
+ }
strvec_pushl(&archiver_args, "--prefix=",
oid_to_hex(the_hash_algo->empty_tree), "--", NULL);