bug-gnu-emacs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

bug#23050: package.el overwrites symlinks when saving


From: Bogolisk
Subject: bug#23050: package.el overwrites symlinks when saving
Date: Tue, 22 Mar 2016 16:51:50 +0000 (UTC)
User-agent: Loom/3.14 (http://gmane.org/)

Glenn Morris <rgm <at> gnu.org> writes:

> 
> Glenn Morris wrote:
> 
> > I see the relevant code binds file-precious-flag, so this is
> > http://debbugs.gnu.org/18125 .
> 
> PS So package.el could avoid the issue by binding
> find-file-visit-truename, like cus-edit does (see bug#454).
> 
> 


The fix is for basic-save-buffer-2() to use buffer-file-truename when save-
by-rename.

--- files.old.el        2016-03-22 12:43:37.124790562 -0400
+++ files.new.el        2016-03-22 12:44:32.361602364 -0400
@@ -4840,29 +4840,29 @@
 ;; backup-buffer.
 (defun basic-save-buffer-2 ()
   (let (tempsetmodes setmodes)
-    (if (not (file-writable-p buffer-file-name))
-       (let ((dir (file-name-directory buffer-file-name)))
+    (if (not (file-writable-p buffer-file-truename))
+       (let ((dir (file-name-directory buffer-file-truename)))
          (if (not (file-directory-p dir))
              (if (file-exists-p dir)
                  (error "%s is not a directory" dir)
                (error "%s: no such directory" dir))
-           (if (not (file-exists-p buffer-file-name))
+           (if (not (file-exists-p buffer-file-truename))
                (error "Directory %s write-protected" dir)
              (if (yes-or-no-p
                   (format
                    "File %s is write-protected; try to save anyway? "
                    (file-name-nondirectory
-                    buffer-file-name)))
+                    buffer-file-truename)))
                  (setq tempsetmodes t)
                (error "Attempt to save to a file which you aren't allowed 
to write"))))))
     (or buffer-backed-up
        (setq setmodes (backup-buffer)))
-    (let* ((dir (file-name-directory buffer-file-name))
+    (let* ((dir (file-name-directory buffer-file-truename))
            (dir-writable (file-writable-p dir)))
       (if (or (and file-precious-flag dir-writable)
               (and break-hardlink-on-save
-                   (file-exists-p buffer-file-name)
-                   (> (file-nlinks buffer-file-name) 1)
+                   (file-exists-p buffer-file-truename)
+                   (> (file-nlinks buffer-file-truename) 1)
                    (or dir-writable
                        (error (concat "Directory %s write-protected; "
                                       "cannot break hardlink when saving")
@@ -4870,7 +4870,7 @@
          ;; Write temp name, then rename it.
          ;; This requires write access to the containing dir,
          ;; which is why we don't try it if we don't have that access.
-         (let ((realname buffer-file-name)
+         (let ((realname buffer-file-truename)
                tempname succeed
                (umask (default-file-modes))
                (old-modtime (visited-file-modtime)))
@@ -4911,13 +4911,13 @@
            ;; Since we have created an entirely new file,
            ;; make sure it gets the right permission bits set.
            (setq setmodes (or setmodes
-                              (list (or (file-modes buffer-file-name)
+                              (list (or (file-modes buffer-file-truename)
                                         (logand ?\666 umask))
-                                    (file-extended-attributes buffer-file-
name)
-                                    buffer-file-name)))
+                                    (file-extended-attributes buffer-file-
truename)
+                                    buffer-file-truename)))
            ;; We succeeded in writing the temp file,
            ;; so rename it.
-           (rename-file tempname buffer-file-name t))
+           (rename-file tempname buffer-file-truename t))
        ;; If file not writable, see if we can make it writable
        ;; temporarily while we write it.
        ;; But no need to do so if we have just backed it up







reply via email to

[Prev in Thread] Current Thread [Next in Thread]