To properly generate the compatibility hash objects that are referred to must be written before the objects that refer to them. When --strict is set the unpack-objects already writes objects in that order. When a compatibilty hash is desired force use of the same code path that --strict uses. If --strict is not wanted don't actually fsck the object buffers, just use fsck_walk to walk to the parents of the objects recursively. Unlike in index-pack nothing special needs to be done when an object is written. The guarantee that referred to objects are written to the loose object store before their refers ensures that the object mappings are in the loose object map. The object mapings being in the loose object map guarantees that the call to convert_object_file can find all of the mappings of the referred to objects. Signed-off-by: "Eric W. Biederman" <ebiederm@xxxxxxxxxxxx> --- builtin/unpack-objects.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/builtin/unpack-objects.c b/builtin/unpack-objects.c index 32505255a009..834551142cd8 100644 --- a/builtin/unpack-objects.c +++ b/builtin/unpack-objects.c @@ -241,7 +241,8 @@ static int check_object(struct object *obj, enum object_type type, obj_buf = lookup_object_buffer(obj); if (!obj_buf) die("Whoops! Cannot find object '%s'", oid_to_hex(&obj->oid)); - if (fsck_object(obj, obj_buf->buffer, obj_buf->size, &fsck_options)) + if (strict && + fsck_object(obj, obj_buf->buffer, obj_buf->size, &fsck_options)) die("fsck error in packed object"); fsck_options.walk = check_object; if (fsck_walk(obj, NULL, &fsck_options)) @@ -270,7 +271,7 @@ static void added_object(unsigned nr, enum object_type type, static void write_object(unsigned nr, enum object_type type, void *buf, unsigned long size) { - if (!strict) { + if (!strict && !the_repository->compat_hash_algo) { if (write_object_file(buf, size, type, &obj_list[nr].oid) < 0) die("failed to write object"); @@ -409,7 +410,7 @@ static void stream_blob(unsigned long size, unsigned nr) die(_("inflate returned (%d)"), data.status); git_inflate_end(&zstream); - if (strict) { + if (strict || the_repository->compat_hash_algo) { struct blob *blob = lookup_blob(the_repository, &info->oid); if (!blob) @@ -670,11 +671,10 @@ int cmd_unpack_objects(int argc, const char **argv, const char *prefix UNUSED) unpack_all(); the_hash_algo->update_fn(&ctx, buffer, offset); the_hash_algo->final_oid_fn(&oid, &ctx); - if (strict) { + if (strict || the_repository->compat_hash_algo) write_rest(); - if (fsck_finish(&fsck_options)) - die(_("fsck error in pack objects")); - } + if (strict && fsck_finish(&fsck_options)) + die(_("fsck error in pack objects")); if (!hasheq(fill(the_hash_algo->rawsz), oid.hash)) die("final sha1 did not match"); use(the_hash_algo->rawsz); -- 2.41.0