GNU bug report logs - #10489
24.0.92; dired-do-copy may create infinite directory hierarchy

Previous Next

Package: emacs;

Reported by: michael_heerdegen <at> web.de

Date: Thu, 12 Jan 2012 19:36:01 UTC

Severity: important

Tags: patch

Merged with 11130

Found in version 24.0.92

Done: Chong Yidong <cyd <at> gnu.org>

Bug is archived. No further changes may be made.

Full log


Message #107 received at submit <at> debbugs.gnu.org (full text, mbox):

From: Thierry Volpiatto <thierry.volpiatto <at> gmail.com>
To: bug-gnu-emacs <at> gnu.org
Subject: Re: bug#10489: 24.0.92;
	dired-do-copy may create infinite directory hierarchy
Date: Fri, 13 Jan 2012 19:59:51 +0100
Thierry Volpiatto <thierry.volpiatto <at> gmail.com> writes:

> Michael Albinus <michael.albinus <at> gmx.de> writes:
>
>> Juanma Barranquero <lekktu <at> gmail.com> writes:
>>
>>> On Fri, Jan 13, 2012 at 15:14, Drew Adams <drew.adams <at> oracle.com> wrote:
>>>
>>>>  (and (equal (file-remote-p file1) (file-remote-p file2))
>>>
>>> Why is the file-remote-p needed?
>>
>> For some simple cases, `file-remote-p' does the correct expansion.
>>
>> (file-remote-p "/sudo::") => "/sudo:root <at> host:"
>>
>> With this expansion, "/sudo::/path/file" and "/sudo:host:/path/file"
>> would be equal.
>
> What about this?
>
> (defun file-name-equal-p (name1 name2 &optional dir)
>   (let* ((n1     (file-truename (expand-file-name name1 dir)))
>          (n2     (file-truename (expand-file-name name2 dir)))
>          (rhost1 (file-remote-p n1 'host))
>          (rhost2 (file-remote-p n2 'host))
>          (lname1 (file-remote-p n1 'localname))
>          (lname2 (file-remote-p n2 'localname))
>          (rem-n1 (if rhost1
>                      (list (cons rhost1 lname1))
>                      (list (cons (system-name) n1))))
>          (rem-n2 (if rhost2
>                      (list (cons rhost2 lname2))
>                      (list (cons (system-name) n2)))))
>     (loop for (x1 . y1) in rem-n1
>           for (x2 . y2) in rem-n2
>           thereis (and (equal x1 x2)
>                        (equal y1 y2)))))
>
> (file-name-equal-p "/home/thierry/Test" "~/Test")
> ;=>t
> (file-name-equal-p "/home/thierry/Test" "/home/thierry/tmp/Test")
> ;=>nil
> (file-name-equal-p "/ssh:thievol:/home/thierry/Test" "/scpc:thievol:/home/thierry/Test")
> ;=>t
> (file-name-equal-p "/sudo::/home/thierry/Test" "/sudo::~/Test")
> ;=>nil
> (file-name-equal-p "/sudo::/home/thierry/Test" "~/Test")
> ;=>t
> (file-name-equal-p "/home/thierry/tmp" "/tmp")
> ;=>nil

We need also to use file-name-as-directory for this use case:
(file-name-equal-p "/home/thierry/Test" "~/Test/")
;=>t

--8<---------------cut here---------------start------------->8---
(defun file-name-equal-p (name1 name2 &optional dir)
  (let* ((n1     (file-name-as-directory
                  (file-truename (expand-file-name name1 dir))))
         (n2     (file-name-as-directory
                  (file-truename (expand-file-name name2 dir))))
         (rhost1 (file-remote-p n1 'host))
         (rhost2 (file-remote-p n2 'host))
         (lname1 (file-remote-p n1 'localname))
         (lname2 (file-remote-p n2 'localname))
         (rem-n1 (if rhost1
                     (list (cons rhost1 lname1))
                     (list (cons (system-name) n1))))
         (rem-n2 (if rhost2
                     (list (cons rhost2 lname2))
                     (list (cons (system-name) n2)))))
    (loop for (x1 . y1) in rem-n1
          for (x2 . y2) in rem-n2
          thereis (and (equal x1 x2)
                       (equal y1 y2)))))
--8<---------------cut here---------------end--------------->8---

-- 
  Thierry
Get my Gnupg key:
gpg --keyserver pgp.mit.edu --recv-keys 59F29997 





This bug report was last modified 13 years and 58 days ago.

Previous Next


GNU bug tracking system
Copyright (C) 1999 Darren O. Benham, 1997,2003 nCipher Corporation Ltd, 1994-97 Ian Jackson.