summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/git2/errors.h1
-rw-r--r--include/git2/refs.h6
-rw-r--r--src/refdb_fs.c6
3 files changed, 9 insertions, 4 deletions
diff --git a/include/git2/errors.h b/include/git2/errors.h
index 973d56003..bcf2f80ab 100644
--- a/include/git2/errors.h
+++ b/include/git2/errors.h
@@ -40,6 +40,7 @@ typedef enum {
GIT_EINVALIDSPEC = -12, /*< Name/ref spec was not in a valid format */
GIT_EMERGECONFLICT = -13, /*< Merge conflicts prevented operation */
GIT_ELOCKED = -14, /*< Lock file prevented operation */
+ GIT_EMODIFIED = -15, /*< Reference value does not match expected */
GIT_PASSTHROUGH = -30, /*< Internal only */
GIT_ITEROVER = -31, /*< Signals end of iteration with iterator */
diff --git a/include/git2/refs.h b/include/git2/refs.h
index 72622948b..aab8715fb 100644
--- a/include/git2/refs.h
+++ b/include/git2/refs.h
@@ -182,7 +182,8 @@ GIT_EXTERN(int) git_reference_create(git_reference **out, git_repository *repo,
* @param signature The identity that will used to populate the reflog entry
* @param log_message The one line long message to be appended to the reflog
* @param old_id The old value which the reference should have
- * @return 0 on success, GIT_EEXISTS, GIT_EINVALIDSPEC or an error code
+ * @return 0 on success, GIT_EMODIFIED if the value of the reference
+ * has changed, GIT_EEXISTS, GIT_EINVALIDSPEC or an error code
*/
GIT_EXTERN(int) git_reference_create_matching(git_reference **out, git_repository *repo, const char *name, const git_oid *id, int force, const git_signature *signature, const char *log_message, const git_oid *old_id);
@@ -308,7 +309,8 @@ GIT_EXTERN(int) git_reference_symbolic_set_target(
* @param id The new target OID for the reference
* @param signature The identity that will used to populate the reflog entry
* @param log_message The one line long message to be appended to the reflog
- * @return 0 or an error code
+ * @return 0 on success, GIT_EMODIFIED if the value of the reference
+ * has changed, or an error code
*/
GIT_EXTERN(int) git_reference_set_target(
git_reference **out,
diff --git a/src/refdb_fs.c b/src/refdb_fs.c
index fd6d61e1d..0a2a33a51 100644
--- a/src/refdb_fs.c
+++ b/src/refdb_fs.c
@@ -941,7 +941,7 @@ static int refdb_fs_backend__write(
refdb_fs_backend *backend = (refdb_fs_backend *)_backend;
git_filebuf file = GIT_FILEBUF_INIT;
git_reference *old_ref;
- int error;
+ int error = 0;
assert(backend);
@@ -961,12 +961,14 @@ static int refdb_fs_backend__write(
if (old_ref->type == GIT_REF_SYMBOLIC) {
giterr_set(GITERR_REFERENCE, "cannot compare id to symbolic reference target");
+ error = -1;
goto on_error;
}
/* Finally we can compare the ids */
if (git_oid_cmp(old_id, &old_ref->target.oid)) {
giterr_set(GITERR_REFERENCE, "old reference value does not match");
+ error = GIT_EMODIFIED;
goto on_error;
}
}
@@ -982,7 +984,7 @@ static int refdb_fs_backend__write(
on_error:
git_filebuf_cleanup(&file);
git_reference_free(old_ref);
- return -1;
+ return error;
}
static int refdb_fs_backend__delete(