From: Katsumi Yamaoka Date: Tue, 22 Jul 2014 06:37:25 +0000 (+0000) Subject: gnus-utils.el (gnus-recursive-directory-files): Unify hard or symbolic links (bug... X-Git-Url: http://cgit.sxemacs.org/?p=gnus;a=commitdiff_plain;h=541851107664081d96b3aca32582916a379fc455;hp=7a4c0a6aa3b9ec91a93902f894fd47ded1deca52 gnus-utils.el (gnus-recursive-directory-files): Unify hard or symbolic links (bug#18063) --- diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 408318da7..476910887 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,8 @@ +2014-07-22 Katsumi Yamaoka + + * gnus-utils.el (gnus-recursive-directory-files): + Unify hard or symbolic links (bug#18063). + 2013-07-17 Albert Krewinkel * gnus-msg.el (gnus-configure-posting-style): diff --git a/lisp/gnus-util.el b/lisp/gnus-util.el index 62977576a..fe4d707be 100644 --- a/lisp/gnus-util.el +++ b/lisp/gnus-util.el @@ -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)