From 1bbcb2b279b2a5b8cdf5687daf023cd67cb33ed7 Mon Sep 17 00:00:00 2001 From: Vicent Marti Date: Wed, 9 Mar 2016 17:47:53 +0100 Subject: [PATCH] odb: Try to lookup headers in all backends before passthrough --- src/odb.c | 25 ++++++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/src/odb.c b/src/odb.c index 17f9b37b8..890e6e2f8 100644 --- a/src/odb.c +++ b/src/odb.c @@ -855,8 +855,9 @@ static int odb_read_header_1( const git_oid *id, bool only_refreshed) { size_t i; - int error = GIT_PASSTHROUGH; git_otype ht; + bool passthrough = false; + int error; if (!only_refreshed && (ht = odb_hardcoded_type(id)) != GIT_OBJ_BAD) { *type_p = ht; @@ -864,18 +865,32 @@ static int odb_read_header_1( return 0; } - for (i = 0; i < db->backends.length && error < 0; ++i) { + for (i = 0; i < db->backends.length; ++i) { backend_internal *internal = git_vector_get(&db->backends, i); git_odb_backend *b = internal->backend; if (only_refreshed && !b->refresh) continue; - if (b->read_header != NULL) - error = b->read_header(len_p, type_p, b, id); + if (!b->read_header) { + passthrough = true; + continue; + } + + error = b->read_header(len_p, type_p, b, id); + + switch (error) { + case GIT_PASSTHROUGH: + passthrough = true; + break; + case GIT_ENOTFOUND: + break; + default: + return error; + } } - return error; + return passthrough ? GIT_PASSTHROUGH : GIT_ENOTFOUND; } int git_odb__read_header_or_object(