From: Derrick Stolee <dsto...@microsoft.com>

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 <dsto...@microsoft.com>
---
 commit-graph.c | 23 +++++++++++++++++++++++
 1 file changed, 23 insertions(+)

diff --git a/commit-graph.c b/commit-graph.c
index 2f2e2c7083..fc7b4fa622 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);
 
-- 
2.14.1

Reply via email to