refs: propagate EEXISTS Indicate whether the error comes from the ref already existing or elsewhere. We always perform the check and this lets the user write more concise code.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65
diff --git a/src/refs.c b/src/refs.c
index 693870a..903accc 100644
--- a/src/refs.c
+++ b/src/refs.c
@@ -1199,6 +1199,7 @@ int git_reference_create_symbolic(
{
char normalized[GIT_REFNAME_MAX];
git_reference *ref = NULL;
+ int error;
if (git_reference__normalize_name_lax(
normalized,
@@ -1206,8 +1207,8 @@ int git_reference_create_symbolic(
name) < 0)
return -1;
- if (reference_can_write(repo, normalized, NULL, force) < 0)
- return -1;
+ if ((error = reference_can_write(repo, normalized, NULL, force)) < 0)
+ return error;
if (reference_alloc(&ref, repo, normalized) < 0)
return -1;
@@ -1236,6 +1237,7 @@ int git_reference_create_oid(
const git_oid *id,
int force)
{
+ int error;
git_reference *ref = NULL;
char normalized[GIT_REFNAME_MAX];
@@ -1245,8 +1247,8 @@ int git_reference_create_oid(
name) < 0)
return -1;
- if (reference_can_write(repo, normalized, NULL, force) < 0)
- return -1;
+ if ((error = reference_can_write(repo, normalized, NULL, force)) < 0)
+ return error;
if (reference_alloc(&ref, repo, name) < 0)
return -1;
diff --git a/tests-clar/refs/create.c b/tests-clar/refs/create.c
index af5b203..bf234bc 100644
--- a/tests-clar/refs/create.c
+++ b/tests-clar/refs/create.c
@@ -147,3 +147,18 @@ void test_refs_create__oid_unknown(void)
/* Ensure the reference can't be looked-up... */
cl_git_fail(git_reference_lookup(&looked_up_ref, g_repo, new_head));
}
+
+void test_refs_create__propagate_eexists(void)
+{
+ int error;
+ git_oid oid;
+ git_reference *ref;
+
+ /* Make sure it works for oid and for symbolic both */
+ git_oid_fromstr(&oid, current_master_tip);
+ error = git_reference_create_oid(&ref, g_repo, current_head_target, &oid, false);
+ cl_assert(error == GIT_EEXISTS);
+
+ error = git_reference_create_symbolic(&ref, g_repo, "HEAD", current_head_target, false);
+ cl_assert(error == GIT_EEXISTS);
+}