Subject: Re: bug#10489: 24.0.92; dired-do-copy may create infinite directory hierarchy

From: Thierry Volpiatto <[email-masked]>
Date: Fri, 13 Jan 2012 19:43:50 +0100

Michael Albinus <[email-masked]> writes:

> Juanma Barranquero <[email-masked]> writes:
>
>> On Fri, Jan 13, 2012 at 15:14, Drew Adams <[email-masked]> 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@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

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