summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authornulltoken <emeric.fermas@gmail.com>2013-09-08 18:25:17 +0200
committernulltoken <emeric.fermas@gmail.com>2013-09-10 22:36:13 +0200
commit209f9b67c4f9b2c5bba26f2bdcbee10cf4e25a6b (patch)
treebc19fe59de8f13a71f6cba58adb16c9495d69bfa
parentd0cd6c427a35b257373c7178d1e17d82001e125f (diff)
downloadlibgit2-209f9b67c4f9b2c5bba26f2bdcbee10cf4e25a6b.tar.gz
odb: Teach loose backend to return EAMBIGUOUS
-rw-r--r--src/odb_loose.c8
-rw-r--r--tests-clar/refs/revparse.c31
2 files changed, 37 insertions, 2 deletions
diff --git a/src/odb_loose.c b/src/odb_loose.c
index ce63f4673..4ff57158d 100644
--- a/src/odb_loose.c
+++ b/src/odb_loose.c
@@ -499,7 +499,7 @@ static int fn_locate_object_short_oid(void *state, git_buf *pathbuf) {
}
if (sstate->found > 1)
- return git_odb__error_ambiguous("multiple matches in loose objects");
+ return GIT_EAMBIGUOUS;
return 0;
}
@@ -545,12 +545,16 @@ static int locate_object_short_oid(
/* Explore directory to find a unique object matching short_oid */
error = git_path_direach(
object_location, fn_locate_object_short_oid, &state);
- if (error)
+
+ if (error && error != GIT_EUSER)
return error;
if (!state.found)
return git_odb__error_notfound("no matching loose object for prefix", short_oid);
+ if (state.found > 1)
+ return git_odb__error_ambiguous("multiple matches in loose objects");
+
/* Convert obtained hex formatted oid to raw */
error = git_oid_fromstr(res_oid, (char *)state.res_oid);
if (error)
diff --git a/tests-clar/refs/revparse.c b/tests-clar/refs/revparse.c
index 9657054de..37d3981bb 100644
--- a/tests-clar/refs/revparse.c
+++ b/tests-clar/refs/revparse.c
@@ -544,6 +544,37 @@ void test_refs_revparse__a_too_short_objectid_returns_EAMBIGUOUS(void)
GIT_EAMBIGUOUS, git_revparse_single(&g_obj, g_repo, "e90"));
}
+/*
+ * $ echo "aabqhq" | git hash-object -t blob --stdin
+ * dea509d0b3cb8ee0650f6ca210bc83f4678851ba
+ *
+ * $ echo "aaazvc" | git hash-object -t blob --stdin
+ * dea509d097ce692e167dfc6a48a7a280cc5e877e
+ */
+void test_refs_revparse__a_not_precise_enough_objectid_returns_EAMBIGUOUS(void)
+{
+ git_repository *repo;
+ git_index *index;
+ git_object *obj;
+
+ repo = cl_git_sandbox_init("testrepo");
+
+ cl_git_mkfile("testrepo/one.txt", "aabqhq\n");
+ cl_git_mkfile("testrepo/two.txt", "aaazvc\n");
+
+ cl_git_pass(git_repository_index(&index, repo));
+ cl_git_pass(git_index_add_bypath(index, "one.txt"));
+ cl_git_pass(git_index_add_bypath(index, "two.txt"));
+
+ cl_git_fail_with(git_revparse_single(&obj, repo, "dea509d0"), GIT_EAMBIGUOUS);
+
+ cl_git_pass(git_revparse_single(&obj, repo, "dea509d09"));
+
+ git_object_free(obj);
+ git_index_free(index);
+ cl_git_sandbox_cleanup();
+}
+
void test_refs_revparse__issue_994(void)
{
git_repository *repo;