]> git.eshelyaron.com Git - emacs.git/commitdiff
gnus-utils.el (gnus-recursive-directory-files): Unify hard or symbolic links (bug...
authorKatsumi Yamaoka <yamaoka@jpl.org>
Tue, 22 Jul 2014 06:37:31 +0000 (06:37 +0000)
committerKatsumi Yamaoka <yamaoka@jpl.org>
Tue, 22 Jul 2014 06:37:31 +0000 (06:37 +0000)
lisp/gnus/ChangeLog
lisp/gnus/gnus-util.el

index cdfe4f4dea803f1a763042100d5d0fb6b78b82cd..f55e04f02e62cc230b8e838870713b87d3d2eddf 100644 (file)
@@ -1,3 +1,8 @@
+2014-07-22  Katsumi Yamaoka  <yamaoka@jpl.org>
+
+       * gnus-utils.el (gnus-recursive-directory-files):
+       Unify hard or symbolic links (bug#18063).
+
 2013-07-17  Albert Krewinkel  <albert@zeitkraut.de>
 
        * gnus-msg.el (gnus-configure-posting-style):
index 62977576a005669cde3788413b8fe5d4c0ed85a2..fe4d707be2e0c0dbb180ca670ce7cbe6118f0f35 100644 (file)
@@ -1910,17 +1910,25 @@ Sizes are in pixels."
                    image)))
       image)))
 
+(eval-when-compile (require 'gmm-utils))
 (defun gnus-recursive-directory-files (dir)
-  "Return all regular files below DIR."
-  (let (files)
-    (dolist (file (directory-files dir t))
-      (when (and (not (member (file-name-nondirectory file) '("." "..")))
-                (file-readable-p file))
-       (cond
-        ((file-regular-p file)
-         (push file files))
-        ((file-directory-p file)
-         (setq files (append (gnus-recursive-directory-files file) files))))))
+  "Return all regular files below DIR.
+The first found will be returned if a file has hard or symbolic links."
+  (let (files attr attrs)
+    (gmm-labels
+       ((fn (directory)
+            (dolist (file (directory-files directory t))
+              (setq attr (file-attributes (file-truename file)))
+              (when (and (not (member attr attrs))
+                         (not (member (file-name-nondirectory file)
+                                      '("." "..")))
+                         (file-readable-p file))
+                (push attr attrs)
+                (cond ((file-regular-p file)
+                       (push file files))
+                      ((file-directory-p file)
+                       (fn file)))))))
+      (fn dir))
     files))
 
 (defun gnus-list-memq-of-list (elements list)