From c128149315c67d52c4503e294bfbd2653e0a8307 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carlos=20Mart=C3=ADn=20Nieto?= Date: Sun, 30 Sep 2012 11:37:53 +0200 Subject: [PATCH] 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. --- src/refs.c | 10 ++++++---- tests-clar/refs/create.c | 15 +++++++++++++++ 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); +}