Fix the non-creation of backup files in temporary-file directory on Windows.
authorEli Zaretskii <eliz@gnu.org>
Sat, 6 Apr 2013 07:41:09 +0000 (10:41 +0300)
committerEli Zaretskii <eliz@gnu.org>
Sat, 6 Apr 2013 07:41:09 +0000 (10:41 +0300)
 lisp/files.el (normal-backup-enable-predicate): On MS-Windows and
 MS-DOS compare truenames of temporary-file-directory and of the
 file, so that 8+3 aliases (usually found in $TEMP on Windows)
 don't fail comparison by compare-strings.  Also, compare file
 names case-insensitively on MS-Windows and MS-DOS.

lisp/ChangeLog
lisp/files.el

index 1af9905..8b24997 100644 (file)
@@ -1,3 +1,11 @@
+2013-04-06  Eli Zaretskii  <eliz@gnu.org>
+
+       * files.el (normal-backup-enable-predicate): On MS-Windows and
+       MS-DOS compare truenames of temporary-file-directory and of the
+       file, so that 8+3 aliases (usually found in $TEMP on Windows)
+       don't fail comparison by compare-strings.  Also, compare file
+       names case-insensitively on MS-Windows and MS-DOS.
+
 2013-04-05  Stefan Monnier  <monnier@iro.umontreal.ca>
 
        * emacs-lisp/package.el (package-compute-transaction): Fix last fix.
index 0695862..d098f0f 100644 (file)
@@ -4180,23 +4180,31 @@ ignored."
   "Default `backup-enable-predicate' function.
 Checks for files in `temporary-file-directory',
 `small-temporary-file-directory', and /tmp."
-  (not (or (let ((comp (compare-strings temporary-file-directory 0 nil
-                                       name 0 nil)))
-            ;; Directory is under temporary-file-directory.
-            (and (not (eq comp t))
-                 (< comp (- (length temporary-file-directory)))))
-          (let ((comp (compare-strings "/tmp" 0 nil
-                                       name 0 nil)))
-            ;; Directory is under /tmp.
-            (and (not (eq comp t))
-                 (< comp (- (length "/tmp")))))
-          (if small-temporary-file-directory
-              (let ((comp (compare-strings small-temporary-file-directory
-                                           0 nil
-                                           name 0 nil)))
-                ;; Directory is under small-temporary-file-directory.
-                (and (not (eq comp t))
-                     (< comp (- (length small-temporary-file-directory)))))))))
+  (let ((temporary-file-directory temporary-file-directory)
+       caseless)
+    ;; On MS-Windows, file-truename will convert short 8+3 alises to
+    ;; their long file-name equivalents, so compare-strings does TRT.
+    (if (memq system-type '(ms-dos windows-nt))
+       (setq temporary-file-directory (file-truename temporary-file-directory)
+             name (file-truename name)
+             caseless t))
+    (not (or (let ((comp (compare-strings temporary-file-directory 0 nil
+                                         name 0 nil caseless)))
+              ;; Directory is under temporary-file-directory.
+              (and (not (eq comp t))
+                   (< comp (- (length temporary-file-directory)))))
+            (let ((comp (compare-strings "/tmp" 0 nil
+                                         name 0 nil)))
+              ;; Directory is under /tmp.
+              (and (not (eq comp t))
+                   (< comp (- (length "/tmp")))))
+            (if small-temporary-file-directory
+                (let ((comp (compare-strings small-temporary-file-directory
+                                             0 nil
+                                             name 0 nil caseless)))
+                  ;; Directory is under small-temporary-file-directory.
+                  (and (not (eq comp t))
+                       (< comp (- (length small-temporary-file-directory))))))))))
 
 (defun make-backup-file-name (file)
   "Create the non-numeric backup file name for FILE.