From a8d67afe42e6c79cb15383ceb1264f665dc4ad8d Mon Sep 17 00:00:00 2001 From: nulltoken Date: Sat, 7 Sep 2013 17:21:41 +0200 Subject: [PATCH 1/2] revparse: Prevent unnecessary odb backend calls --- src/revparse.c | 9 +++------ tests-clar/odb/backend/nonrefreshing.c | 13 +++++++++++++ 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/src/revparse.c b/src/revparse.c index 329b96dbc..05ddc6c35 100644 --- a/src/revparse.c +++ b/src/revparse.c @@ -115,12 +115,9 @@ static int revparse_lookup_object( if (error < 0 && error != GIT_ENOTFOUND) return error; - error = maybe_abbrev(object_out, repo, spec); - if (!error) - return 0; - - if (error < 0 && error != GIT_ENOTFOUND) - return error; + if ((strlen(spec) < GIT_OID_HEXSZ) && + ((error = maybe_abbrev(object_out, repo, spec)) != GIT_ENOTFOUND)) + return error; error = maybe_describe(object_out, repo, spec); if (!error) 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); +} From 1634df8c287da5acbe017ac786e2bb9fcd723eaa Mon Sep 17 00:00:00 2001 From: nulltoken Date: Sat, 7 Sep 2013 17:31:30 +0200 Subject: [PATCH 2/2] revparse: Simplify error handling --- src/revparse.c | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/src/revparse.c b/src/revparse.c index 05ddc6c35..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,18 +108,14 @@ static int revparse_lookup_object( return error; } - if (error < 0 && error != GIT_ENOTFOUND) + if (error != GIT_ENOTFOUND) return error; if ((strlen(spec) < GIT_OID_HEXSZ) && ((error = maybe_abbrev(object_out, repo, spec)) != 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);