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

From: Thierry Volpiatto <[email-masked]>
Date: Fri, 24 Feb 2012 14:36:11 +0100

Hi Michael,

Michael Albinus <[email-masked]> writes:

> For both functions, please check for a file name handler, and call it if
> available. It doesn't matter that they are not implemented yet; there is
> the fallback to the native implementation in that case.
>
> With this check, I could start to implement the file name handlers in
> Tramp's upstream repository.
Do you mean something like in copy-directory:

--8<---------------cut here---------------start------------->8---
  (let ((handler (or (find-file-name-handler directory 'copy-directory)
		     (find-file-name-handler newname 'copy-directory))))
    (if handler
	(funcall handler 'copy-directory directory newname keep-time parents)
--8<---------------cut here---------------end--------------->8---

>> +(defun files-equal-p (file1 file2)
>> +  "Return non-nil if FILE1 and FILE2 name the same file."
>> +  (and (equal (file-remote-p file1) (file-remote-p file2))
>> +       (equal (file-attributes (file-truename file1))
>> +              (file-attributes (file-truename file2)))))
>
> This implementation requires, that inode number and filesystem device
> number are always unique. This is true for local files, if you run a
> Unix-like system. It is not guaranteed for remote files. And it is even
> not guaranted, if the local system is Windows: on mounted drives, the
> returned inode number is 0:
That annoying because the solution proposed by Stephane (stopping the
loop before being infinite) is based on Inode comparison, at least as I
have implemented it.

> (file-attributes "y:/.emacs")
> => (nil 1 101567 513 (20295 15877) (20234 46272) (20234 46272) 33083 "-rw-rw-rw-" nil 0 (47631 . 5881))

So what do you propose for such a case?

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