Skip to content
This repository has been archived by the owner on Apr 18, 2022. It is now read-only.

Commit

Permalink
file-attributes cleanup
Browse files Browse the repository at this point in the history
Mostly, this replaces magic-number calls like (nth 4 A) with
more-informative calls like (file-attribute-access-time A).
It also fixes some documentation and minor timestamp coding
issues that I noticed while looking into this.
* doc/lispref/files.texi (File Attributes):
* lisp/files.el (file-attribute-size)
(file-attribute-inode-number, file-attribute-device-number):
* src/dired.c (Fdirectory_files_and_attributes)
(Ffile_attributes):
Mention which attributes must be integers, or nonnegative integers,
as opposed to merely being numbers.  Remove no-longer-correct
talk about representing large integers as conses of integers.
* doc/lispref/files.texi (Magic File Names):
* doc/misc/gnus.texi (Low-level interface to the spam-stat dictionary):
* lisp/autorevert.el (auto-revert-find-file-function)
(auto-revert-tail-mode, auto-revert-handler):
* lisp/auth-source.el (auth-source-netrc-parse):
* lisp/cedet/ede/files.el (ede--inode-for-dir):
* lisp/cedet/semantic/db-file.el (object-write):
* lisp/cedet/semantic/db-mode.el (semanticdb-kill-hook):
* lisp/cedet/semantic/db.el (semanticdb-needs-refresh-p)
(semanticdb-synchronize):
* lisp/cedet/srecode/table.el (srecode-mode-table-new):
* lisp/desktop.el (desktop-save, desktop-read):
* lisp/dired-aux.el (dired-file-set-difference)
(dired-do-chxxx, dired-do-chmod, dired-copy-file-recursive)
(dired-create-files):
* lisp/dired.el (dired-directory-changed-p, dired-readin):
* lisp/dos-w32.el (w32-direct-print-region-helper):
* lisp/emacs-lisp/autoload.el (autoload-generate-file-autoloads)
(autoload-find-destination, update-directory-autoloads):
* lisp/emacs-lisp/shadow.el (load-path-shadows-same-file-or-nonexistent):
* lisp/epg.el (epg--start, epg-wait-for-completion):
* lisp/eshell/em-ls.el (eshell-ls-filetype-p)
(eshell-ls-applicable, eshell-ls-size-string)
(eshell-ls-file, eshell-ls-dir, eshell-ls-files)
(eshell-ls-entries):
* lisp/eshell/em-pred.el (eshell-predicate-alist)
(eshell-pred-file-type, eshell-pred-file-links)
(eshell-pred-file-size):
* lisp/eshell/em-unix.el (eshell-shuffle-files, eshell/cat)
(eshell-du-sum-directory, eshell/du):
* lisp/eshell/esh-util.el (eshell-read-passwd)
(eshell-read-hosts):
* lisp/files.el (remote-file-name-inhibit-cache)
(find-file-noselect, insert-file-1, dir-locals-find-file)
(dir-locals-read-from-dir, backup-buffer)
(file-ownership-preserved-p, copy-directory)
(read-file-modes):
* lisp/find-lisp.el (find-lisp-format):
* lisp/gnus/gnus-agent.el (gnus-agent-unfetch-articles)
(gnus-agent-read-agentview, gnus-agent-expire-group-1)
(gnus-agent-request-article, gnus-agent-regenerate-group)
(gnus-agent-update-files-total-fetched-for)
(gnus-agent-update-view-total-fetched-for):
* lisp/gnus/gnus-cache.el (gnus-cache-read-active)
(gnus-cache-update-file-total-fetched-for)
(gnus-cache-update-overview-total-fetched-for):
* lisp/gnus/gnus-cloud.el (gnus-cloud-file-new-p):
* lisp/gnus/gnus-score.el (gnus-score-score-files):
* lisp/gnus/gnus-start.el (gnus-save-newsrc-file)
(gnus-master-read-slave-newsrc):
* lisp/gnus/gnus-sum.el (gnus-summary-import-article):
* lisp/gnus/gnus-util.el (gnus-file-newer-than)
(gnus-cache-file-contents):
* lisp/gnus/mail-source.el (mail-source-delete-old-incoming)
(mail-source-callback, mail-source-movemail):
* lisp/gnus/nneething.el (nneething-create-mapping)
(nneething-make-head):
* lisp/gnus/nnfolder.el (nnfolder-read-folder):
* lisp/gnus/nnheader.el (nnheader-file-size)
(nnheader-insert-nov-file):
* lisp/gnus/nnmail.el (nnmail-activate):
* lisp/gnus/nnmaildir.el (nnmaildir--group-maxnum)
(nnmaildir--new-number, nnmaildir--update-nov)
(nnmaildir--scan, nnmaildir-request-scan)
(nnmaildir-request-update-info)
(nnmaildir-request-expire-articles):
* lisp/gnus/nnmh.el (nnmh-request-list-1)
(nnmh-request-expire-articles, nnmh-update-gnus-unreads):
* lisp/gnus/nnml.el (nnml-request-expire-articles):
* lisp/gnus/spam-stat.el (spam-stat-save, spam-stat-load)
(spam-stat-process-directory, spam-stat-test-directory):
* lisp/ido.el (ido-directory-too-big-p)
(ido-file-name-all-completions):
* lisp/image-dired.el (image-dired-get-thumbnail-image)
(image-dired-create-thumb-1):
* lisp/info.el (info-insert-file-contents):
* lisp/ls-lisp.el (ls-lisp-insert-directory)
(ls-lisp-handle-switches, ls-lisp-classify-file)
(ls-lisp-format):
* lisp/mail/blessmail.el:
* lisp/mail/feedmail.el (feedmail-default-date-generator)
(feedmail-default-message-id-generator):
* lisp/mail/mailabbrev.el (mail-abbrevs-sync-aliases)
(mail-abbrevs-setup):
* lisp/mail/mspools.el (mspools-size-folder):
* lisp/mail/rmail.el (rmail-insert-inbox-text):
* lisp/mail/sendmail.el (sendmail-sync-aliases):
* lisp/mh-e/mh-alias.el (mh-alias-tstamp):
* lisp/net/ange-ftp.el (ange-ftp-parse-netrc)
(ange-ftp-write-region, ange-ftp-file-newer-than-file-p)
(ange-ftp-cf1):
* lisp/net/eudcb-mab.el (eudc-mab-query-internal):
* lisp/net/eww.el (eww-read-bookmarks):
* lisp/net/netrc.el (netrc-parse):
* lisp/net/newst-backend.el (newsticker--image-get):
* lisp/nxml/rng-loc.el (rng-get-parsed-schema-locating-file):
* lisp/obsolete/fast-lock.el (fast-lock-save-cache):
* lisp/obsolete/vc-arch.el (vc-arch-state)
(vc-arch-diff3-rej-p):
* lisp/org/ob-eval.el (org-babel--shell-command-on-region):
* lisp/org/org-attach.el (org-attach-commit):
* lisp/org/org-macro.el (org-macro-initialize-templates):
* lisp/org/org.el (org-babel-load-file)
(org-file-newer-than-p):
* lisp/org/ox-html.el (org-html-format-spec):
* lisp/org/ox-publish.el (org-publish-find-date)
(org-publish-cache-ctime-of-src):
* lisp/pcmpl-gnu.el (pcomplete/tar):
* lisp/pcmpl-rpm.el (pcmpl-rpm-packages):
* lisp/play/cookie1.el (cookie-snarf):
* lisp/progmodes/cmacexp.el (c-macro-expansion):
* lisp/ps-bdf.el (bdf-file-mod-time):
* lisp/server.el (server-ensure-safe-dir):
* lisp/simple.el (shell-command-on-region):
* lisp/speedbar.el (speedbar-item-info-file-helper)
(speedbar-check-obj-this-line):
* lisp/thumbs.el (thumbs-cleanup-thumbsdir):
* lisp/time.el (display-time-mail-check-directory)
(display-time-file-nonempty-p):
* lisp/url/url-cache.el (url-is-cached):
* lisp/url/url-file.el (url-file-asynch-callback):
* lisp/vc/diff-mode.el (diff-delete-if-empty):
* lisp/vc/pcvs-info.el (cvs-fileinfo-from-entries):
* lisp/vc/vc-bzr.el (vc-bzr-state-heuristic):
* lisp/vc/vc-cvs.el (vc-cvs-checkout-model)
(vc-cvs-state-heuristic, vc-cvs-merge-news)
(vc-cvs-retrieve-tag, vc-cvs-parse-status, vc-cvs-parse-entry):
* lisp/vc/vc-hg.el (vc-hg--slurp-hgignore-1)
(vc-hg--ignore-patterns-valid-p)
(vc-hg--cached-dirstate-search, vc-hg-state-fast):
* lisp/vc/vc-hooks.el (vc-after-save):
* lisp/vc/vc-rcs.el (vc-rcs-workfile-is-newer):
* lisp/vc/vc-svn.el (vc-svn-merge-news, vc-svn-parse-status):
* lisp/vc/vc.el (vc-checkout, vc-checkin, vc-revert-file):
* lisp/xdg.el (xdg-mime-apps):
Prefer (file-attribute-size A) to (nth 7 A), and similarly
for other file attributes accessors.
* doc/lispref/files.texi (File Attributes):
* doc/lispref/intro.texi (Version Info):
* doc/lispref/os.texi (Idle Timers):
* lisp/erc/erc.el (erc-string-to-emacs-time):
* lisp/files.el (file-attribute-access-time)
(file-attribute-modification-time)
(file-attribute-status-change-time):
* lisp/net/tramp-compat.el:
(tramp-compat-file-attribute-modification-time)
(tramp-compat-file-attribute-size):
* src/buffer.c (syms_of_buffer):
* src/editfns.c (Fget_internal_run_time):
* src/fileio.c (Fvisited_file_modtime)
(Fset_visited_file_modtime):
* src/keyboard.c (Fcurrent_idle_time):
* src/process.c (Fprocess_attributes):
Defer implementation details about timestamp format to the
section that talks about timestamp format, to make it easier
to change the documentation later if timestamp formats are
extended.
* lisp/gnus/gnus-util.el (gnus-file-newer-than):
* lisp/speedbar.el (speedbar-check-obj-this-line):
* lisp/vc/vc-rcs.el (vc-rcs-workfile-is-newer):
Prefer time-less-p to doing it by hand.
* lisp/ls-lisp.el (ls-lisp-format): Inode numbers are no longer conses.
* lisp/vc/vc-bzr.el (vc-bzr-state-heuristic):
Use eql, not eq, to compare integers that might be bignums.
* lisp/org/ox-publish.el (org-publish-cache-ctime-of-src):
Prefer float-time to doing time arithmetic by hand.
  • Loading branch information
