diff options
Diffstat (limited to 'src/refdb_fs.c')
-rw-r--r-- | src/refdb_fs.c | 35 |
1 files changed, 18 insertions, 17 deletions
diff --git a/src/refdb_fs.c b/src/refdb_fs.c index 554fe42c9..879e48514 100644 --- a/src/refdb_fs.c +++ b/src/refdb_fs.c @@ -936,12 +936,13 @@ static int refdb_fs_backend__write( int force, const git_signature *who, const char *message, - const git_oid *old_id) + const git_oid *old_id, + const char *old_target) { refdb_fs_backend *backend = (refdb_fs_backend *)_backend; git_filebuf file = GIT_FILEBUF_INIT; - git_reference *old_ref; - int error = 0, cmp; + git_reference *old_ref = NULL; + int error = 0, cmp = 0; assert(backend); @@ -953,25 +954,25 @@ static int refdb_fs_backend__write( if ((error = loose_lock(&file, backend, ref)) < 0) return error; - if (old_id) { + if (old_id || old_target) { if ((error = refdb_fs_backend__lookup(&old_ref, _backend, ref->name)) < 0) goto on_error; + } - if (old_ref->type == GIT_REF_SYMBOLIC) { - git_reference_free(old_ref); - giterr_set(GITERR_REFERENCE, "cannot compare id to symbolic reference target"); - error = -1; - goto on_error; - } - - /* Finally we can compare the ids */ + if (old_id && old_ref->type == GIT_REF_OID) { cmp = git_oid_cmp(old_id, &old_ref->target.oid); git_reference_free(old_ref); - if (cmp) { - giterr_set(GITERR_REFERENCE, "old reference value does not match"); - error = GIT_EMODIFIED; - goto on_error; - } + } + + if (old_target && old_ref->type == GIT_REF_SYMBOLIC) { + cmp = git__strcmp(old_target, old_ref->target.symbolic); + git_reference_free(old_ref); + } + + if (cmp) { + giterr_set(GITERR_REFERENCE, "old reference value does not match"); + error = GIT_EMODIFIED; + goto on_error; } if (should_write_reflog(backend->repo, ref->name) && |