]> git.eshelyaron.com Git - emacs.git/commitdiff
Improve rename-file behavior on macOS
authorPaul Eggert <eggert@cs.ucla.edu>
Mon, 14 Aug 2017 22:25:13 +0000 (15:25 -0700)
committerPaul Eggert <eggert@cs.ucla.edu>
Mon, 14 Aug 2017 22:53:28 +0000 (15:53 -0700)
Problem reported by Philipp Stephani (Bug#27986).
* src/fileio.c (Frename_file):
Worry about file name case sensitivity only if CYGWIN or DOS_NT.
* src/sysdep.c (renameat_noreplace): Use renameatx_np on macOS,
since this provides the necessary atomicity guarantees.

src/fileio.c
src/sysdep.c

index 69079c6ae49fdc4300fa2ce83b46fc096155472a..9f6de5b6ca75a1badafd95743d4e371ef53fbaf0 100644 (file)
@@ -2259,12 +2259,14 @@ This is what happens in interactive use with M-x.  */)
      not worry whether NEWNAME exists or whether it is a directory, as
      it is already another name for FILE.  */
   bool case_only_rename = false;
+#if defined CYGWIN || defined DOS_NT
   if (!NILP (Ffile_name_case_insensitive_p (file)))
     {
       newname = Fexpand_file_name (newname, Qnil);
       case_only_rename = !NILP (Fstring_equal (Fdowncase (file),
                                               Fdowncase (newname)));
     }
+#endif
 
   if (!case_only_rename)
     newname = expand_cp_target (Fdirectory_file_name (file), newname);
index 35f499c185395afc2cac5cfdf13180d1f1080543..2e18a419e3f2a6da6b735273d3e161304b9e1ae2 100644 (file)
@@ -2693,11 +2693,13 @@ renameat_noreplace (int srcfd, char const *src, int dstfd, char const *dst)
 {
 #if defined SYS_renameat2 && defined RENAME_NOREPLACE
   return syscall (SYS_renameat2, srcfd, src, dstfd, dst, RENAME_NOREPLACE);
+#elif defined RENAME_EXCL
+  return renameatx_np (srcfd, src, dstfd, dst, RENAME_EXCL);
 #else
-#ifdef WINDOWSNT
+# ifdef WINDOWSNT
   if (srcfd == AT_FDCWD && dstfd == AT_FDCWD)
     return sys_rename_replace (src, dst, 0);
-#endif
+# endif
   errno = ENOSYS;
   return -1;
 #endif