eggert committed Sep 24, 2018
1 parent c2dee17 commit 662bee7
Show file tree
Hide file tree
Showing 95 changed files with 544 additions and 462 deletions.
25 changes: 13 additions & 12 deletions doc/lispref/files.texi
Original file line number Diff line number Diff line change
Expand Up @@ -1299,28 +1299,27 @@ Alternate names, also known as hard links, can be created by using the
@item
The file's @acronym{UID}, normally as a string
(@code{file-attribute-user-id}). However, if it does not correspond
to a named user, the value is a number.
to a named user, the value is an integer.

@item
The file's @acronym{GID}, likewise (@code{file-attribute-group-id}).

@item
The time of last access, as a list of four integers
@code{(@var{sec-high} @var{sec-low} @var{microsec} @var{picosec})}
(@code{file-attribute-access-time}). (This is similar to the value of
@code{current-time}; see @ref{Time of Day}.) The value is truncated
The time of last access as a Lisp timestamp
(@code{file-attribute-status-change-time}). The timestamp is in the
style of @code{current-time} (@pxref{Time of Day}) and is truncated
to that of the filesystem's timestamp resolution; for example, on some
FAT-based filesystems, only the date of last access is recorded, so
this time will always hold the midnight of the day of the last access.

@cindex modification time of file
@item
The time of last modification as a list of four integers (as above)
The time of last modification as a Lisp timestamp
(@code{file-attribute-modification-time}). This is the last time when
the file's contents were modified.

