mirror of
https://github.com/git/git.git
synced 2025-12-12 20:36:24 +01:00
builtin/repo: add inflated object info to keyvalue structure output
The structure subcommand for git-repo(1) outputs basic count information for objects and references. Extend this output to also provide information regarding total size of inflated objects by object type. For now, object size by object type info is only added to the keyvalue and nul output formats. In a subsequent commit, this info is also added to the table format. Signed-off-by: Justin Tobler <jltobler@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
committed by
Junio C Hamano
parent
9deb65ae23
commit
d76924cf90
@@ -50,6 +50,7 @@ supported:
|
||||
+
|
||||
* Reference counts categorized by type
|
||||
* Reachable object counts categorized by type
|
||||
* Total inflated size of reachable objects by type
|
||||
|
||||
+
|
||||
The output format can be chosen through the flag `--format`. Three formats are
|
||||
|
||||
@@ -2,6 +2,8 @@
|
||||
|
||||
#include "builtin.h"
|
||||
#include "environment.h"
|
||||
#include "hex.h"
|
||||
#include "odb.h"
|
||||
#include "parse-options.h"
|
||||
#include "path-walk.h"
|
||||
#include "progress.h"
|
||||
@@ -211,6 +213,7 @@ struct object_values {
|
||||
|
||||
struct object_stats {
|
||||
struct object_values type_counts;
|
||||
struct object_values inflated_sizes;
|
||||
};
|
||||
|
||||
struct repo_structure {
|
||||
@@ -446,6 +449,15 @@ static void structure_keyvalue_print(struct repo_structure *stats,
|
||||
printf("objects.tags.count%c%" PRIuMAX "%c", key_delim,
|
||||
(uintmax_t)stats->objects.type_counts.tags, value_delim);
|
||||
|
||||
printf("objects.commits.inflated%c%" PRIuMAX "%c", key_delim,
|
||||
(uintmax_t)stats->objects.inflated_sizes.commits, value_delim);
|
||||
printf("objects.trees.inflated%c%" PRIuMAX "%c", key_delim,
|
||||
(uintmax_t)stats->objects.inflated_sizes.trees, value_delim);
|
||||
printf("objects.blobs.inflated%c%" PRIuMAX "%c", key_delim,
|
||||
(uintmax_t)stats->objects.inflated_sizes.blobs, value_delim);
|
||||
printf("objects.tags.inflated%c%" PRIuMAX "%c", key_delim,
|
||||
(uintmax_t)stats->objects.inflated_sizes.tags, value_delim);
|
||||
|
||||
fflush(stdout);
|
||||
}
|
||||
|
||||
@@ -509,6 +521,7 @@ static void structure_count_references(struct ref_stats *stats,
|
||||
}
|
||||
|
||||
struct count_objects_data {
|
||||
struct object_database *odb;
|
||||
struct object_stats *stats;
|
||||
struct progress *progress;
|
||||
};
|
||||
@@ -518,20 +531,39 @@ 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 object_count;
|
||||
|
||||
for (size_t i = 0; i < oids->nr; i++) {
|
||||
struct object_info oi = OBJECT_INFO_INIT;
|
||||
unsigned long inflated;
|
||||
|
||||
oi.sizep = &inflated;
|
||||
|
||||
if (odb_read_object_info_extended(data->odb, &oids->oid[i], &oi,
|
||||
OBJECT_INFO_FOR_PREFETCH) < 0)
|
||||
die(_("cannot read object for %s"),
|
||||
oid_to_hex(&oids->oid[i]));
|
||||
|
||||
inflated_total += inflated;
|
||||
}
|
||||
|
||||
switch (type) {
|
||||
case OBJ_TAG:
|
||||
stats->type_counts.tags += oids->nr;
|
||||
stats->inflated_sizes.tags += inflated_total;
|
||||
break;
|
||||
case OBJ_COMMIT:
|
||||
stats->type_counts.commits += oids->nr;
|
||||
stats->inflated_sizes.commits += inflated_total;
|
||||
break;
|
||||
case OBJ_TREE:
|
||||
stats->type_counts.trees += oids->nr;
|
||||
stats->inflated_sizes.trees += inflated_total;
|
||||
break;
|
||||
case OBJ_BLOB:
|
||||
stats->type_counts.blobs += oids->nr;
|
||||
stats->inflated_sizes.blobs += inflated_total;
|
||||
break;
|
||||
default:
|
||||
BUG("invalid object type");
|
||||
@@ -549,6 +581,7 @@ static void structure_count_objects(struct object_stats *stats,
|
||||
{
|
||||
struct path_walk_info info = PATH_WALK_INFO_INIT;
|
||||
struct count_objects_data data = {
|
||||
.odb = repo->objects,
|
||||
.stats = stats,
|
||||
};
|
||||
|
||||
|
||||
@@ -73,7 +73,7 @@ test_expect_success 'repository with references and objects' '
|
||||
)
|
||||
'
|
||||
|
||||
test_expect_success 'keyvalue and nul format' '
|
||||
test_expect_success SHA1 'keyvalue and nul format' '
|
||||
test_when_finished "rm -rf repo" &&
|
||||
git init repo &&
|
||||
(
|
||||
@@ -90,6 +90,10 @@ test_expect_success 'keyvalue and nul format' '
|
||||
objects.trees.count=42
|
||||
objects.blobs.count=42
|
||||
objects.tags.count=1
|
||||
objects.commits.inflated=9225
|
||||
objects.trees.inflated=28554
|
||||
objects.blobs.inflated=453
|
||||
objects.tags.inflated=132
|
||||
EOF
|
||||
|
||||
git repo structure --format=keyvalue >out 2>err &&
|
||||
|
||||
Reference in New Issue
Block a user