]> git.ipfire.org Git - thirdparty/git.git/commitdiff
scalar: teach `diagnose` to gather packfile info
authorMatthew John Cheetham <mjcheetham@outlook.com>
Sat, 28 May 2022 23:11:17 +0000 (16:11 -0700)
committerJunio C Hamano <gitster@pobox.com>
Tue, 31 May 2022 06:07:31 +0000 (23:07 -0700)
It's helpful to see if there are other crud files in the pack
directory. Let's teach the `scalar diagnose` command to gather
file size information about pack files.

While at it, also enumerate the pack files in the alternate
object directories, if any are registered.

Signed-off-by: Matthew John Cheetham <mjcheetham@outlook.com>
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
contrib/scalar/scalar.c
contrib/scalar/t/t9099-scalar.sh

index f06a2f3576bf415df607747cef6fdabfd86fd0e9..f7455190385a134cc7c5c131b767e690531783da 100644 (file)
@@ -12,6 +12,7 @@
 #include "packfile.h"
 #include "help.h"
 #include "archive.h"
+#include "object-store.h"
 
 /*
  * Remove the deepest subdirectory in the provided path string. Path must not
@@ -594,6 +595,29 @@ cleanup:
        return res;
 }
 
+static void dir_file_stats_objects(const char *full_path, size_t full_path_len,
+                                  const char *file_name, void *data)
+{
+       struct strbuf *buf = data;
+       struct stat st;
+
+       if (!stat(full_path, &st))
+               strbuf_addf(buf, "%-70s %16" PRIuMAX "\n", file_name,
+                           (uintmax_t)st.st_size);
+}
+
+static int dir_file_stats(struct object_directory *object_dir, void *data)
+{
+       struct strbuf *buf = data;
+
+       strbuf_addf(buf, "Contents of %s:\n", object_dir->path);
+
+       for_each_file_in_pack_dir(object_dir->path, dir_file_stats_objects,
+                                 data);
+
+       return 0;
+}
+
 static int cmd_diagnose(int argc, const char **argv)
 {
        struct option options[] = {
@@ -656,6 +680,12 @@ static int cmd_diagnose(int argc, const char **argv)
                     "--add-virtual-file=diagnostics.log:%.*s",
                     (int)buf.len, buf.buf);
 
+       strbuf_reset(&buf);
+       strbuf_addstr(&buf, "--add-virtual-file=packs-local.txt:");
+       dir_file_stats(the_repository->objects->odb, &buf);
+       foreach_alt_odb(dir_file_stats, &buf);
+       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)) ||
index 6e520889196f41bbb0544e1b55308c23dd838cf8..2603e2278f5593d2112cffc3853518c1540a15aa 100755 (executable)
@@ -101,6 +101,8 @@ test_expect_success '`scalar [...] <dir>` errors out when dir is missing' '
 SQ="'"
 test_expect_success UNZIP 'scalar diagnose' '
        scalar clone "file://$(pwd)" cloned --single-branch &&
+       git repack &&
+       echo "$(pwd)/.git/objects/" >>cloned/src/.git/objects/info/alternates &&
        scalar diagnose cloned >out 2>err &&
        grep "Available space" out &&
        sed -n "s/.*$SQ\\(.*\\.zip\\)$SQ.*/\\1/p" <err >zip_path &&
@@ -110,7 +112,9 @@ test_expect_success UNZIP 'scalar diagnose' '
        folder=${zip_path%.zip} &&
        test_path_is_missing "$folder" &&
        unzip -p "$zip_path" diagnostics.log >out &&
-       test_file_not_empty out
+       test_file_not_empty out &&
+       unzip -p "$zip_path" packs-local.txt >out &&
+       grep "$(pwd)/.git/objects" out
 '
 
 test_done