Commit c128149315c67d52c4503e294bfbd2653e0a8307

Carlos Martín Nieto 2012-09-30T11:37:53

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.

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);
+}