all messages for Emacs-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
From: Michael Albinus <michael.albinus@gmx.de>
To: Lars Ingebrigtsen <larsi@gnus.org>
Cc: Thierry Volpiatto <thievol@posteo.net>, 58446@debbugs.gnu.org
Subject: bug#58446: 28.2; file-attribute-device-number returns a cons cell instead of an integer
Date: Wed, 12 Oct 2022 16:57:04 +0200	[thread overview]
Message-ID: <87edvd5bun.fsf@gmx.de> (raw)
In-Reply-To: <87pmexcn1h.fsf@gnus.org> (Lars Ingebrigtsen's message of "Wed, 12 Oct 2022 13:13:30 +0200")

Lars Ingebrigtsen <larsi@gnus.org> writes:

Hi Lars,

>> The device-number in file-attributes (nth 11) is a cons cell when called
>> on remote files (see tramp-get-device).
>> It would be great to notify this in Emacs documentation and how to
>> interpret this value e.g. (-1 . 1).
>> I noticed this in fixing a bug in dired-async.el, the code was using `=`
>> to compare the two values which is legitimate according to docstring.
>
> Hm...  would it be possible for Tramp to stash that information
> somewhere else?  It is (as you say) documented to be a number.

Yes, Tramp is out of the documented API in this case. And no, it cannot
be kept somewhere else.

Inodes are unique only on the given file system. That's why there are
device numbers, which identify a file system.

A remote file is not related to any (local) file system. That's why
ange-ftp returns -1 as device-number, always. This is good enough for
practical purposes, because it is different to any device number of a
file system visible on the local host. For the inode number, ange-ftp
uses a "virtual" one, which means for every accessed file it increases
its internal counter. By this, all files accessed by ange-ftp are
regarded as different if they differ in the remote file name, even if
they are equal.

Tramp did inherit this approach from ange-ftp, with the difference that
it uses virtual inode numbers only in case it couldn't determine the
real inode number. It has its own counter for virtual inode numbers,
divided from ange-ftp.

This had several problems. The device number of all connected remote
devices, be it via any Tramp method or via ange-ftp, was always the
same. Remote files were regarded as equal if just the inode number was
the same, be it a real inode number or a virtual number.

Therefore, in January 2003 (almost 20 years ago :-) the device number in
Tramp has changed. It is now a cons cell (-1 . REMOTE), with REMOTE
being a virtual device number generated by Tramp for very connection.

By this, the tupel (inode, device) still identifies a file uniquely,
being it local or remote.

As said, this change happend almost 20 years ago. Device numbers are
usually ignored by Emacs and external packages, I don't remember a
problem report for this over the years. Emacs core creates the
buffer-local variable buffer-file-number, which is indeed (INODE
DEVNUM). See basic-save-buffer:

	      (setq buffer-file-number
		    (nthcdr 10 (file-attributes buffer-file-name)))

And this variable is used for checking whether two files are equal, see
find-buffer-visiting:

                            (equal buffer-file-number number)

That's why it works also with Tramp's interpretation of device
numbers. And again, w/o blame over the years.

I tend to agree with Thierry: we shall document the status quo,
i.e. device numbers can be more than just an integer, and should be
compared via equal. The details of that structure don't matter I
believe.

And perhaps we could even add a helper function to extract the
information for a file's uniqueness:

(defsubst file-attribute-file-number (attributes)
  "The inode and device numbers in ATTRIBUTES returned by `file-attributes'.
It can be used to determine whether two files are identical."
  (nthcdr 10 attributes))

WDYT?

Best regards, Michael.





  reply	other threads:[~2022-10-12 14:57 UTC|newest]

Thread overview: 12+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-10-11 18:11 bug#58446: 28.2; file-attribute-device-number returns a cons cell instead of an integer Thierry Volpiatto
2022-10-12 11:13 ` Lars Ingebrigtsen
2022-10-12 14:57   ` Michael Albinus [this message]
2022-10-13  6:31     ` Lars Ingebrigtsen
2022-10-13  7:09       ` Eli Zaretskii
2022-10-13 19:16         ` Michael Albinus
2022-10-14 17:04     ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2022-10-14 17:28       ` Michael Albinus
2022-10-14 18:34         ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2022-10-14 19:03           ` Michael Albinus
2022-10-14 19:14             ` Eli Zaretskii
2022-10-14 19:33               ` Michael Albinus

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=87edvd5bun.fsf@gmx.de \
    --to=michael.albinus@gmx.de \
    --cc=58446@debbugs.gnu.org \
    --cc=larsi@gnus.org \
    --cc=thievol@posteo.net \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this external index

	https://git.savannah.gnu.org/cgit/emacs.git
	https://git.savannah.gnu.org/cgit/emacs/org-mode.git

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.