[PATCH v2 5/7] builtin/repo: add inflated object info to structure table
- From
Justin Tobler <jltobler@gmail.com>
- Date
- Dec 12, 2025, 22:36 UTC
- Message-ID
- <20251212223644.3090879-6-jltobler@gmail.com>
- In-Reply-To
- <20251212223644.3090879-1-jltobler@gmail.com>
Update the table output format for the git-repo(1) structure command to begin printing the total inflated object size info by object type. To be more human-friendly, larger values are scaled down and displayed with the appropriate unit prefix. Output for the keyvalue and nul formats remains unchanged.
Signed-off-by: Justin Tobler <jltobler@gmail.com> --- builtin/repo.c | 37 +++++++++++++++++++++-- strbuf.c | 4 +++ strbuf.h | 3 +- t/t1901-repo-structure.sh | 62 +++++++++++++++++++++++---------------- 4 files changed, 76 insertions(+), 30 deletions(-)
diff --git a/builtin/repo.c b/builtin/repo.c index 3a2d15cec4..b0609cfae5 100644 --- a/builtin/repo.c +++ b/builtin/repo.c @@ -295,6 +295,24 @@ static void stats_table_count_addf(struct stats_table *table, size_t value, va_end(ap); } +static void stats_table_size_addf(struct stats_table *table, size_t value, + const char *format, ...) +{ + struct stats_table_entry *entry; + struct strbuf buf = STRBUF_INIT; + va_list ap; + + CALLOC_ARRAY(entry, 1); + + entry->unit = strbuf_humanise_bytes_value(&buf, value, + STRBUF_HUMANISE_COMPACT); + entry->value = strbuf_detach(&buf, NULL); + + va_start(ap, format); + stats_table_vaddf(table, entry, format, ap); + va_end(ap); +} + static inline size_t get_total_reference_count(struct ref_stats *stats) { return stats->branches + stats->remotes + stats->tags + stats->others; @@ -310,7 +328,8 @@ static void stats_table_setup_structure(struct stats_table *table, { struct object_stats *objects = &stats->objects; struct ref_stats *refs = &stats->refs; - size_t object_total; + size_t inflated_object_total; + size_t object_count_total; size_t ref_total; ref_total = get_total_reference_count(refs); @@ -321,10 +340,10 @@ static void stats_table_setup_structure(struct stats_table *table, stats_table_count_addf(table, refs->remotes, " * %s", _("Remotes")); stats_table_count_addf(table, refs->others, " * %s", _("Others")); - object_total = get_total_object_values(&objects->type_counts); + object_count_total = get_total_object_values(&objects->type_counts); stats_table_addf(table, ""); stats_table_addf(table, "* %s", _("Reachable objects")); - stats_table_count_addf(table, object_total, " * %s", _("Count")); + stats_table_count_addf(table, object_count_total, " * %s", _("Count")); stats_table_count_addf(table, objects->type_counts.commits, " * %s", _("Commits")); stats_table_count_addf(table, objects->type_counts.trees, @@ -333,6 +352,18 @@ static void stats_table_setup_structure(struct stats_table *table, " * %s", _("Blobs")); stats_table_count_addf(table, objects->type_counts.tags, " * %s", _("Tags")); + + inflated_object_total = get_total_object_values(&objects->inflated_sizes); + stats_table_size_addf(table, inflated_object_total, + " * %s", _("Inflated size")); + stats_table_size_addf(table, objects->inflated_sizes.commits, + " * %s", _("Commits")); + stats_table_size_addf(table, objects->inflated_sizes.trees, + " * %s", _("Trees")); + stats_table_size_addf(table, objects->inflated_sizes.blobs, + " * %s", _("Blobs")); + stats_table_size_addf(table, objects->inflated_sizes.tags, + " * %s", _("Tags")); } static void stats_table_print_structure(const struct stats_table *table) diff --git a/strbuf.c b/strbuf.c index cebb1593ab..eed4e167ca 100644 --- a/strbuf.c +++ b/strbuf.c @@ -882,6 +882,10 @@ char *strbuf_humanise_bytes_value(struct strbuf *buf, off_t bytes, unsigned flag return humanise_rate ? xstrfmt(_("KiB/s")) : xstrfmt(_("KiB")); } else { strbuf_addf(buf, "%u", (unsigned)bytes); + if (flags & STRBUF_HUMANISE_COMPACT) + return humanise_rate ? + xstrfmt(_("B/s")) : + xstrfmt(_("B")); return humanise_rate ? /* TRANSLATORS: IEC 80000-13:2008 byte/second */ xstrfmt(Q_("byte/s", "bytes/s", bytes)) : diff --git a/strbuf.h b/strbuf.h index 7532eadd02..919527d26b 100644 --- a/strbuf.h +++ b/strbuf.h @@ -367,7 +367,8 @@ void strbuf_addbuf_percentquote(struct strbuf *dst, const struct strbuf *src); */ void strbuf_add_percentencode(struct strbuf *dst, const char *src, int flags); -#define STRBUF_HUMANISE_RATE 1 << 0 +#define STRBUF_HUMANISE_RATE 1 << 0 +#define STRBUF_HUMANISE_COMPACT 1 << 1 /** * Append the given byte size as a human-readable string that is downscaled by diff --git a/t/t1901-repo-structure.sh b/t/t1901-repo-structure.sh index 33237822fd..b18213c660 100755 --- a/t/t1901-repo-structure.sh +++ b/t/t1901-repo-structure.sh @@ -13,18 +13,23 @@ test_expect_success 'empty repository' ' | Repository structure | Value | | -------------------- | ------ | | * References | | - | * Count | 0 | - | * Branches | 0 | - | * Tags | 0 | - | * Remotes | 0 | - | * Others | 0 | + | * Count | 0 | + | * Branches | 0 | + | * Tags | 0 | + | * Remotes | 0 | + | * Others | 0 | | | | | * Reachable objects | | - | * Count | 0 | - | * Commits | 0 | - | * Trees | 0 | - | * Blobs | 0 | - | * Tags | 0 | + | * Count | 0 | + | * Commits | 0 | + | * Trees | 0 | + | * Blobs | 0 | + | * Tags | 0 | + | * Inflated size | 0 B | + | * Commits | 0 B | + | * Trees | 0 B | + | * Blobs | 0 B | + | * Tags | 0 B | EOF git repo structure >out 2>err && @@ -34,7 +39,7 @@ test_expect_success 'empty repository' ' ) ' -test_expect_success 'repository with references and objects' ' +test_expect_success SHA1 'repository with references and objects' ' test_when_finished "rm -rf repo" && git init repo && ( @@ -49,21 +54,26 @@ test_expect_success 'repository with references and objects' ' git notes add -m foo && cat >expect <<-\EOF && - | Repository structure | Value | - | -------------------- | ------ | - | * References | | - | * Count | 4 | - | * Branches | 1 | - | * Tags | 1 | - | * Remotes | 1 | - | * Others | 1 | - | | | - | * Reachable objects | | - | * Count | 3.02 k | - | * Commits | 1.01 k | - | * Trees | 1.01 k | - | * Blobs | 1.01 k | - | * Tags | 1 | + | Repository structure | Value | + | -------------------- | ---------- | + | * References | | + | * Count | 4 | + | * Branches | 1 | + | * Tags | 1 | + | * Remotes | 1 | + | * Others | 1 | + | | | + | * Reachable objects | | + | * Count | 3.02 k | + | * Commits | 1.01 k | + | * Trees | 1.01 k | + | * Blobs | 1.01 k | + | * Tags | 1 | + | * Inflated size | 16.03 MiB | + | * Commits | 217.92 KiB | + | * Trees | 15.81 MiB | + | * Blobs | 11.68 KiB | + | * Tags | 132 B | EOF git repo structure >out 2>err &&
-- 2.52.0.209.ge85ae279b0