mirror of
https://github.com/git/git.git
synced 2026-03-04 14:37:35 +01:00
builtin/repo: find commit with most parents
Complex merge events may produce an octopus merge where the resulting merge commit has more than two parents. While iterating through objects in the repository for git-repo-structure, identify the commit with the most parents and display it in the output. 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
e00bb8c76e
commit
18952a1ef1
@@ -1,6 +1,7 @@
|
||||
#define USE_THE_REPOSITORY_VARIABLE
|
||||
|
||||
#include "builtin.h"
|
||||
#include "commit.h"
|
||||
#include "environment.h"
|
||||
#include "hash.h"
|
||||
#include "hex.h"
|
||||
@@ -208,6 +209,8 @@ struct largest_objects {
|
||||
struct object_data commit_size;
|
||||
struct object_data tree_size;
|
||||
struct object_data blob_size;
|
||||
|
||||
struct object_data parent_count;
|
||||
};
|
||||
|
||||
struct ref_stats {
|
||||
@@ -318,6 +321,27 @@ static void stats_table_count_addf(struct stats_table *table, size_t value,
|
||||
va_end(ap);
|
||||
}
|
||||
|
||||
static void stats_table_object_count_addf(struct stats_table *table,
|
||||
struct object_id *oid, size_t value,
|
||||
const char *format, ...)
|
||||
{
|
||||
struct stats_table_entry *entry;
|
||||
va_list ap;
|
||||
|
||||
CALLOC_ARRAY(entry, 1);
|
||||
humanise_count(value, &entry->value, &entry->unit);
|
||||
|
||||
/*
|
||||
* A NULL OID should not have a table annotation.
|
||||
*/
|
||||
if (!is_null_oid(oid))
|
||||
entry->oid = oid;
|
||||
|
||||
va_start(ap, format);
|
||||
stats_table_vaddf(table, entry, format, ap);
|
||||
va_end(ap);
|
||||
}
|
||||
|
||||
static void stats_table_size_addf(struct stats_table *table, size_t value,
|
||||
const char *format, ...)
|
||||
{
|
||||
@@ -425,6 +449,10 @@ static void stats_table_setup_structure(struct stats_table *table,
|
||||
&objects->largest.commit_size.oid,
|
||||
objects->largest.commit_size.value,
|
||||
" * %s", _("Maximum size"));
|
||||
stats_table_object_count_addf(table,
|
||||
&objects->largest.parent_count.oid,
|
||||
objects->largest.parent_count.value,
|
||||
" * %s", _("Maximum parents"));
|
||||
stats_table_addf(table, " * %s", _("Trees"));
|
||||
stats_table_object_size_addf(table,
|
||||
&objects->largest.tree_size.oid,
|
||||
@@ -595,6 +623,9 @@ static void structure_keyvalue_print(struct repo_structure *stats,
|
||||
print_object_data("objects.tags.max_size", key_delim,
|
||||
&stats->objects.largest.tag_size, value_delim);
|
||||
|
||||
print_object_data("objects.commits.max_parents", key_delim,
|
||||
&stats->objects.largest.parent_count, value_delim);
|
||||
|
||||
fflush(stdout);
|
||||
}
|
||||
|
||||
@@ -682,16 +713,24 @@ static int count_objects(const char *path UNUSED, struct oid_array *oids,
|
||||
for (size_t i = 0; i < oids->nr; i++) {
|
||||
struct object_info oi = OBJECT_INFO_INIT;
|
||||
unsigned long inflated;
|
||||
struct commit *commit;
|
||||
struct object *obj;
|
||||
void *content;
|
||||
off_t disk;
|
||||
int eaten;
|
||||
|
||||
oi.sizep = &inflated;
|
||||
oi.disk_sizep = &disk;
|
||||
oi.contentp = &content;
|
||||
|
||||
if (odb_read_object_info_extended(data->odb, &oids->oid[i], &oi,
|
||||
OBJECT_INFO_SKIP_FETCH_OBJECT |
|
||||
OBJECT_INFO_QUICK) < 0)
|
||||
continue;
|
||||
|
||||
obj = parse_object_buffer(the_repository, &oids->oid[i], type,
|
||||
inflated, content, &eaten);
|
||||
|
||||
switch (type) {
|
||||
case OBJ_TAG:
|
||||
stats->type_counts.tags++;
|
||||
@@ -701,11 +740,14 @@ static int count_objects(const char *path UNUSED, struct oid_array *oids,
|
||||
inflated);
|
||||
break;
|
||||
case OBJ_COMMIT:
|
||||
commit = object_as_type(obj, OBJ_COMMIT, 0);
|
||||
stats->type_counts.commits++;
|
||||
stats->inflated_sizes.commits += inflated;
|
||||
stats->disk_sizes.commits += disk;
|
||||
check_largest(&stats->largest.commit_size, &oids->oid[i],
|
||||
inflated);
|
||||
check_largest(&stats->largest.parent_count, &oids->oid[i],
|
||||
commit_list_count(commit->parents));
|
||||
break;
|
||||
case OBJ_TREE:
|
||||
stats->type_counts.trees++;
|
||||
@@ -724,6 +766,9 @@ static int count_objects(const char *path UNUSED, struct oid_array *oids,
|
||||
default:
|
||||
BUG("invalid object type");
|
||||
}
|
||||
|
||||
if (!eaten)
|
||||
free(content);
|
||||
}
|
||||
|
||||
object_count = get_total_object_values(&stats->type_counts);
|
||||
|
||||
@@ -27,41 +27,42 @@ test_expect_success 'empty repository' '
|
||||
(
|
||||
cd repo &&
|
||||
cat >expect <<-\EOF &&
|
||||
| Repository structure | Value |
|
||||
| ------------------------ | ------ |
|
||||
| * References | |
|
||||
| * Count | 0 |
|
||||
| * Branches | 0 |
|
||||
| * Tags | 0 |
|
||||
| * Remotes | 0 |
|
||||
| * Others | 0 |
|
||||
| | |
|
||||
| * Reachable objects | |
|
||||
| * 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 |
|
||||
| * Disk size | 0 B |
|
||||
| * Commits | 0 B |
|
||||
| * Trees | 0 B |
|
||||
| * Blobs | 0 B |
|
||||
| * Tags | 0 B |
|
||||
| | |
|
||||
| * Largest objects | |
|
||||
| * Commits | |
|
||||
| * Maximum size | 0 B |
|
||||
| * Trees | |
|
||||
| * Maximum size | 0 B |
|
||||
| * Blobs | |
|
||||
| * Maximum size | 0 B |
|
||||
| * Tags | |
|
||||
| * Maximum size | 0 B |
|
||||
| Repository structure | Value |
|
||||
| ------------------------- | ------ |
|
||||
| * References | |
|
||||
| * Count | 0 |
|
||||
| * Branches | 0 |
|
||||
| * Tags | 0 |
|
||||
| * Remotes | 0 |
|
||||
| * Others | 0 |
|
||||
| | |
|
||||
| * Reachable objects | |
|
||||
| * 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 |
|
||||
| * Disk size | 0 B |
|
||||
| * Commits | 0 B |
|
||||
| * Trees | 0 B |
|
||||
| * Blobs | 0 B |
|
||||
| * Tags | 0 B |
|
||||
| | |
|
||||
| * Largest objects | |
|
||||
| * Commits | |
|
||||
| * Maximum size | 0 B |
|
||||
| * Maximum parents | 0 |
|
||||
| * Trees | |
|
||||
| * Maximum size | 0 B |
|
||||
| * Blobs | |
|
||||
| * Maximum size | 0 B |
|
||||
| * Tags | |
|
||||
| * Maximum size | 0 B |
|
||||
EOF
|
||||
|
||||
git repo structure >out 2>err &&
|
||||
@@ -89,46 +90,48 @@ test_expect_success SHA1 'repository with references and objects' '
|
||||
# git-rev-list(1) --disk-usage=human option printing the full
|
||||
# "byte/bytes" unit string instead of just "B".
|
||||
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 |
|
||||
| * Inflated size | 16.03 MiB |
|
||||
| * Commits | 217.92 KiB |
|
||||
| * Trees | 15.81 MiB |
|
||||
| * Blobs | 11.68 KiB |
|
||||
| * Tags | 132 B |
|
||||
| * Disk size | $(object_type_disk_usage all true) |
|
||||
| * Commits | $(object_type_disk_usage commit true) |
|
||||
| * Trees | $(object_type_disk_usage tree true) |
|
||||
| * Blobs | $(object_type_disk_usage blob true) |
|
||||
| * Tags | $(object_type_disk_usage tag) B |
|
||||
| | |
|
||||
| * Largest objects | |
|
||||
| * Commits | |
|
||||
| * Maximum size [1] | 223 B |
|
||||
| * Trees | |
|
||||
| * Maximum size [2] | 32.29 KiB |
|
||||
| * Blobs | |
|
||||
| * Maximum size [3] | 13 B |
|
||||
| * Tags | |
|
||||
| * Maximum size [4] | 132 B |
|
||||
| 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 |
|
||||
| * Disk size | $(object_type_disk_usage all true) |
|
||||
| * Commits | $(object_type_disk_usage commit true) |
|
||||
| * Trees | $(object_type_disk_usage tree true) |
|
||||
| * Blobs | $(object_type_disk_usage blob true) |
|
||||
| * Tags | $(object_type_disk_usage tag) B |
|
||||
| | |
|
||||
| * Largest objects | |
|
||||
| * Commits | |
|
||||
| * Maximum size [1] | 223 B |
|
||||
| * Maximum parents [2] | 1 |
|
||||
| * Trees | |
|
||||
| * Maximum size [3] | 32.29 KiB |
|
||||
| * Blobs | |
|
||||
| * Maximum size [4] | 13 B |
|
||||
| * Tags | |
|
||||
| * Maximum size [5] | 132 B |
|
||||
|
||||
[1] 0dc91eb18580102a3a216c8bfecedeba2b9f9b9a
|
||||
[2] 60665251ab71dbd8c18d9bf2174f4ee0d58aa06c
|
||||
[3] 97d808e45116bf02103490294d3d46dad7a2ac62
|
||||
[4] 4dae4f5954f5e6feb3577cfb1b181daa3fd3afd2
|
||||
[2] 0dc91eb18580102a3a216c8bfecedeba2b9f9b9a
|
||||
[3] 60665251ab71dbd8c18d9bf2174f4ee0d58aa06c
|
||||
[4] 97d808e45116bf02103490294d3d46dad7a2ac62
|
||||
[5] 4dae4f5954f5e6feb3577cfb1b181daa3fd3afd2
|
||||
EOF
|
||||
|
||||
git repo structure >out 2>err &&
|
||||
@@ -171,6 +174,8 @@ test_expect_success SHA1 'keyvalue and nul format' '
|
||||
objects.blobs.max_size_oid=eaeeedced46482bd4281fda5a5f05ce24854151f
|
||||
objects.tags.max_size=132
|
||||
objects.tags.max_size_oid=1ee0f2b16ea37d895dbe9dbd76cd2ac70446176c
|
||||
objects.commits.max_parents=1
|
||||
objects.commits.max_parents_oid=de3508174b5c2ace6993da67cae9be9069e2df39
|
||||
EOF
|
||||
|
||||
git repo structure --format=keyvalue >out 2>err &&
|
||||
|
||||
Reference in New Issue
Block a user