diff options
author | Chong Yidong <cyd@gnu.org> | 2012-02-26 17:08:19 +0800 |
---|---|---|
committer | Chong Yidong <cyd@gnu.org> | 2012-02-26 17:08:19 +0800 |
commit | 9a4888c093e829c13f3dd27efd85331aeeb44696 (patch) | |
tree | 6038ddfe8a945682cf84bd1e40c35430f41782b0 | |
parent | f0e751b92f2bdf4815607a5d4a2c4ab593315c9d (diff) | |
download | emacs-9a4888c093e829c13f3dd27efd85331aeeb44696.tar.gz |
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.
-rw-r--r-- | doc/lispref/ChangeLog | 5 | ||||
-rw-r--r-- | doc/lispref/files.texi | 21 | ||||
-rw-r--r-- | doc/lispref/modes.texi | 2 | ||||
-rw-r--r-- | lisp/ChangeLog | 6 | ||||
-rw-r--r-- | lisp/files.el | 35 |
5 files changed, 41 insertions, 28 deletions
diff --git a/doc/lispref/ChangeLog b/doc/lispref/ChangeLog index a339205a7fe..6d9cd6b4f8a 100644 --- a/doc/lispref/ChangeLog +++ b/doc/lispref/ChangeLog @@ -1,3 +1,8 @@ +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. diff --git a/doc/lispref/files.texi b/doc/lispref/files.texi index 1fee572a573..277a4cabdf1 100644 --- a/doc/lispref/files.texi +++ b/doc/lispref/files.texi @@ -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 diff --git a/doc/lispref/modes.texi b/doc/lispref/modes.texi index a4ee6f8327f..eac895b6279 100644 --- a/doc/lispref/modes.texi +++ b/doc/lispref/modes.texi @@ -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 diff --git a/lisp/ChangeLog b/lisp/ChangeLog index f585be4ec34..418be2539b6 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,9 @@ +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 diff --git a/lisp/files.el b/lisp/files.el index 3523fbdc012..acd04de34ec 100644 --- a/lisp/files.el +++ b/lisp/files.el @@ -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. |