Forbid cross-backend ref renames. This would be pretty weird, but
since it will break, we should prevent it.
Also make the files backend deal with all non-normal ref renames.
Signed-off-by: David Turner <redacted>
Signed-off-by: Junio C Hamano <redacted>
---
refs.c | 12 +++++++++++-
1 file changed, 11 insertions(+), 1 deletion(-)
diff --git a/refs.c b/refs.c
index 5364dc6..4610a44 100644
--- a/refs.c
+++ b/refs.c
@@ -1418,5 +1418,15 @@ int delete_refs(struct string_list *refnames)
int rename_ref(const char *oldref, const char *newref, const char *logmsg)
{
- return the_refs_backend->rename_ref(oldref, newref, logmsg);
+ if ((ref_type(oldref) == REF_TYPE_NORMAL) !=
+ (ref_type(newref) == REF_TYPE_NORMAL)) {
+ return error(
+ _("Both ref arguments to rename_ref must be normal, "
+ "or both must be per-worktree/pseudorefs"));
+ }
+ if (ref_type(oldref) == REF_TYPE_NORMAL)
+ /* The files backend always deals with non-normal refs */
+ return the_refs_backend->rename_ref(oldref, newref, logmsg);
+ else
+ return refs_be_files.rename_ref(oldref, newref, logmsg);
}--
2.4.2.767.g62658d5-twtrsrc