diff --git a/src/revparse.c b/src/revparse.c index 329b96dbc..3dde22ce1 100644 --- a/src/revparse.c +++ b/src/revparse.c @@ -93,11 +93,7 @@ static int revparse_lookup_object( int error; git_reference *ref; - error = maybe_sha(object_out, repo, spec); - if (!error) - return 0; - - if (error < 0 && error != GIT_ENOTFOUND) + if ((error = maybe_sha(object_out, repo, spec)) != GIT_ENOTFOUND) return error; error = git_reference_dwim(&ref, repo, spec); @@ -112,21 +108,14 @@ static int revparse_lookup_object( return error; } - if (error < 0 && error != GIT_ENOTFOUND) + if (error != GIT_ENOTFOUND) return error; - error = maybe_abbrev(object_out, repo, spec); - if (!error) - return 0; + if ((strlen(spec) < GIT_OID_HEXSZ) && + ((error = maybe_abbrev(object_out, repo, spec)) != GIT_ENOTFOUND)) + return error; - if (error < 0 && error != GIT_ENOTFOUND) - return error; - - error = maybe_describe(object_out, repo, spec); - if (!error) - return 0; - - if (error < 0 && error != GIT_ENOTFOUND) + if ((error = maybe_describe(object_out, repo, spec)) != GIT_ENOTFOUND) return error; giterr_set(GITERR_REFERENCE, "Revspec '%s' not found.", spec); diff --git a/tests-clar/odb/backend/nonrefreshing.c b/tests-clar/odb/backend/nonrefreshing.c index 9abca2bd3..b43529479 100644 --- a/tests-clar/odb/backend/nonrefreshing.c +++ b/tests-clar/odb/backend/nonrefreshing.c @@ -259,3 +259,16 @@ void test_odb_backend_nonrefreshing__readheader_is_invoked_once_on_success(void) cl_assert_equal_i(1, _fake->read_header_calls); } + +void test_odb_backend_nonrefreshing__read_is_invoked_once_when_revparsing_a_full_oid(void) +{ + git_object *obj; + + setup_repository_and_backend(GIT_ENOTFOUND); + + cl_git_fail_with( + git_revparse_single(&obj, _repo, "deadbeefdeadbeefdeadbeefdeadbeefdeadbeef"), + GIT_ENOTFOUND); + + cl_assert_equal_i(1, _fake->read_calls); +}