]> git.eshelyaron.com Git - emacs.git/commitdiff
Fix renaming symlinks on MS-Windows
authorEli Zaretskii <eliz@gnu.org>
Sat, 13 Jul 2024 12:52:38 +0000 (15:52 +0300)
committerEshel Yaron <me@eshelyaron.com>
Sat, 13 Jul 2024 20:07:41 +0000 (22:07 +0200)
* src/w32.c (sys_rename_replace): Handle renames of a symlink.
This makes 'wdired-tests' succeed on MS-Windows.

(cherry picked from commit 5389b6a856b39427846e38b06fa398bafc04836a)

src/w32.c

index ab45ae8ec6b4f808545139d05fea1a07e936fde6..6dcbbbcc61be5a7d248f60f13cd28ebe12750fa6 100644 (file)
--- a/src/w32.c
+++ b/src/w32.c
@@ -4761,6 +4761,15 @@ sys_rename_replace (const char *oldname, const char *newname, BOOL force)
 
   strcpy (temp, map_w32_filename (oldname, NULL));
 
+  /* 'rename' (which calls MoveFileW) renames the _target_ of the
+     symlink, which is different from Posix behavior and not what we
+     want here.  So in that case we pretend this is a cross-device move,
+     for which Frename_file already has a workaround.  */
+  if (is_symlink (temp))
+    {
+      errno = EXDEV;
+      return -1;
+    }
   /* volume_info is set indirectly by map_w32_filename.  */
   oldname_dev = volume_info.serialnum;