2
3
#include "builtin.h"
4
#include "environment.h"
5
+#include "hash.h"
6
#include "hex.h"
7
#include "odb.h"
8
#include "parse-options.h"
198
return print_fields(argc, argv, repo, format);
199
}
200
201
+struct object_data {
202
+ struct object_id oid;
203
+ size_t value;
204
+};
205
+
206
+struct largest_objects {
207
+ struct object_data tag_size;
208
+ struct object_data commit_size;
209
+ struct object_data tree_size;
210
+ struct object_data blob_size;
211
+};
212
+
213
struct ref_stats {
214
size_t branches;
215
size_t remotes;
228
struct object_values type_counts;
229
struct object_values inflated_sizes;
230
struct object_values disk_sizes;
231
+ struct largest_objects largest;
232
};
233
234
struct repo_structure {
385
" * %s", _("Blobs"));
386
stats_table_size_addf(table, objects->disk_sizes.tags,
387
" * %s", _("Tags"));
388
+
389
+ stats_table_addf(table, "");
390
+ stats_table_addf(table, "* %s", _("Largest objects"));
391
+ stats_table_addf(table, " * %s", _("Commits"));
392
+ stats_table_size_addf(table, objects->largest.commit_size.value,
393
+ " * %s", _("Maximum size"));
394
+ stats_table_addf(table, " * %s", _("Trees"));
395
+ stats_table_size_addf(table, objects->largest.tree_size.value,
396
+ " * %s", _("Maximum size"));
397
+ stats_table_addf(table, " * %s", _("Blobs"));
398
+ stats_table_size_addf(table, objects->largest.blob_size.value,
399
+ " * %s", _("Maximum size"));
400
+ stats_table_addf(table, " * %s", _("Tags"));
401
+ stats_table_size_addf(table, objects->largest.tag_size.value,
402
+ " * %s", _("Maximum size"));
403
}
404
405
static void stats_table_print_structure(const struct stats_table *table)
482
value_delim);
483
}
484
485
+static void print_object_data(const char *key, char key_delim,
486
+ struct object_data *data, char value_delim)
487
+{
488
+ print_keyvalue(key, key_delim, data->value, value_delim);
489
+ printf("%s_oid%c%s%c", key, key_delim, oid_to_hex(&data->oid),
490
+ value_delim);
491
+}
492
+
493
static void structure_keyvalue_print(struct repo_structure *stats,
494
char key_delim, char value_delim)
495
{
529
print_keyvalue("objects.tags.disk_size", key_delim,
530
stats->objects.disk_sizes.tags, value_delim);
531
532
+ print_object_data("objects.commits.max_size", key_delim,
533
+ &stats->objects.largest.commit_size, value_delim);
534
+ print_object_data("objects.trees.max_size", key_delim,
535
+ &stats->objects.largest.tree_size, value_delim);
536
+ print_object_data("objects.blobs.max_size", key_delim,
537
+ &stats->objects.largest.blob_size, value_delim);
538
+ print_object_data("objects.tags.max_size", key_delim,
539
+ &stats->objects.largest.tag_size, value_delim);
540
+
541
fflush(stdout);
542
}
543
606
struct progress *progress;
607
};
608
609
+static void check_largest(struct object_data *data, struct object_id *oid,
610
+ size_t value)
611
+{
612
+ if (value > data->value || is_null_oid(&data->oid)) {
613
+ oidcpy(&data->oid, oid);
614
+ data->value = value;
615
+ }
616
+}
617
+
618
static int count_objects(const char *path UNUSED, struct oid_array *oids,
619
enum object_type type, void *cb_data)
620
{
640
stats->type_counts.tags++;
641
stats->inflated_sizes.tags += inflated;
642
stats->disk_sizes.tags += disk;
643
+ check_largest(&stats->largest.tag_size, &oids->oid[i],
644
+ inflated);
645
break;
646
case OBJ_COMMIT:
647
stats->type_counts.commits++;
648
stats->inflated_sizes.commits += inflated;
649
stats->disk_sizes.commits += disk;
650
+ check_largest(&stats->largest.commit_size, &oids->oid[i],
651
+ inflated);
652
break;
653
case OBJ_TREE:
654
stats->type_counts.trees++;
655
stats->inflated_sizes.trees += inflated;
656
stats->disk_sizes.trees += disk;
657
+ check_largest(&stats->largest.tree_size, &oids->oid[i],
658
+ inflated);
659
break;
660
case OBJ_BLOB:
661
stats->type_counts.blobs++;
662
stats->inflated_sizes.blobs += inflated;
663
stats->disk_sizes.blobs += disk;
664
+ check_largest(&stats->largest.blob_size, &oids->oid[i],
665
+ inflated);
666
break;
667
default:
668
BUG("invalid object type");