reference_rename: don't delete the reflog reference_rename used to delete an old reflog file when renaming a reference to not confuse git.git. Don't do this anymore but let the user take care of writing a reflog entry. Signed-off-by: schu <schu-github@schulog.org>
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
diff --git a/include/git2/refs.h b/include/git2/refs.h
index 82c5d88..32671aa 100644
--- a/include/git2/refs.h
+++ b/include/git2/refs.h
@@ -183,6 +183,11 @@ GIT_EXTERN(int) git_reference_set_oid(git_reference *ref, const git_oid *id);
* If the `force` flag is not enabled, and there's already
* a reference with the given name, the renaming will fail.
*
+ * IMPORTANT:
+ * The user needs to write a proper reflog entry if the
+ * reflog is enabled for the repository. We only rename
+ * the reflog if it exists.
+ *
* @param ref The reference to rename
* @param new_name The new name for the reference
* @param force Overwrite an existing reference
diff --git a/src/refs.c b/src/refs.c
index d7396f2..dfdde08 100644
--- a/src/refs.c
+++ b/src/refs.c
@@ -10,6 +10,7 @@
#include "repository.h"
#include "fileops.h"
#include "pack.h"
+#include "reflog.h"
#include <git2/tag.h>
#include <git2/object.h>
@@ -1319,28 +1320,6 @@ int git_reference_rename(git_reference *ref, const char *new_name, int force)
}
/*
- * Crude hack: delete any logs till we support proper reflogs.
- * Otherwise git.git will possibly fail and leave a mess. git.git
- * writes reflogs by default in any repo with a working directory:
- *
- * "We only enable reflogs in repositories that have a working directory
- * associated with them, as shared/bare repositories do not have
- * an easy means to prune away old log entries, or may fail logging
- * entirely if the user's gecos information is not valid during a push.
- * This heuristic was suggested on the mailing list by Junio."
- *
- * Shawn O. Pearce - 0bee59186976b1d9e6b2dd77332480c9480131d5
- *
- * TODO
- *
- */
- git_path_join_n(aux_path, 3, ref->owner->path_repository, "logs", ref->name);
- if (git_futils_isfile(aux_path) == GIT_SUCCESS) {
- if ((error = p_unlink(aux_path)) < GIT_SUCCESS)
- goto rollback;
- }
-
- /*
* Finally we can create the new reference.
*/
if (ref->flags & GIT_REF_SYMBOLIC) {
@@ -1372,6 +1351,14 @@ int git_reference_rename(git_reference *ref, const char *new_name, int force)
}
/*
+ * Rename the reflog file.
+ */
+ git_path_join_n(aux_path, 3, ref->owner->path_repository,
+ GIT_REFLOG_DIR, ref->name);
+ if (git_futils_exists(aux_path) == GIT_SUCCESS)
+ error = git_reflog_rename(ref, new_name);
+
+ /*
* Change the name of the reference given by the user.
*/
git__free(ref->name);