refs: Centralize reference creation logic
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 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86
diff --git a/src/refs.c b/src/refs.c
index 472a798..7b4730c 100644
--- a/src/refs.c
+++ b/src/refs.c
@@ -335,6 +335,8 @@ static int reference__create(
git_reference *ref = NULL;
int error = 0;
+ assert(repo && name);
+
if (ref_out)
*ref_out = NULL;
@@ -347,10 +349,29 @@ static int reference__create(
return error;
if (oid != NULL) {
+ git_odb *odb;
+
assert(symbolic == NULL);
- ref = git_reference__alloc(normalized, oid, NULL);
+
+ /* Sanity check the reference being created - target must exist. */
+ if ((error = git_repository_odb__weakptr(&odb, repo)) < 0)
+ return error;
+
+ if (!git_odb_exists(odb, oid)) {
+ giterr_set(GITERR_REFERENCE,
+ "Target OID for the reference doesn't exist on the repository");
+ return -1;
+ }
+
+ ref = git_reference__alloc(name, oid, NULL);
} else {
- ref = git_reference__alloc_symbolic(normalized, symbolic);
+ char normalized_target[GIT_REFNAME_MAX];
+
+ if ((error = git_reference__normalize_name_lax(
+ normalized_target, sizeof(normalized_target), symbolic)) < 0)
+ return error;
+
+ ref = git_reference__alloc_symbolic(name, normalized_target);
}
GITERR_CHECK_ALLOC(ref);
@@ -375,20 +396,7 @@ int git_reference_create(
const git_oid *oid,
int force)
{
- git_odb *odb;
- int error = 0;
-
- assert(repo && name && oid);
-
- /* Sanity check the reference being created - target must exist. */
- if ((error = git_repository_odb__weakptr(&odb, repo)) < 0)
- return error;
-
- if (!git_odb_exists(odb, oid)) {
- giterr_set(GITERR_REFERENCE,
- "Target OID for the reference doesn't exist on the repository");
- return -1;
- }
+ assert(oid);
return reference__create(ref_out, repo, name, oid, NULL, force);
}
@@ -400,16 +408,9 @@ int git_reference_symbolic_create(
const char *target,
int force)
{
- char normalized[GIT_REFNAME_MAX];
- int error = 0;
-
- assert(repo && name && target);
-
- if ((error = git_reference__normalize_name_lax(
- normalized, sizeof(normalized), target)) < 0)
- return error;
+ assert(target);
- return reference__create(ref_out, repo, name, NULL, normalized, force);
+ return reference__create(ref_out, repo, name, NULL, target, force);
}
int git_reference_set_target(