]> git.ipfire.org Git - thirdparty/git.git/commitdiff
builtin/repo: add inflated object info to structure table
authorJustin Tobler <jltobler@gmail.com>
Wed, 17 Dec 2025 17:54:02 +0000 (11:54 -0600)
committerJunio C Hamano <gitster@pobox.com>
Thu, 18 Dec 2025 00:02:31 +0000 (09:02 +0900)
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>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
builtin/repo.c
strbuf.c
strbuf.h
t/t1901-repo-structure.sh

index 8da321a3866077c3fe361b756dbb0727a389897f..67d7548b8864d390fec6f3dd24b61c8949f3a49e 100644 (file)
@@ -292,6 +292,20 @@ 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;
+       va_list ap;
+
+       CALLOC_ARRAY(entry, 1);
+       humanise_bytes(value, &entry->value, &entry->unit, HUMANISE_COMPACT);
+
+       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;
@@ -307,7 +321,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);
@@ -318,10 +333,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,
@@ -330,6 +345,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)
index 995ff15169f59ead4f32abed6ed99b929220a9d8..7fb7d12ac0cb9e231053ad4fd3575213318cccf8 100644 (file)
--- a/strbuf.c
+++ b/strbuf.c
@@ -886,11 +886,15 @@ void humanise_bytes(off_t bytes, char **value, const char **unit,
                *unit = humanise_rate ? _("KiB/s") : _("KiB");
        } else {
                *value = xstrfmt("%u", (unsigned)bytes);
-               *unit = humanise_rate ?
-                              /* TRANSLATORS: IEC 80000-13:2008 byte/second */
-                              Q_("byte/s", "bytes/s", bytes) :
-                              /* TRANSLATORS: IEC 80000-13:2008 byte */
-                              Q_("byte", "bytes", bytes);
+               if (flags & HUMANISE_COMPACT)
+                       /* TRANSLATORS: IEC 80000-13:2008 byte/second and byte */
+                       *unit = humanise_rate ? _("B/s") : _("B");
+               else
+                       *unit = humanise_rate ?
+                                       /* TRANSLATORS: IEC 80000-13:2008 byte/second */
+                                       Q_("byte/s", "bytes/s", bytes) :
+                                       /* TRANSLATORS: IEC 80000-13:2008 byte */
+                                       Q_("byte", "bytes", bytes);
        }
 }
 
index 52feef4c1bb0fdd754f6a979169e471683ef8639..06e284f9cca445cbe8a5ee9ec8c25fc74e18ff46 100644 (file)
--- a/strbuf.h
+++ b/strbuf.h
@@ -372,6 +372,11 @@ enum humanise_flags {
         * Use rate based units for humanised values.
         */
        HUMANISE_RATE = (1 << 0),
+       /*
+        * Use compact "B" unit symbol instead of "byte/bytes" for humanised
+        * values.
+        */
+       HUMANISE_COMPACT = (1 << 1),
 };
 
 /**
index 33237822fd551eb0c6fd56aa767525e81a0e6898..b18213c660ea26e228e7e9537cd510ecb26897f6 100755 (executable)
@@ -13,18 +13,23 @@ test_expect_success 'empty repository' '
                | Repository structure | Value  |
                | -------------------- | ------ |
                | * References         |        |
-               |   * Count            |     0  |
-               |     * Branches       |     0  |
-               |     * Tags           |     0  |
-               |     * Remotes        |     0  |
-               |     * Others         |     0  |
+               |   * Count            |      |
+               |     * Branches       |      |
+               |     * Tags           |      |
+               |     * Remotes        |      |
+               |     * Others         |      |
                |                      |        |
                | * 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 &&