unofficial mirror of bug-gnu-emacs@gnu.org 
 help / color / mirror / code / Atom feed
* 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).