Commit 9a4888c0 authored by Chong Yidong's avatar Chong Yidong
Browse files

Code and doc fixes for file-subdir-of-p and files-equal-p.

* lisp/files.el (files-equal-p): Doc fix.
(file-subdir-of-p): Doc fix.  Convert loop macro to plain Lisp,
and quit the loop once a mismatch is found.

* doc/lispref/files.texi (Kinds of Files): Improve documentation of
files-equal-p and file-subdir-of-p.
parent f0e751b9
2012-02-26 Chong Yidong <cyd@gnu.org>
* files.texi (Kinds of Files): Improve documentation of
files-equal-p and file-subdir-of-p.
2012-02-26 Glenn Morris <rgm@gnu.org>
* intro.texi (Acknowledgements): Small changes.
......
......@@ -1019,20 +1019,19 @@ other I/O device).
@end defun
@defun files-equal-p file1 file2
This function return @code{t} if the files @var{file1} and @var{file2} name
the same file.
Comparison is made with the @code{file-attributes} of both files.
This function returns @code{t} if the files @var{file1} and
@var{file2} name the same file. Two ordinary files are considered to
be the same if the function @code{file-attributes} (@xref{File
Attributes}) returns @code{equal} values for them.
@end defun
@defun file-subdir-of-p dir1 dir2
This function return @code{t} if directory @var{dir1} is a subdirectory
of @var{dir2} or if @var{dir1} and @var{dir2} are the same directory.
Arguments @var{dir1} and @var{dir2} must be existing directories,
otherwise, return nil.
Check is done by building a directory name based on equality of differents
components of both directory names, if this resulting directory name
is equal to @var{dir2}, we assume directory @var{dir1}
is a subdirectory of @var{dir2}.
This function returns @code{t} if directory @var{dir1} is a
subdirectory of @var{dir2}, or if @var{dir1} and @var{dir2} are the
same directory. It compares the @code{file-truename} values of the
two directories (@pxref{Truenames}). If either @var{dir1} or
@var{dir2} do not name existing directories, the return value is
@code{nil}.
@end defun
@node Truenames
......
......@@ -1596,7 +1596,7 @@ where @var{get} is an expression that returns the current state,
and @var{set} is a function of one argument (a state) that sets it.
@item :after-hook @var{after-hook}
This defines a single lisp form which is evaluated after the mode hooks
This defines a single Lisp form which is evaluated after the mode hooks
have run. It should not be quoted.
@end table
......
2012-02-26 Chong Yidong <cyd@gnu.org>
* files.el (files-equal-p): Doc fix.
(file-subdir-of-p): Doc fix. Convert loop macro to plain Lisp,
and quit the loop once a mismatch is found.
2012-02-25 Juanma Barranquero <lekktu@gmail.com>
* bs.el (bs--show-with-configuration): Don't throw an error
......
......@@ -4986,7 +4986,9 @@ given. With a prefix argument, TRASH is nil."
(delete-directory-internal directory)))))
(defun files-equal-p (file1 file2)
"Return non-nil if FILE1 and FILE2 name the same file."
"Return non-nil if FILE1 and FILE2 name the same file.
Ordinary files are considered to be the same if `file-attributes'
returns `equal' values for them."
(let ((handler (or (find-file-name-handler file1 'files-equal-p)
(find-file-name-handler file2 'files-equal-p))))
(if handler
......@@ -4996,27 +4998,28 @@ given. With a prefix argument, TRASH is nil."
(defun file-subdir-of-p (dir1 dir2)
"Return non-nil if DIR1 is a subdirectory of DIR2.
Note that a directory is treated by this function as a subdirectory of itself.
This function only works when its two arguments already exist,
when they don't, it returns nil."
A directory is considered to be a subdirectory of itself.
Return nil if DIR1 or DIR2 are not existing directories."
(let ((handler (or (find-file-name-handler dir1 'file-subdir-of-p)
(find-file-name-handler dir2 'file-subdir-of-p))))
(if handler
(funcall handler 'file-subdir-of-p dir1 dir2)
(when (and (file-directory-p dir1)
(file-directory-p dir2))
(loop with f1 = (file-truename dir1)
with f2 = (file-truename dir2)
with ls1 = (or (split-string f1 "/" t) (list "/"))
with ls2 = (or (split-string f2 "/" t) (list "/"))
for p = (string-match "^/" f1)
for i in ls1
for j in ls2
when (string= i j)
concat (if p (concat "/" i) (concat i "/"))
into root
finally return
(files-equal-p (file-truename root) f2))))))
(setq dir1 (file-truename dir1)
dir2 (file-truename dir2))
(let ((ls1 (or (split-string dir1 "/" t) '("/")))
(ls2 (or (split-string dir2 "/" t) '("/")))
(root (if (string-match "\\`/" dir1) "/" ""))
(mismatch nil))
(while (and ls1 ls2 (not mismatch))
(if (string-equal (car ls1) (car ls2))
(setq root (concat root (car ls1) "/"))
(setq mismatch t))
(setq ls1 (cdr ls1)
ls2 (cdr ls2)))
(unless mismatch
(files-equal-p (file-truename root) dir2)))))))
(defun copy-directory (directory newname &optional keep-time parents copy-contents)
"Copy DIRECTORY to NEWNAME. Both args must be strings.
......
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