diff options
author | Derrick Stolee <dstolee@microsoft.com> | 2018-03-14 15:27:32 -0400 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2018-03-14 13:58:14 -0700 |
commit | 0b6d9dccc723077584bbd2fd46f5082b299cfaff (patch) | |
tree | d0e511b5373baadff292cf8e186105358d5a1e44 /commit-graph.c | |
parent | a485803758cb4160d7819238623e9e71ec54e9c0 (diff) | |
download | git-0b6d9dccc723077584bbd2fd46f5082b299cfaff.tar.gz |
commit-graph: close under reachability
Teach write_commit_graph() to walk all parents from the commits
discovered in packfiles. This prevents gaps given by loose objects or
previously-missed packfiles.
Also automatically add commits from the existing graph file, if it
exists.
Signed-off-by: Derrick Stolee <dstolee@microsoft.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'commit-graph.c')
-rw-r--r-- | commit-graph.c | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/commit-graph.c b/commit-graph.c index 94c5fed6f5..ee720e9a17 100644 --- a/commit-graph.c +++ b/commit-graph.c @@ -369,6 +369,28 @@ static int add_packed_commits(const struct object_id *oid, return 0; } +static void close_reachable(struct packed_oid_list *oids) +{ + int i; + struct rev_info revs; + struct commit *commit; + init_revisions(&revs, NULL); + for (i = 0; i < oids->nr; i++) { + commit = lookup_commit(&oids->list[i]); + if (commit && !parse_commit(commit)) + revs.commits = commit_list_insert(commit, &revs.commits); + } + + if (prepare_revision_walk(&revs)) + die(_("revision walk setup failed")); + + while ((commit = get_revision(&revs)) != NULL) { + ALLOC_GROW(oids->list, oids->nr + 1, oids->alloc); + oidcpy(&oids->list[oids->nr], &(commit->object.oid)); + (oids->nr)++; + } +} + void write_commit_graph(const char *obj_dir) { struct packed_oid_list oids; @@ -392,6 +414,7 @@ void write_commit_graph(const char *obj_dir) ALLOC_ARRAY(oids.list, oids.alloc); for_each_packed_object(add_packed_commits, &oids, 0); + close_reachable(&oids); QSORT(oids.list, oids.nr, commit_compare); |