Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@xxxxxxxxx> --- builtin/pack-objects.c | 4 ++-- delta-islands.c | 24 ++++++++++++++---------- delta-islands.h | 9 ++++++--- 3 files changed, 22 insertions(+), 15 deletions(-) diff --git a/builtin/pack-objects.c b/builtin/pack-objects.c index c99ee79c31..7812c2b1f3 100644 --- a/builtin/pack-objects.c +++ b/builtin/pack-objects.c @@ -2628,7 +2628,7 @@ static void prepare_pack(int window, int depth) unsigned n; if (use_delta_islands) - resolve_tree_islands(progress, &to_pack); + resolve_tree_islands(the_repository, progress, &to_pack); get_object_details(); @@ -3143,7 +3143,7 @@ static void get_object_list(int ac, const char **av) return; if (use_delta_islands) - load_delta_islands(); + load_delta_islands(the_repository); if (prepare_revision_walk(&revs)) die(_("revision walk setup failed")); diff --git a/delta-islands.c b/delta-islands.c index 8e5018e406..191a930705 100644 --- a/delta-islands.c +++ b/delta-islands.c @@ -190,13 +190,15 @@ static void set_island_marks(struct object *obj, struct island_bitmap *marks) island_bitmap_or(b, marks); } -static void mark_remote_island_1(struct remote_island *rl, int is_core_island) +static void mark_remote_island_1(struct repository *r, + struct remote_island *rl, + int is_core_island) { uint32_t i; for (i = 0; i < rl->oids.nr; ++i) { struct island_bitmap *marks; - struct object *obj = parse_object(the_repository, &rl->oids.oid[i]); + struct object *obj = parse_object(r, &rl->oids.oid[i]); if (!obj) continue; @@ -211,7 +213,7 @@ static void mark_remote_island_1(struct remote_island *rl, int is_core_island) while (obj && obj->type == OBJ_TAG) { obj = ((struct tag *)obj)->tagged; if (obj) { - parse_object(the_repository, &obj->oid); + parse_object(r, &obj->oid); marks = create_or_get_island_marks(obj); island_bitmap_set(marks, island_counter); } @@ -237,7 +239,9 @@ static int tree_depth_compare(const void *a, const void *b) return todo_a->depth - todo_b->depth; } -void resolve_tree_islands(int progress, struct packing_data *to_pack) +void resolve_tree_islands(struct repository *r, + int progress, + struct packing_data *to_pack) { struct progress *progress_state = NULL; struct tree_islands_todo *todo; @@ -281,7 +285,7 @@ void resolve_tree_islands(int progress, struct packing_data *to_pack) root_marks = kh_value(island_marks, pos); - tree = lookup_tree(the_repository, &ent->idx.oid); + tree = lookup_tree(r, &ent->idx.oid); if (!tree || parse_tree(tree) < 0) die(_("bad tree object %s"), oid_to_hex(&ent->idx.oid)); @@ -292,7 +296,7 @@ void resolve_tree_islands(int progress, struct packing_data *to_pack) if (S_ISGITLINK(entry.mode)) continue; - obj = lookup_object(the_repository, entry.oid->hash); + obj = lookup_object(r, entry.oid->hash); if (!obj) continue; @@ -415,7 +419,7 @@ static struct remote_island *get_core_island(void) return NULL; } -static void deduplicate_islands(void) +static void deduplicate_islands(struct repository *r) { struct remote_island *island, *core = NULL, **list; unsigned int island_count, dst, src, ref, i = 0; @@ -444,20 +448,20 @@ static void deduplicate_islands(void) core = get_core_island(); for (i = 0; i < island_count; ++i) { - mark_remote_island_1(list[i], core && list[i]->hash == core->hash); + mark_remote_island_1(r, list[i], core && list[i]->hash == core->hash); } free(list); } -void load_delta_islands(void) +void load_delta_islands(struct repository *r) { island_marks = kh_init_sha1(); remote_islands = kh_init_str(); git_config(island_config_callback, NULL); for_each_ref(find_island_for_ref, NULL); - deduplicate_islands(); + deduplicate_islands(r); fprintf(stderr, _("Marked %d islands, done.\n"), island_counter); } diff --git a/delta-islands.h b/delta-islands.h index b635cd07d8..3ac8045d8c 100644 --- a/delta-islands.h +++ b/delta-islands.h @@ -1,14 +1,17 @@ #ifndef DELTA_ISLANDS_H #define DELTA_ISLANDS_H +struct commit; struct object_id; struct packing_data; -struct commit; +struct repository; int island_delta_cmp(const struct object_id *a, const struct object_id *b); int in_same_island(const struct object_id *, const struct object_id *); -void resolve_tree_islands(int progress, struct packing_data *to_pack); -void load_delta_islands(void); +void resolve_tree_islands(struct repository *r, + int progress, + struct packing_data *to_pack); +void load_delta_islands(struct repository *r); void propagate_island_marks(struct commit *commit); int compute_pack_layers(struct packing_data *to_pack); -- 2.19.1.1231.g84aef82467