Commit a8d67afe42e6c79cb15383ceb1264f665dc4ad8d

nulltoken 2013-09-07T17:21:41

revparse: Prevent unnecessary odb backend calls

diff --git a/src/revparse.c b/src/revparse.c
index 329b96d..05ddc6c 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 9abca2b..b435294 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);
+}