Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@xxxxxxxxx> --- builtin/index-pack.c | 54 +++++++++++++++++++++++++++---------------------- 1 files changed, 30 insertions(+), 24 deletions(-) diff --git a/builtin/index-pack.c b/builtin/index-pack.c index ab24dd8..e1e858a 100644 --- a/builtin/index-pack.c +++ b/builtin/index-pack.c @@ -719,6 +719,35 @@ static int compare_delta_entry(const void *a, const void *b) objects[delta_b->obj_no].type); } +/* + * Second pass: + * - for all non-delta objects, look if it is used as a base for + * deltas; + * - if used as a base, uncompress the object and apply all deltas, + * recursively checking if the resulting object is used as a base + * for some more deltas. + * - if the same object exists in repository and we're not in strict + * mode, we skipped the sha-1 collision test in the first pass. + * Do it now. + */ +static void second_pass(struct object_entry *obj) +{ + struct base_data *base_obj = alloc_base_data(); + + if (((!strict && !verify) || + (strict && !verify && obj->type == OBJ_BLOB)) && + has_sha1_file(obj->idx.sha1)) { + void *data = get_data_from_pack(obj); + sha1_object(data, obj->size, obj->type, obj->idx.sha1); + free(data); + } + + base_obj->obj = obj; + base_obj->data = NULL; + find_unresolved_deltas(base_obj); + display_progress(progress, nr_resolved_deltas); +} + /* Parse all objects and return the pack content SHA1 hash */ static void parse_pack_objects(unsigned char *sha1) { @@ -773,38 +802,15 @@ static void parse_pack_objects(unsigned char *sha1) qsort(deltas, nr_deltas, sizeof(struct delta_entry), compare_delta_entry); - /* - * Second pass: - * - for all non-delta objects, look if it is used as a base for - * deltas; - * - if used as a base, uncompress the object and apply all deltas, - * recursively checking if the resulting object is used as a base - * for some more deltas. - * - if the same object exists in repository and we're not in strict - * mode, we skipped the sha-1 collision test in the first pass. - * Do it now. - */ if (verbose) progress = start_progress("Resolving deltas", nr_deltas); for (i = 0; i < nr_objects; i++) { struct object_entry *obj = &objects[i]; - struct base_data *base_obj = alloc_base_data(); if (is_delta_type(obj->type)) continue; - if (((!strict && !verify) || - (strict && !verify && obj->type == OBJ_BLOB)) && - has_sha1_file(obj->idx.sha1)) { - void *data = get_data_from_pack(obj); - sha1_object(data, obj->size, obj->type, obj->idx.sha1); - free(data); - } - - base_obj->obj = obj; - base_obj->data = NULL; - find_unresolved_deltas(base_obj); - display_progress(progress, nr_resolved_deltas); + second_pass(obj); } } -- 1.7.8.36.g69ee2 -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html