* bug#54838: 28.1; Buffers are not updated when a directory is renamed in dired @ 2022-04-10 15:25 Nicolas Martyanoff 2022-04-10 17:14 ` Eli Zaretskii 0 siblings, 1 reply; 6+ messages in thread From: Nicolas Martyanoff @ 2022-04-10 15:25 UTC (permalink / raw) To: 54838 Hi, Following an update from 27.2 to 28.1, when a directory is renamed in dired, buffers visiting files located in this directory are not updated to visit the file at its new location. To reproduce the problem in emacs -Q: - C-x C-f /tmp/dir1/file - C-x C-s Answer 'y' to the prompt to create the directory. At this point the buffer 'file' visits /tmp/dir1/file, and the file exists on the disk. - Run dired in /tmp. - Rename /tmp/dir1 into /tmp/dir2, e.g. using 'R'. - Switch to the 'file' buffer. It still visits /tmp/dir1/file even though the file is now located in /tmp/dir2. -- Nicolas Martyanoff http://snowsyn.net khaelin@gmail.com ^ permalink raw reply [flat|nested] 6+ messages in thread
* bug#54838: 28.1; Buffers are not updated when a directory is renamed in dired 2022-04-10 15:25 bug#54838: 28.1; Buffers are not updated when a directory is renamed in dired Nicolas Martyanoff @ 2022-04-10 17:14 ` Eli Zaretskii 2022-04-10 17:19 ` Tassilo Horn 2022-04-11 7:59 ` Nicolas Martyanoff 0 siblings, 2 replies; 6+ messages in thread From: Eli Zaretskii @ 2022-04-10 17:14 UTC (permalink / raw) To: Nicolas Martyanoff, Tassilo Horn; +Cc: 54838 > From: Nicolas Martyanoff <khaelin@gmail.com> > Date: Sun, 10 Apr 2022 17:25:40 +0200 > > - C-x C-f /tmp/dir1/file > > - C-x C-s > Answer 'y' to the prompt to create the directory. At this point the > buffer 'file' visits /tmp/dir1/file, and the file exists on the disk. > > - Run dired in /tmp. > > - Rename /tmp/dir1 into /tmp/dir2, e.g. using 'R'. > > - Switch to the 'file' buffer. It still visits /tmp/dir1/file even > though the file is now located in /tmp/dir2. Please try the patch below and see if it solves the problem, including in other similar use cases. Tassilo, part of this bug is yet another fallout from replacing dired-in-this-tree-p with file-in-directory-p: the latter returns nil if its second arg doesn't exist, and in this scenario we are dealing with a directory that was already renamed to the new name. Do you agree with my proposed solution for that below? I intend to install it on the release branch, as this is a regression from Emacs 27. Thanks. diff --git a/lisp/dired-aux.el b/lisp/dired-aux.el index 15f95eb..fc50cce 100644 --- a/lisp/dired-aux.el +++ b/lisp/dired-aux.el @@ -1838,22 +1838,23 @@ dired-rename-file "Rename FILE to NEWNAME. Signal a `file-already-exists' error if a file NEWNAME already exists unless OK-IF-ALREADY-EXISTS is non-nil." - (dired-handle-overwrite newname) - (dired-maybe-create-dirs (file-name-directory newname)) - (if (and dired-vc-rename-file - (vc-backend file) - (ignore-errors (vc-responsible-backend newname))) - (vc-rename-file file newname) - ;; error is caught in -create-files - (rename-file file newname ok-if-already-exists)) - ;; Silently rename the visited file of any buffer visiting this file. - (and (get-file-buffer file) - (with-current-buffer (get-file-buffer file) - (set-visited-file-name newname nil t))) - (dired-remove-file file) - ;; See if it's an inserted subdir, and rename that, too. - (when (file-directory-p file) - (dired-rename-subdir file newname))) + (let ((file-is-dir-p (file-directory-p file))) + (dired-handle-overwrite newname) + (dired-maybe-create-dirs (file-name-directory newname)) + (if (and dired-vc-rename-file + (vc-backend file) + (ignore-errors (vc-responsible-backend newname))) + (vc-rename-file file newname) + ;; error is caught in -create-files + (rename-file file newname ok-if-already-exists)) + ;; Silently rename the visited file of any buffer visiting this file. + (and (get-file-buffer file) + (with-current-buffer (get-file-buffer file) + (set-visited-file-name newname nil t))) + (dired-remove-file file) + ;; See if it's an inserted subdir, and rename that, too. + (when file-is-dir-p + (dired-rename-subdir file newname)))) (defun dired-rename-subdir (from-dir to-dir) (setq from-dir (file-name-as-directory from-dir) @@ -1866,7 +1867,13 @@ dired-rename-subdir (while blist (with-current-buffer (car blist) (if (and buffer-file-name - (file-in-directory-p buffer-file-name expanded-from-dir)) + ;; If FROM-DIR was renamed/removed, fall back to + ;; 'dired-in-this-tree-p', since + ;; 'file-in-directory-p' will punt. + (or (and (file-exists-p expanded-from-dir) + (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)) (to-file (replace-regexp-in-string (concat "^" (regexp-quote from-dir)) @@ -1885,7 +1892,8 @@ dired-rename-subdir-1 (while alist (setq elt (car alist) alist (cdr alist)) - (if (file-in-directory-p (car elt) expanded-dir) + (if (or (file-in-directory-p (car elt) expanded-dir) + (dired-in-this-tree-p (car elt) expanded-dir)) ;; ELT's subdir is affected by the rename (dired-rename-subdir-2 elt dir to))) (if (equal dir default-directory) ^ permalink raw reply related [flat|nested] 6+ messages in thread
* bug#54838: 28.1; Buffers are not updated when a directory is renamed in dired 2022-04-10 17:14 ` Eli Zaretskii @ 2022-04-10 17:19 ` Tassilo Horn 2022-04-10 17:38 ` Eli Zaretskii 2022-04-11 7:59 ` Nicolas Martyanoff 1 sibling, 1 reply; 6+ messages in thread From: Tassilo Horn @ 2022-04-10 17:19 UTC (permalink / raw) To: Eli Zaretskii; +Cc: Nicolas Martyanoff, 54838 Eli Zaretskii <eliz@gnu.org> writes: Hi Eli, > Tassilo, part of this bug is yet another fallout from replacing > dired-in-this-tree-p with file-in-directory-p: the latter returns nil > if its second arg doesn't exist, and in this scenario we are dealing > with a directory that was already renamed to the new name. Do you > agree with my proposed solution for that below? I would just revert back to using dired-in-this-tree-p and never file-in-directory-p in those places. I've done that for many places in 61677ac3e4685d8f81c3b90eb751d9b5e8a3732d, too, because it turned out that the change from dired-in-this-tree-p to file-in-directory-p caused performance problems. The fact that dired-in-this-tree-p works for non-existing files and dired relies on that didn't even occur to me. :-( Bye, Tassilo ^ permalink raw reply [flat|nested] 6+ messages in thread
* bug#54838: 28.1; Buffers are not updated when a directory is renamed in dired 2022-04-10 17:19 ` Tassilo Horn @ 2022-04-10 17:38 ` Eli Zaretskii 0 siblings, 0 replies; 6+ messages in thread From: Eli Zaretskii @ 2022-04-10 17:38 UTC (permalink / raw) To: Tassilo Horn; +Cc: khaelin, 54838 > From: Tassilo Horn <tsdh@gnu.org> > Cc: Nicolas Martyanoff <khaelin@gmail.com>, 54838@debbugs.gnu.org > Date: Sun, 10 Apr 2022 19:19:26 +0200 > > > Tassilo, part of this bug is yet another fallout from replacing > > dired-in-this-tree-p with file-in-directory-p: the latter returns nil > > if its second arg doesn't exist, and in this scenario we are dealing > > with a directory that was already renamed to the new name. Do you > > agree with my proposed solution for that below? > > I would just revert back to using dired-in-this-tree-p and never > file-in-directory-p in those places. I've done that for many places in > 61677ac3e4685d8f81c3b90eb751d9b5e8a3732d, too, because it turned out > that the change from dired-in-this-tree-p to file-in-directory-p caused > performance problems. Thanks, will do when installing the changes. ^ permalink raw reply [flat|nested] 6+ messages in thread
* bug#54838: 28.1; Buffers are not updated when a directory is renamed in dired 2022-04-10 17:14 ` Eli Zaretskii 2022-04-10 17:19 ` Tassilo Horn @ 2022-04-11 7:59 ` Nicolas Martyanoff 2022-04-11 11:33 ` Eli Zaretskii 1 sibling, 1 reply; 6+ messages in thread From: Nicolas Martyanoff @ 2022-04-11 7:59 UTC (permalink / raw) To: Eli Zaretskii; +Cc: Nicolas Martyanoff, Tassilo Horn, 54838 Hi Eli, With your patch applied on HEAD, directory renaming seems to be working correctly (tested with direct children and with nested directories). Thank you so much for such a quick patch! Regards, -- Nicolas Martyanoff http://snowsyn.net khaelin@gmail.com ^ permalink raw reply [flat|nested] 6+ messages in thread
* bug#54838: 28.1; Buffers are not updated when a directory is renamed in dired 2022-04-11 7:59 ` Nicolas Martyanoff @ 2022-04-11 11:33 ` Eli Zaretskii 0 siblings, 0 replies; 6+ messages in thread From: Eli Zaretskii @ 2022-04-11 11:33 UTC (permalink / raw) To: Nicolas Martyanoff; +Cc: 54838-done, khaelin, tsdh > From: Nicolas Martyanoff <khaelin@gmail.com> > Cc: Nicolas Martyanoff <khaelin@gmail.com>, Tassilo Horn <tsdh@gnu.org>, > 54838@debbugs.gnu.org > Date: Mon, 11 Apr 2022 09:59:03 +0200 > > With your patch applied on HEAD, directory renaming seems to be working > correctly (tested with direct children and with nested directories). > > Thank you so much for such a quick patch! Thanks for testing. I've now installed the changes on the emacs-28 branch, and they will appear in Emacs 28.2. I'm therefore closing this bug. ^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2022-04-11 11:33 UTC | newest] Thread overview: 6+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2022-04-10 15:25 bug#54838: 28.1; Buffers are not updated when a directory is renamed in dired Nicolas Martyanoff 2022-04-10 17:14 ` Eli Zaretskii 2022-04-10 17:19 ` Tassilo Horn 2022-04-10 17:38 ` Eli Zaretskii 2022-04-11 7:59 ` Nicolas Martyanoff 2022-04-11 11:33 ` Eli Zaretskii
Code repositories for project(s) associated with this public inbox https://git.savannah.gnu.org/cgit/emacs.git This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).