summaryrefslogtreecommitdiff
path: root/src/refs.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/refs.c')
-rw-r--r--src/refs.c36
1 files changed, 32 insertions, 4 deletions
diff --git a/src/refs.c b/src/refs.c
index 7c97c1627..75a7e1b95 100644
--- a/src/refs.c
+++ b/src/refs.c
@@ -480,21 +480,49 @@ int git_reference_symbolic_create_with_log(
ref_out, repo, name, NULL, target, force, signature, log_message);
}
+static int ensure_is_an_updatable_direct_reference(git_reference *ref)
+{
+ if (ref->type == GIT_REF_OID)
+ return 0;
+
+ giterr_set(GITERR_REFERENCE, "Cannot set OID on symbolic reference");
+ return -1;
+}
+
int git_reference_set_target(
git_reference **out,
git_reference *ref,
const git_oid *id)
{
+ int error;
+
assert(out && ref && id);
- if (ref->type != GIT_REF_OID) {
- giterr_set(GITERR_REFERENCE, "Cannot set OID on symbolic reference");
- return -1;
- }
+ if ((error = ensure_is_an_updatable_direct_reference(ref)) < 0)
+ return error;
return git_reference_create(out, ref->db->repo, ref->name, id, 1);
}
+int git_reference_set_target_with_log(
+ git_reference **out,
+ git_reference *ref,
+ const git_oid *id,
+ const git_signature *signature,
+ const char *log_message)
+{
+ int error;
+
+ assert(out && ref && id);
+ assert(signature && log_message);
+
+ if ((error = ensure_is_an_updatable_direct_reference(ref)) < 0)
+ return error;
+
+ return git_reference_create_with_log(
+ out, ref->db->repo, ref->name, id, 1, signature, log_message);
+}
+
int git_reference_symbolic_set_target(
git_reference **out,
git_reference *ref,