]> git.eshelyaron.com Git - emacs.git/commitdiff
Allow preserving symlinks with file-precious-flag set
authorLars Ingebrigtsen <larsi@gnus.org>
Fri, 20 Aug 2021 14:20:51 +0000 (16:20 +0200)
committerLars Ingebrigtsen <larsi@gnus.org>
Fri, 20 Aug 2021 14:20:51 +0000 (16:20 +0200)
* doc/lispref/files.texi (Saving Buffers): Document it.
* lisp/files.el (file-preserve-symlinks-on-save): New user option
(bug#18125).
(basic-save-buffer-2): Use it.

doc/lispref/files.texi
etc/NEWS
lisp/files.el

index 266501d46d0f3c9c6b4203622593609e0841677a..12c06111374b5ee74537a5ba1a2d07ac92e61cf2 100644 (file)
@@ -503,6 +503,13 @@ all hard links between the file you save and other file names.
 
 Some modes give this variable a non-@code{nil} buffer-local value
 in particular buffers.
+
+@vindex file-preserve-symlinks-on-save
+If this option is non-@code{nil} and you're visiting files via a
+symbolic link, Emacs break the symbolic link and write the buffer to a
+file with the same name as the symbolic link.  To instead write to the
+file the symbolic link points to (and thereby preserving the link),
+set @code{file-preserve-symlinks-on-save} to @code{t}.
 @end defopt
 
 @defopt require-final-newline
index 7cd0c5fc4e168ffa612be47b706f389bc203d5b6..cdc70d6fef0b94c8d4d5e6f21521aa968208a3b1 100644 (file)
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -2460,6 +2460,11 @@ images are marked.
 
 ** Miscellaneous
 
++++
+*** New user option 'file-preserve-symlinks-on-save'.
+This controls what Emacs does when saving buffers visited via a
+symbolic link, and 'file-precious-flag' is non-nil.
+
 +++
 *** New user option 'copy-directory-create-symlink'.
 If non-nil, will make `copy-directory' (when used on a symbolic
index 90de1499340b09440cc0e73101a0c1e2df5fea32..6a617feca49cc625a45f81c980bcbc05c1792bad 100644 (file)
@@ -5446,6 +5446,14 @@ symbolic link and copy the contents instead."
   :version "28.1"
   :group 'files)
 
+(defcustom file-preserve-symlinks-on-save nil
+  "If non-nil, saving a buffer visited via a symlink won't overwrite the symlink.
+This is only relevant if `file-precious-flag' is non-nil -- if
+this is nil, Emacs will preserve the symlinks anyway."
+  :type 'boolean
+  :version "28.1"
+  :group 'files)
+
 (defvar-local save-buffer-coding-system nil
   "If non-nil, use this coding system for saving the buffer.
 More precisely, use this coding system in place of the
@@ -5648,7 +5656,14 @@ Before and after saving the buffer, this function runs
                                     buffer-file-name)))
            ;; We succeeded in writing the temp file,
            ;; so rename it.
-           (rename-file tempname buffer-file-name t))
+           (rename-file tempname
+                         (if (and file-preserve-symlinks-on-save
+                                  (file-symlink-p buffer-file-name))
+                             ;; Write to the file that the symlink
+                             ;; points to.
+                             (file-chase-links buffer-file-name)
+                           buffer-file-name)
+                         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