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 <dtur...@twopensource.com>
---
 refs.c | 12 +++++++++++-
 1 file changed, 11 insertions(+), 1 deletion(-)

diff --git a/refs.c b/refs.c
index 3a2ad5e..05b1b2a 100644
--- a/refs.c
+++ b/refs.c
@@ -1415,5 +1415,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

--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to