@@ -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
@@ -592,6 +593,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)
write_or_die(stdout_fd, buf.buf + off, buf.len - off);
strvec_push(&archiver_args, buf.buf);
+ strbuf_reset(&buf);
+ strbuf_addstr(&buf, "--add-file-with-content=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)) ||
@@ -93,6 +93,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 &&
grep "Available space" out &&
sed -n "s/.*$SQ\\(.*\\.zip\\)$SQ.*/\\1/p" <out >zip_path &&
@@ -102,7 +104,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