1
Fork 0
mirror of git://git.sv.gnu.org/emacs.git synced 2025-12-06 06:20:55 -08:00

Fix default-directory of buffers visiting files in renamed directories

* lisp/dired-aux.el (dired-rename-file): Take note of whether FILE
is a directory before it is renamed, which makes it impossible to
determine if it was a directory.
(dired-rename-subdir, dired-rename-subdir-1): Revert to using
dired-in-this-tree-p instead of file-in-directory-p, for the
benefit of files that were renamed/removed, because
file-in-directory-p returns nil in those cases.  (Bug#54838)
This commit is contained in:
Eli Zaretskii 2022-04-11 14:31:04 +03:00
parent cccaa9c31d
commit e71c7a7c60

View file

@ -1838,22 +1838,23 @@ rename them using `vc-rename-file'."
"Rename FILE to NEWNAME. "Rename FILE to NEWNAME.
Signal a `file-already-exists' error if a file NEWNAME already exists Signal a `file-already-exists' error if a file NEWNAME already exists
unless OK-IF-ALREADY-EXISTS is non-nil." unless OK-IF-ALREADY-EXISTS is non-nil."
(dired-handle-overwrite newname) (let ((file-is-dir-p (file-directory-p file)))
(dired-maybe-create-dirs (file-name-directory newname)) (dired-handle-overwrite newname)
(if (and dired-vc-rename-file (dired-maybe-create-dirs (file-name-directory newname))
(vc-backend file) (if (and dired-vc-rename-file
(ignore-errors (vc-responsible-backend newname))) (vc-backend file)
(vc-rename-file file newname) (ignore-errors (vc-responsible-backend newname)))
;; error is caught in -create-files (vc-rename-file file newname)
(rename-file file newname ok-if-already-exists)) ;; error is caught in -create-files
;; Silently rename the visited file of any buffer visiting this file. (rename-file file newname ok-if-already-exists))
(and (get-file-buffer file) ;; Silently rename the visited file of any buffer visiting this file.
(with-current-buffer (get-file-buffer file) (and (get-file-buffer file)
(set-visited-file-name newname nil t))) (with-current-buffer (get-file-buffer file)
(dired-remove-file file) (set-visited-file-name newname nil t)))
;; See if it's an inserted subdir, and rename that, too. (dired-remove-file file)
(when (file-directory-p file) ;; See if it's an inserted subdir, and rename that, too.
(dired-rename-subdir file newname))) (when file-is-dir-p
(dired-rename-subdir file newname))))
(defun dired-rename-subdir (from-dir to-dir) (defun dired-rename-subdir (from-dir to-dir)
(setq from-dir (file-name-as-directory from-dir) (setq from-dir (file-name-as-directory from-dir)
@ -1866,7 +1867,7 @@ unless OK-IF-ALREADY-EXISTS is non-nil."
(while blist (while blist
(with-current-buffer (car blist) (with-current-buffer (car blist)
(if (and buffer-file-name (if (and buffer-file-name
(file-in-directory-p buffer-file-name expanded-from-dir)) (dired-in-this-tree-p buffer-file-name expanded-from-dir))
(let ((modflag (buffer-modified-p)) (let ((modflag (buffer-modified-p))
(to-file (replace-regexp-in-string (to-file (replace-regexp-in-string
(concat "^" (regexp-quote from-dir)) (concat "^" (regexp-quote from-dir))
@ -1885,7 +1886,7 @@ unless OK-IF-ALREADY-EXISTS is non-nil."
(while alist (while alist
(setq elt (car alist) (setq elt (car alist)
alist (cdr alist)) alist (cdr alist))
(if (file-in-directory-p (car elt) expanded-dir) (if (dired-in-this-tree-p (car elt) expanded-dir)
;; ELT's subdir is affected by the rename ;; ELT's subdir is affected by the rename
(dired-rename-subdir-2 elt dir to))) (dired-rename-subdir-2 elt dir to)))
(if (equal dir default-directory) (if (equal dir default-directory)