summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarlos Martín Nieto <carlos@cmartin.tk>2012-09-30 11:37:53 +0200
committerCarlos Martín Nieto <carlos@cmartin.tk>2012-09-30 11:56:37 +0200
commitc128149315c67d52c4503e294bfbd2653e0a8307 (patch)
tree44b028d5a701d965d156ea3b08bbf33e561d276d
parent3665ba8eeb4f8b2546517cd208e940b128dd8a46 (diff)
downloadlibgit2-c128149315c67d52c4503e294bfbd2653e0a8307.tar.gz
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.
-rw-r--r--src/refs.c10
-rw-r--r--tests-clar/refs/create.c15
2 files changed, 21 insertions, 4 deletions
diff --git a/src/refs.c b/src/refs.c
index 693870a0b..903acccbb 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 af5b203a3..bf234bc60 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);
+}