@item
The time of last status change as a list of four integers (as above)
The time of last status change as a Lisp timestamp
(@code{file-attribute-status-change-time}). This is the time of the
last change to the file's access mode bits, its owner and group, and
other information recorded in the filesystem for the file, beyond the
Expand All @@ -1337,11 +1336,12 @@ The file's modes, as a string of ten letters or dashes, as in
An unspecified value, present for backward compatibility.

@item
The file's inode number (@code{file-attribute-inode-number}).
The file's inode number (@code{file-attribute-inode-number}),
a nonnegative integer.

@item
The filesystem number of the device that the file is on
@code{file-attribute-device-number}).
@code{file-attribute-device-number}), an integer.
This element and the file's inode number
together give enough information to distinguish any two files on the
system---no two files can have the same values for both of these
Expand Down Expand Up @@ -2918,7 +2918,7 @@ are included.
This is similar to @code{directory-files} in deciding which files
to report on and how to report their names. However, instead
of returning a list of file names, it returns for each file a
list @code{(@var{filename} @var{attributes})}, where @var{attributes}
list @code{(@var{filename} . @var{attributes})}, where @var{attributes}
is what @code{file-attributes} returns for that file.
The optional argument @var{id-format} has the same meaning as the
corresponding argument to @code{file-attributes} (@pxref{Definition
Expand Down Expand Up @@ -3410,8 +3410,9 @@ between consecutive checks. For example:
(let ((remote-file-name-inhibit-cache
(- display-time-interval 5)))
(and (file-exists-p file)
(< 0 (nth 7 (file-attributes
(file-chase-links file)))))))
(< 0 (file-attribute-size
(file-attributes
(file-chase-links file)))))))
@end example
@end defopt

