Commit e7a2937b authored by Paul Eggert's avatar Paul Eggert
Browse files

file-attributes has a new optional arg FOLLOW-SYMLINKS.

* doc/lispref/files.texi (File Attributes): Describe it.
(Magic File Names): Use it.
* etc/NEWS: Document the change.
* lisp/files.el (remote-file-name-inhibit-cache):
* lisp/time.el (display-time-file-nonempty-p): Use it.
* lisp/files.el (after-find-file): Don't chase links before calling
file-exists-p, as file-exists-p already does the right thing.
* src/dired.c (directory_files_internal, Ffile_attributes):
New arg follow_symlinks.  All uses changed.
parent b9ab1b1f
2012-09-30 Paul Eggert <eggert@cs.ucla.edu>
file-attributes has a new optional arg FOLLOW-SYMLINKS.
* files.texi (File Attributes): Describe it.
(Magic File Names): Use it.
2012-09-30 Chong Yidong <cyd@gnu.org> 2012-09-30 Chong Yidong <cyd@gnu.org>
* commands.texi (Click Events): Define "mouse position list". * commands.texi (Click Events): Define "mouse position list".
......
...@@ -1187,7 +1187,7 @@ link to. ...@@ -1187,7 +1187,7 @@ link to.
@end example @end example
@end defun @end defun
@defun file-attributes filename &optional id-format @defun file-attributes filename &optional id-format follow-symlinks
@anchor{Definition of file-attributes} @anchor{Definition of file-attributes}
This function returns a list of attributes of file @var{filename}. If This function returns a list of attributes of file @var{filename}. If
the specified file cannot be opened, it returns @code{nil}. the specified file cannot be opened, it returns @code{nil}.
...@@ -1197,6 +1197,9 @@ valid values are @code{'string} and @code{'integer}. The latter is ...@@ -1197,6 +1197,9 @@ valid values are @code{'string} and @code{'integer}. The latter is
the default, but we plan to change that, so you should specify a the default, but we plan to change that, so you should specify a
non-@code{nil} value for @var{id-format} if you use the returned non-@code{nil} value for @var{id-format} if you use the returned
@acronym{UID} or @acronym{GID}. @acronym{UID} or @acronym{GID}.
The optional parameter @var{follow-symlinks} says whether to follow
@var{filename} if it is a symbolic link; if @code{t}, symbolic links
are followed and if @code{nil} they are not.
The elements of the list, in order, are: The elements of the list, in order, are:
...@@ -2961,8 +2964,7 @@ between consecutive checks. For example: ...@@ -2961,8 +2964,7 @@ between consecutive checks. For example:
(let ((remote-file-name-inhibit-cache (let ((remote-file-name-inhibit-cache
(- display-time-interval 5))) (- display-time-interval 5)))
(and (file-exists-p file) (and (file-exists-p file)
(< 0 (nth 7 (file-attributes (< 0 (nth 7 (file-attributes file nil t))))))
(file-chase-links file)))))))
@end example @end example
@end defopt @end defopt
......
2012-09-30 Paul Eggert <eggert@cs.ucla.edu>
file-attributes has a new optional arg FOLLOW-SYMLINKS.
* NEWS: Document the change.
2012-09-30 Jan Djärv <jan.h.d@swipnet.se> 2012-09-30 Jan Djärv <jan.h.d@swipnet.se>
* NEWS: The NS port supports fullscreen. * NEWS: The NS port supports fullscreen.
......
...@@ -806,6 +806,11 @@ stamps are still accepted. ...@@ -806,6 +806,11 @@ stamps are still accepted.
The PSECS slot is new, and uses picosecond resolution. It can be The PSECS slot is new, and uses picosecond resolution. It can be
accessed via the new timer--psecs accessor. accessed via the new timer--psecs accessor.
+++
** file-attributes has a new optional argument FOLLOW-SYMLINKS
that says whether to follow symbolic links. The default, as before,
is to not follow symlinks.
+++ +++
** Floating point functions now always return special values like NaN, ** Floating point functions now always return special values like NaN,
instead of signaling errors, if given invalid args, e.g. (log -1.0). instead of signaling errors, if given invalid args, e.g. (log -1.0).
......
2012-09-30 Paul Eggert <eggert@cs.ucla.edu>
file-attributes has a new optional arg FOLLOW-SYMLINKS.
* files.el (remote-file-name-inhibit-cache):
* time.el (display-time-file-nonempty-p): Use it.
* files.el (after-find-file): Don't chase links before calling
file-exists-p, as file-exists-p already does the right thing.
2012-09-30 Ralf Angeli <angeli@caeruleus.net> 2012-09-30 Ralf Angeli <angeli@caeruleus.net>
Merge from standalone RefTeX repository. Merge from standalone RefTeX repository.
......
...@@ -1014,7 +1014,7 @@ consecutive checks. For example: ...@@ -1014,7 +1014,7 @@ consecutive checks. For example:
(defun display-time-file-nonempty-p (file) (defun display-time-file-nonempty-p (file)
(let ((remote-file-name-inhibit-cache (- display-time-interval 5))) (let ((remote-file-name-inhibit-cache (- display-time-interval 5)))
(and (file-exists-p file) (and (file-exists-p file)
(< 0 (nth 7 (file-attributes (file-chase-links file)))))))" (< 0 (nth 7 (file-attributes file nil t))))))"
:group 'files :group 'files
:version "24.1" :version "24.1"
:type `(choice :type `(choice
...@@ -2082,8 +2082,7 @@ unless NOMODES is non-nil." ...@@ -2082,8 +2082,7 @@ unless NOMODES is non-nil."
((and error (file-attributes buffer-file-name)) ((and error (file-attributes buffer-file-name))
(setq buffer-read-only t) (setq buffer-read-only t)
(if (and (file-symlink-p buffer-file-name) (if (and (file-symlink-p buffer-file-name)
(not (file-exists-p (not (file-exists-p buffer-file-name)))
(file-chase-links buffer-file-name))))
"Symbolic link that points to nonexistent file" "Symbolic link that points to nonexistent file"
"File exists, but cannot be read")) "File exists, but cannot be read"))
((not buffer-read-only) ((not buffer-read-only)
......
...@@ -485,7 +485,7 @@ update which can wait for the next redisplay." ...@@ -485,7 +485,7 @@ update which can wait for the next redisplay."
(defun display-time-file-nonempty-p (file) (defun display-time-file-nonempty-p (file)
(let ((remote-file-name-inhibit-cache (- display-time-interval 5))) (let ((remote-file-name-inhibit-cache (- display-time-interval 5)))
(and (file-exists-p file) (and (file-exists-p file)
(< 0 (nth 7 (file-attributes (file-chase-links file))))))) (< 0 (nth 7 (file-attributes file nil t))))))
;;;###autoload ;;;###autoload
(define-minor-mode display-time-mode (define-minor-mode display-time-mode
......
2012-09-30 Paul Eggert <eggert@cs.ucla.edu>
file-attributes has a new optional arg FOLLOW-SYMLINKS.
* dired.c (directory_files_internal, Ffile_attributes):
New arg follow_symlinks. All uses changed.
2012-09-30 Stefan Monnier <monnier@iro.umontreal.ca> 2012-09-30 Stefan Monnier <monnier@iro.umontreal.ca>
* .gdbinit (xbacktrace): Adjust to recent "struct backtrace" change. * .gdbinit (xbacktrace): Adjust to recent "struct backtrace" change.
......
...@@ -110,12 +110,13 @@ directory_files_internal_unwind (Lisp_Object dh) ...@@ -110,12 +110,13 @@ directory_files_internal_unwind (Lisp_Object dh)
/* Function shared by Fdirectory_files and Fdirectory_files_and_attributes. /* Function shared by Fdirectory_files and Fdirectory_files_and_attributes.
If not ATTRS, return a list of directory filenames; If not ATTRS, return a list of directory filenames;
if ATTRS, return a list of directory filenames and their attributes. if ATTRS, return a list of directory filenames and their attributes.
In the latter case, ID_FORMAT is passed to Ffile_attributes. */ In the latter case, ID_FORMAT and FOLLOW_SYMLINKS are passed to
Ffile_attributes. */
Lisp_Object Lisp_Object
directory_files_internal (Lisp_Object directory, Lisp_Object full, directory_files_internal (Lisp_Object directory, Lisp_Object full,
Lisp_Object match, Lisp_Object nosort, bool attrs, Lisp_Object match, Lisp_Object nosort, bool attrs,
Lisp_Object id_format) Lisp_Object id_format, Lisp_Object follow_symlinks)
{ {
DIR *d; DIR *d;
ptrdiff_t directory_nbytes; ptrdiff_t directory_nbytes;
...@@ -297,7 +298,8 @@ directory_files_internal (Lisp_Object directory, Lisp_Object full, ...@@ -297,7 +298,8 @@ directory_files_internal (Lisp_Object directory, Lisp_Object full,
/* Both Fexpand_file_name and Ffile_attributes can GC. */ /* Both Fexpand_file_name and Ffile_attributes can GC. */
decoded_fullname = Fexpand_file_name (name, directory); decoded_fullname = Fexpand_file_name (name, directory);
fileattrs = Ffile_attributes (decoded_fullname, id_format); fileattrs = Ffile_attributes (decoded_fullname, id_format,
follow_symlinks);
list = Fcons (Fcons (finalname, fileattrs), list); list = Fcons (Fcons (finalname, fileattrs), list);
UNGCPRO; UNGCPRO;
...@@ -350,7 +352,8 @@ If NOSORT is non-nil, the list is not sorted--its order is unpredictable. ...@@ -350,7 +352,8 @@ If NOSORT is non-nil, the list is not sorted--its order is unpredictable.
return call5 (handler, Qdirectory_files, directory, return call5 (handler, Qdirectory_files, directory,
full, match, nosort); full, match, nosort);
return directory_files_internal (directory, full, match, nosort, 0, Qnil); return directory_files_internal (directory, full, match, nosort, 0,
Qnil, Qnil);
} }
DEFUN ("directory-files-and-attributes", Fdirectory_files_and_attributes, DEFUN ("directory-files-and-attributes", Fdirectory_files_and_attributes,
...@@ -378,7 +381,8 @@ which see. */) ...@@ -378,7 +381,8 @@ which see. */)
return call6 (handler, Qdirectory_files_and_attributes, return call6 (handler, Qdirectory_files_and_attributes,
directory, full, match, nosort, id_format); directory, full, match, nosort, id_format);
return directory_files_internal (directory, full, match, nosort, 1, id_format); return directory_files_internal (directory, full, match, nosort, 1,
id_format, Qnil);
} }
...@@ -875,7 +879,7 @@ stat_gname (struct stat *st) ...@@ -875,7 +879,7 @@ stat_gname (struct stat *st)
#endif #endif
} }
DEFUN ("file-attributes", Ffile_attributes, Sfile_attributes, 1, 2, 0, DEFUN ("file-attributes", Ffile_attributes, Sfile_attributes, 1, 3, 0,
doc: /* Return a list of attributes of file FILENAME. doc: /* Return a list of attributes of file FILENAME.
Value is nil if specified file cannot be opened. Value is nil if specified file cannot be opened.
...@@ -884,6 +888,9 @@ below) - valid values are 'string and 'integer. The latter is the ...@@ -884,6 +888,9 @@ below) - valid values are 'string and 'integer. The latter is the
default, but we plan to change that, so you should specify a non-nil value default, but we plan to change that, so you should specify a non-nil value
for ID-FORMAT if you use the returned uid or gid. for ID-FORMAT if you use the returned uid or gid.
Optional argument FOLLOW-SYMLINKS says whether to follow symbolic
links. If t, they are followed; if nil, they are not.
Elements of the attribute list are: Elements of the attribute list are:
0. t for directory, string (name linked to) for symbolic link, or nil. 0. t for directory, string (name linked to) for symbolic link, or nil.
1. Number of links to file. 1. Number of links to file.
...@@ -917,7 +924,7 @@ which see. ...@@ -917,7 +924,7 @@ which see.
On some FAT-based filesystems, only the date of last access is recorded, On some FAT-based filesystems, only the date of last access is recorded,
so last access time will always be midnight of that day. */) so last access time will always be midnight of that day. */)
(Lisp_Object filename, Lisp_Object id_format) (Lisp_Object filename, Lisp_Object id_format, Lisp_Object follow_symlinks)
{ {
Lisp_Object values[12]; Lisp_Object values[12];
Lisp_Object encoded; Lisp_Object encoded;
...@@ -953,7 +960,10 @@ so last access time will always be midnight of that day. */) ...@@ -953,7 +960,10 @@ so last access time will always be midnight of that day. */)
encoded = ENCODE_FILE (filename); encoded = ENCODE_FILE (filename);
UNGCPRO; UNGCPRO;
if (lstat (SSDATA (encoded), &s) < 0) if ((!NILP (follow_symlinks)
? stat (SSDATA (encoded), &s)
: lstat (SSDATA (encoded), &s))
!= 0)
return Qnil; return Qnil;
values[0] = (S_ISLNK (s.st_mode) ? Ffile_symlink_p (filename) values[0] = (S_ISLNK (s.st_mode) ? Ffile_symlink_p (filename)
......
...@@ -3474,7 +3474,7 @@ extern void syms_of_ccl (void); ...@@ -3474,7 +3474,7 @@ extern void syms_of_ccl (void);
extern void syms_of_dired (void); extern void syms_of_dired (void);
extern Lisp_Object directory_files_internal (Lisp_Object, Lisp_Object, extern Lisp_Object directory_files_internal (Lisp_Object, Lisp_Object,
Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object,
bool, Lisp_Object); bool, Lisp_Object, Lisp_Object);
/* Defined in term.c. */ /* Defined in term.c. */
extern int *char_ins_del_vector; extern int *char_ins_del_vector;
......
...@@ -2529,7 +2529,8 @@ list_system_processes (void) ...@@ -2529,7 +2529,8 @@ list_system_processes (void)
process. */ process. */
procdir = build_string ("/proc"); procdir = build_string ("/proc");
match = build_string ("[0-9]+"); match = build_string ("[0-9]+");
proclist = directory_files_internal (procdir, Qnil, match, Qt, 0, Qnil); proclist = directory_files_internal (procdir, Qnil, match, Qt, 0,
Qnil, Qnil);
/* `proclist' gives process IDs as strings. Destructively convert /* `proclist' gives process IDs as strings. Destructively convert
each string into a number. */ each string into a number. */
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment