summaryrefslogtreecommitdiff
path: root/commit-graph.c
diff options
context:
space:
mode:
Diffstat (limited to 'commit-graph.c')
-rw-r--r--commit-graph.c23
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);