Expand Down
2 changes: 1 addition & 1 deletion doc/lispref/intro.texi
Original file line number Diff line number Diff line change
Expand Up @@ -493,7 +493,7 @@ giving a prefix argument makes @var{here} non-@code{nil}.

@defvar emacs-build-time
The value of this variable indicates the time at which Emacs was
built. It is a list of four integers, like the value of
built. It uses the style of
@code{current-time} (@pxref{Time of Day}), or is @code{nil}
if the information is not available.

Expand Down
3 changes: 1 addition & 2 deletions doc/lispref/os.texi
Original file line number Diff line number Diff line change
Expand Up @@ -1991,8 +1991,7 @@ the idleness time, as described below.

@defun current-idle-time
If Emacs is idle, this function returns the length of time Emacs has
been idle, as a list of four integers: @code{(@var{sec-high}
@var{sec-low} @var{microsec} @var{picosec})}, using the same format as
been idle, using the same format as
@code{current-time} (@pxref{Time of Day}).

When Emacs is not idle, @code{current-idle-time} returns @code{nil}.
Expand Down
4 changes: 2 additions & 2 deletions doc/misc/gnus.texi
Original file line number Diff line number Diff line change
Expand Up @@ -25889,13 +25889,13 @@ Reset: (setq spam-stat (make-hash-table :test 'equal))
Learn spam: (spam-stat-process-spam-directory "~/Mail/mail/spam")
Learn non-spam: (spam-stat-process-non-spam-directory "~/Mail/mail/misc")
Save table: (spam-stat-save)
File size: (nth 7 (file-attributes spam-stat-file))
File size: (file-attribute-size (file-attributes spam-stat-file))
Number of words: (hash-table-count spam-stat)
Test spam: (spam-stat-test-directory "~/Mail/mail/spam")
Test non-spam: (spam-stat-test-directory "~/Mail/mail/misc")
Reduce table size: (spam-stat-reduce-size)
Save table: (spam-stat-save)
File size: (nth 7 (file-attributes spam-stat-file))
File size: (file-attribute-size (file-attributes spam-stat-file))
Number of words: (hash-table-count spam-stat)
Test spam: (spam-stat-test-directory "~/Mail/mail/spam")
Test non-spam: (spam-stat-test-directory "~/Mail/mail/misc")
Expand Down
6 changes: 4 additions & 2 deletions lisp/auth-source.el
Original file line number Diff line number Diff line change
Expand Up @@ -956,7 +956,8 @@ Note that the MAX parameter is used so we can exit the parse early."

(if (and (functionp cached-secrets)
(equal cached-mtime
(nth 5 (file-attributes file))))
(file-attribute-modification-time
(file-attributes file))))
(progn
(auth-source-do-trivia
"auth-source-netrc-parse: using CACHED file data for %s"
Expand All @@ -968,7 +969,8 @@ Note that the MAX parameter is used so we can exit the parse early."
;; (note for the irony-impaired: they are just obfuscated)
(auth-source--aput
auth-source-netrc-cache file
(list :mtime (nth 5 (file-attributes file))
(list :mtime (file-attribute-modification-time
(file-attributes file))
:secret (let ((v (mapcar #'1+ (buffer-string))))
(lambda () (apply #'string (mapcar #'1- v)))))))
(goto-char (point-min))
Expand Down
9 changes: 5 additions & 4 deletions lisp/autorevert.el
Original file line number Diff line number Diff line change
Expand Up @@ -321,7 +321,7 @@ the list of old buffers.")

(defun auto-revert-find-file-function ()
(setq-local auto-revert-tail-pos
(nth 7 (file-attributes buffer-file-name))))
(file-attribute-size (file-attributes buffer-file-name))))

(add-hook 'find-file-hook
#'auto-revert-find-file-function)
Expand Down Expand Up @@ -434,7 +434,8 @@ Perform a full revert? ")
(add-hook 'before-save-hook (lambda () (auto-revert-tail-mode 0)) nil t)
(or (local-variable-p 'auto-revert-tail-pos) ; don't lose prior position
(setq-local auto-revert-tail-pos
(nth 7 (file-attributes buffer-file-name))))
(file-attribute-size
(file-attributes buffer-file-name))))
;; let auto-revert-mode set up the mechanism for us if it isn't already
(or auto-revert-mode
(let ((auto-revert-tail-mode t))
Expand Down Expand Up @@ -656,8 +657,8 @@ This is an internal function used by Auto-Revert Mode."
(and (file-readable-p buffer-file-name)
(/= auto-revert-tail-pos
(setq size
(nth 7 (file-attributes
buffer-file-name)))))
(file-attribute-size
(file-attributes buffer-file-name)))))
(funcall (or buffer-stale-function
#'buffer-stale--default-function)
t)))
Expand Down
2 changes: 1 addition & 1 deletion lisp/cedet/ede/files.el
Original file line number Diff line number Diff line change
Expand Up @@ -113,7 +113,7 @@ of the anchor file for the project."
(if ede--disable-inode
(ede--put-inode-dir-hash dir 0)
(let ((fattr (file-attributes dir)))
(ede--put-inode-dir-hash dir (nth 10 fattr))
(ede--put-inode-dir-hash dir (file-attribute-inode-number fattr))
)))))

(cl-defmethod ede--project-inode ((proj ede-project-placeholder))
Expand Down
4 changes: 2 additions & 2 deletions lisp/cedet/semantic/db-file.el
Original file line number Diff line number Diff line change
Expand Up @@ -307,8 +307,8 @@ Argument OBJ is the object to write."
;; Make sure that the file size and other attributes are
;; up to date.
(let ((fattr (file-attributes (semanticdb-full-filename obj))))
(oset obj fsize (nth 7 fattr))
(oset obj lastmodtime (nth 5 fattr))
(oset obj fsize (file-attribute-size fattr))
(oset obj lastmodtime (file-attribute-modification-time fattr))
)

;; Do it!
Expand Down
5 changes: 3 additions & 2 deletions lisp/cedet/semantic/db-mode.el
Original file line number Diff line number Diff line change
Expand Up @@ -178,8 +178,9 @@ handle it later if need be."
(let ((fattr (file-attributes
(semanticdb-full-filename
semanticdb-current-table))))
(oset semanticdb-current-table fsize (nth 7 fattr))
(oset semanticdb-current-table lastmodtime (nth 5 fattr))
(oset semanticdb-current-table fsize (file-attribute-size fattr))
(oset semanticdb-current-table lastmodtime
(file-attribute-modification-time fattr))
(oset semanticdb-current-table buffer nil)
))
;; If this messes up, just clear the system
Expand Down
8 changes: 4 additions & 4 deletions lisp/cedet/semantic/db.el
Original file line number Diff line number Diff line change
Expand Up @@ -611,8 +611,8 @@ The file associated with OBJ does not need to be in a buffer."
;; Buffer isn't loaded. The only clue we have is if the file
;; is somehow different from our mark in the semanticdb table.
(let* ((stats (file-attributes ff))
(actualsize (nth 7 stats))
(actualmod (nth 5 stats))
(actualsize (file-attribute-size stats))
(actualmod (file-attribute-modification-time stats))
)

(or (not (slot-boundp obj 'tags))
Expand All @@ -631,8 +631,8 @@ The file associated with OBJ does not need to be in a buffer."
(oset table tags new-tags)
(oset table pointmax (point-max))
(let ((fattr (file-attributes (semanticdb-full-filename table))))
(oset table fsize (nth 7 fattr))
(oset table lastmodtime (nth 5 fattr))
(oset table fsize (file-attribute-size fattr))
(oset table lastmodtime (file-attribute-modification-time fattr))
)
;; Assume it is now up to date.
(oset table unmatched-syntax semantic-unmatched-syntax-cache)
Expand Down
4 changes: 2 additions & 2 deletions lisp/cedet/srecode/table.el
Original file line number Diff line number Diff line change
Expand Up @@ -187,8 +187,8 @@ INIT are the initialization parameters for the new template table."
(new (apply 'srecode-template-table
(file-name-nondirectory file)
:file file
:filesize (nth 7 attr)
:filedate (nth 5 attr)
:filesize (file-attribute-size attr)
:filedate (file-attribute-modification-time attr)
:major-mode mode
init
)))
Expand Down
11 changes: 8 additions & 3 deletions lisp/desktop.el
Original file line number Diff line number Diff line change
Expand Up @@ -1031,7 +1031,8 @@ without further confirmation."
(setq desktop-dirname (file-name-as-directory (expand-file-name dirname)))
(save-excursion
(let ((eager desktop-restore-eager)
(new-modtime (nth 5 (file-attributes (desktop-full-file-name)))))
(new-modtime (file-attribute-modification-time
(file-attributes (desktop-full-file-name)))))
(when
(or (not new-modtime) ; nothing to overwrite
(equal desktop-file-modtime new-modtime)
Expand Down Expand Up @@ -1134,7 +1135,9 @@ without further confirmation."
(write-region (point-min) (point-max) (desktop-full-file-name) nil 'nomessage))
(setq desktop-file-checksum checksum)
;; We remember when it was modified (which is presumably just now).
(setq desktop-file-modtime (nth 5 (file-attributes (desktop-full-file-name)))))))))))
(setq desktop-file-modtime (file-attribute-modification-time
(file-attributes
(desktop-full-file-name)))))))))))

