emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

master 5cc5702: Fix finding filelist for :tree fileset (Bug#976)


From: Mauro Aranda
Subject: master 5cc5702: Fix finding filelist for :tree fileset (Bug#976)
Date: Tue, 24 Nov 2020 06:04:39 -0500 (EST)

branch: master
commit 5cc570215a30301939a56075035e91aa540513cb
Author: Drew Adams <drew.adams@oracle.com>
Commit: Mauro Aranda <maurooaranda@gmail.com>

    Fix finding filelist for :tree fileset (Bug#976)
    
    * lisp/filesets.el (filesets-files-under): New function, used to get
    all files for a :tree fileset.
    (filesets-get-filelist): Use it.  Look for the directory and the
    pattern in the right place inside entry.
---
 lisp/filesets.el | 37 ++++++++++++++++++++++++++++++++++---
 1 file changed, 34 insertions(+), 3 deletions(-)

diff --git a/lisp/filesets.el b/lisp/filesets.el
index c7ec3f7..8419656 100644
--- a/lisp/filesets.el
+++ b/lisp/filesets.el
@@ -1718,9 +1718,12 @@ Assume MODE (see `filesets-entry-mode'), if provided."
                                (filesets-entry-get-master entry)))))
                  (cons entry (filesets-ingroup-cache-get entry))))
               (:tree
-               (let ((dir  (nth 0 entry))
-                     (patt (nth 1 entry)))
-                 (filesets-directory-files dir patt ':files t)))
+                (let* ((dirpatt (filesets-entry-get-tree entry))
+                       (dir (nth 0 dirpatt))
+                       (patt (nth 1 dirpatt))
+                       (depth (or (filesets-entry-get-tree-max-level entry)
+                                  filesets-tree-max-level)))
+                  (filesets-files-under 0 depth entry dir patt)))
               (:pattern
                (let ((dirpatt (filesets-entry-get-pattern entry)))
                  (if dirpatt
@@ -1734,6 +1737,34 @@ Assume MODE (see `filesets-entry-mode'), if provided."
                          (lambda (file)
                            (not (filesets-filetype-property file event))))))
 
+(defun filesets-files-under (level depth entry dir patt &optional relativep)
+  "Files under DIR that match PATT.
+LEVEL is the current level under DIR.
+DEPTH is the maximal tree scanning depth for ENTRY.
+ENTRY is a fileset.
+DIR is a directory.
+PATT is a regexp that included file names must match.
+RELATIVEP non-nil means use relative file names."
+  (and (or (= depth 0) (< level depth))
+       (let* ((dir         (file-name-as-directory dir))
+              (files-here  (filesets-directory-files
+                            dir patt nil (not relativep)
+                            (filesets-entry-get-filter-dirs-flag entry)))
+              (subdirs     (filesets-filter-dir-names files-here))
+              (files
+               (filesets-filter-dir-names
+                (apply #'append
+                       files-here
+                       (mapcar
+                        (lambda (subdir)
+                          (let* ((subdir (file-name-as-directory subdir))
+                                 (full-subdir  (concat dir subdir)))
+                            (filesets-files-under (+ level 1) depth entry
+                                                  full-subdir patt)))
+                        subdirs))
+                t)))
+         files)))
+
 (defun filesets-open (&optional mode name lookup-name)
   "Open the fileset called NAME.
 Use LOOKUP-NAME for searching additional data if provided."



reply via email to

[Prev in Thread] Current Thread [Next in Thread]