aboutsummaryrefslogtreecommitdiff
path: root/commit-graph.c
diff options
context:
space:
mode:
Diffstat (limited to 'commit-graph.c')
-rw-r--r--commit-graph.c56
1 files changed, 40 insertions, 16 deletions
diff --git a/commit-graph.c b/commit-graph.c
index ad3582451d..9abe62bd5a 100644
--- a/commit-graph.c
+++ b/commit-graph.c
@@ -965,7 +965,7 @@ static int fill_commit_in_graph(struct commit *item,
do {
if (g->chunk_extra_edges_size / sizeof(uint32_t) <= parent_data_pos) {
error(_("commit-graph extra-edges pointer out of bounds"));
- free_commit_list(item->parents);
+ commit_list_free(item->parents);
item->parents = NULL;
item->object.parsed = 0;
return 0;
@@ -1510,30 +1510,38 @@ static int write_graph_chunk_bloom_data(struct hashfile *f,
return 0;
}
+static int add_packed_commits_oi(const struct object_id *oid,
+ struct object_info *oi,
+ void *data)
+{
+ struct write_commit_graph_context *ctx = (struct write_commit_graph_context*)data;
+
+ if (ctx->progress)
+ display_progress(ctx->progress, ++ctx->progress_done);
+
+ if (*oi->typep != OBJ_COMMIT)
+ return 0;
+
+ oid_array_append(&ctx->oids, oid);
+ set_commit_pos(ctx->r, oid);
+
+ return 0;
+}
+
static int add_packed_commits(const struct object_id *oid,
struct packed_git *pack,
uint32_t pos,
void *data)
{
- struct write_commit_graph_context *ctx = (struct write_commit_graph_context*)data;
enum object_type type;
off_t offset = nth_packed_object_offset(pack, pos);
struct object_info oi = OBJECT_INFO_INIT;
- if (ctx->progress)
- display_progress(ctx->progress, ++ctx->progress_done);
-
oi.typep = &type;
if (packed_object_info(pack, offset, &oi) < 0)
die(_("unable to get type of object %s"), oid_to_hex(oid));
- if (type != OBJ_COMMIT)
- return 0;
-
- oid_array_append(&ctx->oids, oid);
- set_commit_pos(ctx->r, oid);
-
- return 0;
+ return add_packed_commits_oi(oid, &oi, data);
}
static void add_missing_parents(struct write_commit_graph_context *ctx, struct commit *commit)
@@ -1958,7 +1966,7 @@ static int fill_oids_from_packs(struct write_commit_graph_context *ctx,
goto cleanup;
}
for_each_object_in_pack(p, add_packed_commits, ctx,
- FOR_EACH_OBJECT_PACK_ORDER);
+ ODB_FOR_EACH_OBJECT_PACK_ORDER);
close_pack(p);
free(p);
}
@@ -1990,13 +1998,28 @@ static int fill_oids_from_commits(struct write_commit_graph_context *ctx,
static void fill_oids_from_all_packs(struct write_commit_graph_context *ctx)
{
+ struct odb_source *source;
+ enum object_type type;
+ struct odb_for_each_object_options opts = {
+ .flags = ODB_FOR_EACH_OBJECT_PACK_ORDER,
+ };
+ struct object_info oi = {
+ .typep = &type,
+ };
+
if (ctx->report_progress)
ctx->progress = start_delayed_progress(
ctx->r,
_("Finding commits for commit graph among packed objects"),
ctx->approx_nr_objects);
- for_each_packed_object(ctx->r, add_packed_commits, ctx,
- FOR_EACH_OBJECT_PACK_ORDER);
+
+ odb_prepare_alternates(ctx->r->objects);
+ for (source = ctx->r->objects->sources; source; source = source->next) {
+ struct odb_source_files *files = odb_source_files_downcast(source);
+ packfile_store_for_each_object(files->packed, &oi, add_packed_commits_oi,
+ ctx, &opts);
+ }
+
if (ctx->progress_done < ctx->approx_nr_objects)
display_progress(ctx->progress, ctx->approx_nr_objects);
stop_progress(&ctx->progress);
@@ -2618,7 +2641,8 @@ int write_commit_graph(struct odb_source *source,
replace = ctx.opts->split_flags & COMMIT_GRAPH_SPLIT_REPLACE;
}
- ctx.approx_nr_objects = repo_approximate_object_count(r);
+ if (odb_count_objects(r->objects, ODB_COUNT_OBJECTS_APPROXIMATE, &ctx.approx_nr_objects) < 0)
+ ctx.approx_nr_objects = 0;
if (ctx.append && g) {
for (i = 0; i < g->num_commits; i++) {