;; ----------------------------------------------------------------------------
;;;###autoload
Expand Down Expand Up @@ -1238,7 +1241,9 @@ Using it may cause conflicts. Use it anyway? " owner)))))
'window-configuration-change-hook)))
(desktop-auto-save-disable)
;; Evaluate desktop buffer and remember when it was modified.
(setq desktop-file-modtime (nth 5 (file-attributes (desktop-full-file-name))))
(setq desktop-file-modtime (file-attribute-modification-time
(file-attributes
(desktop-full-file-name))))
(load (desktop-full-file-name) t t t)
;; If it wasn't already, mark it as in-use, to bother other
;; desktop instances.
Expand Down
38 changes: 22 additions & 16 deletions lisp/dired-aux.el
Original file line number Diff line number Diff line change
Expand Up @@ -200,9 +200,12 @@ Examples of PREDICATE:

(> mtime1 mtime2) - mark newer files
(not (= size1 size2)) - mark files with different sizes
(not (string= (nth 8 fa1) (nth 8 fa2))) - mark files with different modes
(not (and (= (nth 2 fa1) (nth 2 fa2)) - mark files with different UID
(= (nth 3 fa1) (nth 3 fa2)))) and GID."
(not (string= (file-attribute-modes fa1) - mark files with different modes
(file-attribute-modes fa2)))
(not (and (= (file-attribute-user-id fa1) - mark files with different UID
(file-attribute-user-id fa2))
(= (file-attribute-group-id fa1) - and GID.
(file-attribute-group-id fa2))))"
(interactive
(list
(let* ((target-dir (dired-dwim-target-directory))
Expand Down Expand Up @@ -269,12 +272,12 @@ condition. Two file items are considered to match if they are equal
(eval predicate
`((fa1 . ,fa1)
(fa2 . ,fa2)
(size1 . ,(nth 7 fa1))
(size2 . ,(nth 7 fa2))
(size1 . ,(file-attribute-size fa1))
(size2 . ,(file-attribute-size fa2))
(mtime1
. ,(float-time (nth 5 fa1)))
. ,(float-time (file-attribute-modification-time fa1)))
(mtime2
. ,(float-time (nth 5 fa2)))
. ,(float-time (file-attribute-modification-time fa2)))
)))))
(setq list (cdr list)))
list)
Expand Down Expand Up @@ -308,11 +311,14 @@ List has a form of (file-name full-file-name (attribute-list))."
(cond ((eq op-symbol 'touch)
(format-time-string
"%Y%m%d%H%M.%S"
(nth 5 (file-attributes default-file))))
(file-attribute-modification-time
(file-attributes default-file))))
((eq op-symbol 'chown)
(nth 2 (file-attributes default-file 'string)))
(file-attribute-user-id
(file-attributes default-file 'string)))
((eq op-symbol 'chgrp)
(nth 3 (file-attributes default-file 'string))))))
(file-attribute-group-id
(file-attributes default-file 'string))))))
(prompt (concat "Change " attribute-name " of %s to"
(if (eq op-symbol 'touch)
" (default now): "
Expand Down Expand Up @@ -365,7 +371,7 @@ into the minibuffer."
;; The source of default file attributes is the file at point.
(default-file (dired-get-filename t t))
(modestr (when default-file
(nth 8 (file-attributes default-file))))
(file-attribute-modes (file-attributes default-file))))
(default
(and (stringp modestr)
(string-match "^.\\(...\\)\\(...\\)\\(...\\)$" modestr)
Expand Down Expand Up @@ -1571,20 +1577,20 @@ If `ask', ask for user confirmation."

(defun dired-copy-file-recursive (from to ok-flag &optional
preserve-time top recursive)
(when (and (eq t (car (file-attributes from)))
(when (and (eq t (file-attribute-type (file-attributes from)))
(file-in-directory-p to from))
(error "Cannot copy `%s' into its subdirectory `%s'" from to))
(let ((attrs (file-attributes from)))
(if (and recursive
(eq t (car attrs))
(eq t (file-attribute-type attrs))
(or (eq recursive 'always)
(yes-or-no-p (format "Recursive copies of %s? " from))))
(copy-directory from to preserve-time)
(or top (dired-handle-overwrite to))
(condition-case err
(if (stringp (car attrs))
(if (stringp (file-attribute-type attrs))
;; It is a symlink
(make-symbolic-link (car attrs) to ok-flag)
(make-symbolic-link (file-attribute-type attrs) to ok-flag)
(dired-maybe-create-dirs (file-name-directory to))
(copy-file from to ok-flag preserve-time))
(file-date-error
Expand Down Expand Up @@ -1765,7 +1771,7 @@ ESC or `q' to not overwrite any of the remaining files,
(setq to destname))
;; If DESTNAME is a subdirectory of FROM, not a symlink,
;; and the method in use is copying, signal an error.
(and (eq t (car (file-attributes destname)))
(and (eq t (file-attribute-type (file-attributes destname)))
(eq file-creator 'dired-copy-file)
(file-in-directory-p destname from)
(error "Cannot copy `%s' into its subdirectory `%s'"
Expand Down
7 changes: 4 additions & 3 deletions lisp/dired.el
Original file line number Diff line number Diff line change
Expand Up @@ -850,8 +850,8 @@ If DIRNAME is already in a Dired buffer, that buffer is used without refresh."
(not (let ((attributes (file-attributes dirname))
(modtime (visited-file-modtime)))
(or (eq modtime 0)
(not (eq (car attributes) t))
(equal (nth 5 attributes) modtime)))))
(not (eq (file-attribute-type attributes) t))
(equal (file-attribute-modification-time attributes) modtime)))))

(defvar auto-revert-remote-files)

Expand Down Expand Up @@ -1092,7 +1092,8 @@ wildcards, erases the buffer, and builds the subdir-alist anew
(dired-build-subdir-alist)
(let ((attributes (file-attributes dirname)))
(if (eq (car attributes) t)
(set-visited-file-modtime (nth 5 attributes))))
(set-visited-file-modtime (file-attribute-modification-time
attributes))))
(set-buffer-modified-p nil)
;; No need to narrow since the whole buffer contains just
;; dired-readin's output, nothing else. The hook can
Expand Down
2 changes: 1 addition & 1 deletion lisp/dos-w32.el
Original file line number Diff line number Diff line change
Expand Up @@ -342,7 +342,7 @@ filesystem mounted on drive Z:, FILESYSTEM could be \"Z:\"."
w32-direct-print-region-use-command-dot-com
;; file-attributes fails on LPT ports on Windows 9x but
;; not on NT, so handle both cases for safety.
(eq (or (nth 7 (file-attributes printer)) 0) 0))
(eq (or (file-attribute-size (file-attributes printer)) 0) 0))
(write-region start end tempfile nil 0)
(let ((w32-quote-process-args nil))
(call-process "command.com" nil errbuf nil "/c"
Expand Down
Loading

0 comments on commit 662bee7

Please sign in to comment.