From: Justin Tobler <jltobler@gmail•com>
To: git@vger•kernel.org
Cc: ps@pks•im, gitster@pobox•com, Justin Tobler <jltobler@gmail•com>
Subject: [PATCH v3 6/7] builtin/repo: add disk size info to keyvalue stucture output
Date: Mon, 15 Dec 2025 14:56:38 -0600 [thread overview]
Message-ID: <20251215205639.2700270-7-jltobler@gmail.com> (raw)
In-Reply-To: <20251215205639.2700270-1-jltobler@gmail.com>
Similar to a prior commit, extend the keyvalue and nul output formats of
the git-repo(1) structure command to additionally provide info regarding
total object disk sizes by object type.
Signed-off-by: Justin Tobler <jltobler@gmail•com>
---
Documentation/git-repo.adoc | 1 +
builtin/repo.c | 18 ++++++++++++++++++
t/t1901-repo-structure.sh | 11 ++++++++++-
3 files changed, 29 insertions(+), 1 deletion(-)
diff --git a/Documentation/git-repo.adoc b/Documentation/git-repo.adoc
index 287eee4b93..861073f641 100644
--- a/Documentation/git-repo.adoc
+++ b/Documentation/git-repo.adoc
@@ -51,6 +51,7 @@ supported:
* Reference counts categorized by type
* Reachable object counts categorized by type
* Total inflated size of reachable objects by type
+* Total disk size of reachable objects by type
+
The output format can be chosen through the flag `--format`. Three formats are
diff --git a/builtin/repo.c b/builtin/repo.c
index b73cfd975b..0ed41bf9d4 100644
--- a/builtin/repo.c
+++ b/builtin/repo.c
@@ -214,6 +214,7 @@ struct object_values {
struct object_stats {
struct object_values type_counts;
struct object_values inflated_sizes;
+ struct object_values disk_sizes;
};
struct repo_structure {
@@ -462,6 +463,15 @@ static void structure_keyvalue_print(struct repo_structure *stats,
printf("objects.tags.inflated_size%c%" PRIuMAX "%c", key_delim,
(uintmax_t)stats->objects.inflated_sizes.tags, value_delim);
+ printf("objects.commits.disk_size%c%" PRIuMAX "%c", key_delim,
+ (uintmax_t)stats->objects.disk_sizes.commits, value_delim);
+ printf("objects.trees.disk_size%c%" PRIuMAX "%c", key_delim,
+ (uintmax_t)stats->objects.disk_sizes.trees, value_delim);
+ printf("objects.blobs.disk_size%c%" PRIuMAX "%c", key_delim,
+ (uintmax_t)stats->objects.disk_sizes.blobs, value_delim);
+ printf("objects.tags.disk_size%c%" PRIuMAX "%c", key_delim,
+ (uintmax_t)stats->objects.disk_sizes.tags, value_delim);
+
fflush(stdout);
}
@@ -536,13 +546,16 @@ static int count_objects(const char *path UNUSED, struct oid_array *oids,
struct count_objects_data *data = cb_data;
struct object_stats *stats = data->stats;
size_t inflated_total = 0;
+ size_t disk_total = 0;
size_t object_count;
for (size_t i = 0; i < oids->nr; i++) {
struct object_info oi = OBJECT_INFO_INIT;
unsigned long inflated;
+ off_t disk;
oi.sizep = &inflated;
+ oi.disk_sizep = &disk;
if (odb_read_object_info_extended(data->odb, &oids->oid[i], &oi,
OBJECT_INFO_SKIP_FETCH_OBJECT |
@@ -550,24 +563,29 @@ static int count_objects(const char *path UNUSED, struct oid_array *oids,
continue;
inflated_total += inflated;
+ disk_total += disk;
}
switch (type) {
case OBJ_TAG:
stats->type_counts.tags += oids->nr;
stats->inflated_sizes.tags += inflated_total;
+ stats->disk_sizes.tags += disk_total;
break;
case OBJ_COMMIT:
stats->type_counts.commits += oids->nr;
stats->inflated_sizes.commits += inflated_total;
+ stats->disk_sizes.commits += disk_total;
break;
case OBJ_TREE:
stats->type_counts.trees += oids->nr;
stats->inflated_sizes.trees += inflated_total;
+ stats->disk_sizes.trees += disk_total;
break;
case OBJ_BLOB:
stats->type_counts.blobs += oids->nr;
stats->inflated_sizes.blobs += inflated_total;
+ stats->disk_sizes.blobs += disk_total;
break;
default:
BUG("invalid object type");
diff --git a/t/t1901-repo-structure.sh b/t/t1901-repo-structure.sh
index b18213c660..dd17caad05 100755
--- a/t/t1901-repo-structure.sh
+++ b/t/t1901-repo-structure.sh
@@ -4,6 +4,11 @@ test_description='test git repo structure'
. ./test-lib.sh
+object_type_disk_usage() {
+ git rev-list --all --objects --disk-usage --filter=object:type=$1 \
+ --filter-provided-objects
+}
+
test_expect_success 'empty repository' '
test_when_finished "rm -rf repo" &&
git init repo &&
@@ -91,7 +96,7 @@ test_expect_success SHA1 'keyvalue and nul format' '
test_commit_bulk 42 &&
git tag -a foo -m bar &&
- cat >expect <<-\EOF &&
+ cat >expect <<-EOF &&
references.branches.count=1
references.tags.count=1
references.remotes.count=0
@@ -104,6 +109,10 @@ test_expect_success SHA1 'keyvalue and nul format' '
objects.trees.inflated_size=28554
objects.blobs.inflated_size=453
objects.tags.inflated_size=132
+ objects.commits.disk_size=$(object_type_disk_usage commit)
+ objects.trees.disk_size=$(object_type_disk_usage tree)
+ objects.blobs.disk_size=$(object_type_disk_usage blob)
+ objects.tags.disk_size=$(object_type_disk_usage tag)
EOF
git repo structure --format=keyvalue >out 2>err &&
--
2.52.0.209.ge85ae279b0
next prev parent reply other threads:[~2025-12-15 20:56 UTC|newest]
Thread overview: 80+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-12-09 22:58 [PATCH 0/6] builtin/repo: add object size info to structure output Justin Tobler
2025-12-09 22:58 ` [PATCH 1/6] builtin/repo: group per-type object values into struct Justin Tobler
2025-12-09 22:58 ` [PATCH 2/6] builtin/repo: humanise count values in structure output Justin Tobler
2025-12-10 6:28 ` Patrick Steinhardt
2025-12-10 15:10 ` Justin Tobler
2025-12-11 2:57 ` Junio C Hamano
2025-12-12 16:46 ` Justin Tobler
2025-12-09 22:58 ` [PATCH 3/6] builtin/repo: add inflated object info to keyvalue " Justin Tobler
2025-12-09 22:58 ` [PATCH 4/6] builtin/repo: add inflated object info to structure table Justin Tobler
2025-12-10 6:28 ` Patrick Steinhardt
2025-12-10 15:21 ` Justin Tobler
2025-12-09 22:58 ` [PATCH 5/6] builtin/repo: add disk size info to keyvalue stucture output Justin Tobler
2025-12-10 6:28 ` Patrick Steinhardt
2025-12-10 15:24 ` Justin Tobler
2025-12-12 20:40 ` Justin Tobler
2025-12-15 5:33 ` Patrick Steinhardt
2025-12-15 16:24 ` Justin Tobler
2025-12-10 14:58 ` Junio C Hamano
2025-12-10 19:09 ` Lucas Seiki Oshiro
2025-12-12 22:36 ` Justin Tobler
2025-12-12 23:58 ` Junio C Hamano
2025-12-09 22:58 ` [PATCH 6/6] builtin/repo: add object disk size info to structure table Justin Tobler
2025-12-10 6:28 ` Patrick Steinhardt
2025-12-10 15:24 ` Justin Tobler
2025-12-12 22:36 ` [PATCH v2 0/7] builtin/repo: add object size info to structure output Justin Tobler
2025-12-12 22:36 ` [PATCH v2 1/7] builtin/repo: group per-type object values into struct Justin Tobler
2025-12-12 22:36 ` [PATCH v2 2/7] strbuf: split out logic to humanise byte values Justin Tobler
2025-12-15 5:33 ` Patrick Steinhardt
2025-12-15 16:26 ` Justin Tobler
2025-12-15 8:21 ` Junio C Hamano
2025-12-15 16:47 ` Justin Tobler
2025-12-16 2:26 ` Jiang Xin
2025-12-16 4:37 ` Junio C Hamano
2025-12-16 6:18 ` Jiang Xin
2025-12-16 14:41 ` Justin Tobler
2025-12-12 22:36 ` [PATCH v2 3/7] builtin/repo: humanise count values in structure output Justin Tobler
2025-12-15 5:33 ` Patrick Steinhardt
2025-12-12 22:36 ` [PATCH v2 4/7] builtin/repo: add inflated object info to keyvalue " Justin Tobler
2025-12-15 5:33 ` Patrick Steinhardt
2025-12-15 16:48 ` Justin Tobler
2025-12-12 22:36 ` [PATCH v2 5/7] builtin/repo: add inflated object info to structure table Justin Tobler
2025-12-12 22:36 ` [PATCH v2 6/7] builtin/repo: add disk size info to keyvalue stucture output Justin Tobler
2025-12-15 5:33 ` Patrick Steinhardt
2025-12-12 22:36 ` [PATCH v2 7/7] builtin/repo: add object disk size info to structure table Justin Tobler
2025-12-15 20:56 ` [PATCH v3 0/7] builtin/repo: add object size info to structure output Justin Tobler
2025-12-15 20:56 ` [PATCH v3 1/7] builtin/repo: group per-type object values into struct Justin Tobler
2025-12-15 20:56 ` [PATCH v3 2/7] strbuf: split out logic to humanise byte values Justin Tobler
2025-12-16 1:19 ` Junio C Hamano
2025-12-16 1:36 ` Justin Tobler
2025-12-15 20:56 ` [PATCH v3 3/7] builtin/repo: humanise count values in structure output Justin Tobler
2025-12-16 8:25 ` Patrick Steinhardt
2025-12-15 20:56 ` [PATCH v3 4/7] builtin/repo: add inflated object info to keyvalue " Justin Tobler
2025-12-15 20:56 ` [PATCH v3 5/7] builtin/repo: add inflated object info to structure table Justin Tobler
2025-12-15 20:56 ` Justin Tobler [this message]
2025-12-15 20:56 ` [PATCH v3 7/7] builtin/repo: add object disk size " Justin Tobler
2025-12-16 8:25 ` Patrick Steinhardt
2025-12-16 14:48 ` Justin Tobler
2025-12-16 17:38 ` [PATCH v4 0/7] builtin/repo: add object size info to structure output Justin Tobler
2025-12-16 17:38 ` [PATCH v4 1/7] builtin/repo: group per-type object values into struct Justin Tobler
2025-12-16 17:38 ` [PATCH v4 2/7] strbuf: split out logic to humanise byte values Justin Tobler
2025-12-16 18:59 ` Junio C Hamano
2025-12-16 19:39 ` Justin Tobler
2025-12-16 17:38 ` [PATCH v4 3/7] builtin/repo: humanise count values in structure output Justin Tobler
2025-12-16 17:38 ` [PATCH v4 4/7] builtin/repo: add inflated object info to keyvalue " Justin Tobler
2025-12-17 7:03 ` Patrick Steinhardt
2025-12-17 16:10 ` Justin Tobler
2025-12-16 17:38 ` [PATCH v4 5/7] builtin/repo: add inflated object info to structure table Justin Tobler
2025-12-16 17:38 ` [PATCH v4 6/7] builtin/repo: add disk size info to keyvalue stucture output Justin Tobler
2025-12-16 17:38 ` [PATCH v4 7/7] builtin/repo: add object disk size info to structure table Justin Tobler
2025-12-17 7:03 ` [PATCH v4 0/7] builtin/repo: add object size info to structure output Patrick Steinhardt
2025-12-17 17:49 ` Justin Tobler
2025-12-17 17:53 ` [PATCH v5 " Justin Tobler
2025-12-17 17:53 ` [PATCH v5 1/7] builtin/repo: group per-type object values into struct Justin Tobler
2025-12-17 17:53 ` [PATCH v5 2/7] strbuf: split out logic to humanise byte values Justin Tobler
2025-12-17 17:54 ` [PATCH v5 3/7] builtin/repo: humanise count values in structure output Justin Tobler
2025-12-17 17:54 ` [PATCH v5 4/7] builtin/repo: add inflated object info to keyvalue " Justin Tobler
2025-12-17 17:54 ` [PATCH v5 5/7] builtin/repo: add inflated object info to structure table Justin Tobler
2025-12-17 17:54 ` [PATCH v5 6/7] builtin/repo: add disk size info to keyvalue stucture output Justin Tobler
2025-12-17 17:54 ` [PATCH v5 7/7] builtin/repo: add object disk size info to structure table Justin Tobler
2025-12-18 6:32 ` [PATCH v5 0/7] builtin/repo: add object size info to structure output Patrick Steinhardt
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20251215205639.2700270-7-jltobler@gmail.com \
--to=jltobler@gmail$(echo .)com \
--cc=git@vger$(echo .)kernel.org \
--cc=gitster@pobox$(echo .)com \
--cc=ps@pks$(echo .)im \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox