Function: eshell-glob-entries
eshell-glob-entries is a byte-compiled function defined in
em-glob.el.gz.
Signature
(eshell-glob-entries PATH GLOBS &optional RECURSE-P)
Documentation
Glob the entries in PATH, possibly recursing if RECURSE-P is non-nil.
Source Code
;; Defined in /usr/src/emacs/lisp/eshell/em-glob.el.gz
;; FIXME does this really need to abuse eshell-glob-matches, message-shown?
(defun eshell-glob-entries (path globs &optional recurse-p)
"Glob the entries in PATH, possibly recursing if RECURSE-P is non-nil."
(let* ((entries (ignore-errors
(file-name-all-completions "" path)))
(case-fold-search eshell-glob-case-insensitive)
(glob (car globs))
(len (length glob))
dirs rdirs
incl excl
name isdir pathname)
(while (cond
((and (= len 3) (equal glob "**/"))
(setq recurse-p 2
globs (cdr globs)
glob (car globs)
len (length glob)))
((and (= len 4) (equal glob "***/"))
(setq recurse-p 3
globs (cdr globs)
glob (car globs)
len (length glob)))))
(if (and recurse-p (not glob))
(error "`**' cannot end a globbing pattern"))
(let ((index 1))
(setq incl glob)
(while (and (eq incl glob)
(setq index (string-search "~" glob index)))
(if (or (get-text-property index 'escaped glob)
(or (= (1+ index) len)))
(setq index (1+ index))
(setq incl (substring glob 0 index)
excl (substring glob (1+ index))))))
;; can't use `directory-file-name' because it strips away text
;; properties in the string
(let ((len (1- (length incl))))
(if (eq (aref incl len) ?/)
(setq incl (substring incl 0 len)))
(when excl
(setq len (1- (length excl)))
(if (eq (aref excl len) ?/)
(setq excl (substring excl 0 len)))))
(setq incl (eshell-glob-regexp incl)
excl (and excl (eshell-glob-regexp excl)))
(if (or eshell-glob-include-dot-files
(eq (aref glob 0) ?.))
(unless (or eshell-glob-include-dot-dot
(cdr globs))
(setq excl (if excl
(concat "\\(\\`\\.\\.?\\'\\|" excl "\\)")
"\\`\\.\\.?\\'")))
(setq excl (if excl
(concat "\\(\\`\\.\\|" excl "\\)")
"\\`\\.")))
(when (and recurse-p eshell-glob-show-progress)
(message "Building file list...%d so far: %s"
(length eshell-glob-matches) path)
(setq message-shown t))
(if (equal path "./") (setq path ""))
(while entries
(setq name (car entries)
len (length name)
isdir (eq (aref name (1- len)) ?/))
(if (let ((fname (directory-file-name name)))
(and (not (and excl (string-match excl fname)))
(string-match incl fname)))
(if (cdr globs)
(if isdir
(setq dirs (cons (concat path name) dirs)))
(setq eshell-glob-matches
(cons (concat path name) eshell-glob-matches))))
(if (and recurse-p isdir
(or (> len 3)
(not (or (and (= len 2) (equal name "./"))
(and (= len 3) (equal name "../")))))
(setq pathname (concat path name))
(not (and (= recurse-p 2)
(file-symlink-p
(directory-file-name pathname)))))
(setq rdirs (cons pathname rdirs)))
(setq entries (cdr entries)))
(setq dirs (nreverse dirs)
rdirs (nreverse rdirs))
(while dirs
(eshell-glob-entries (car dirs) (cdr globs))
(setq dirs (cdr dirs)))
(while rdirs
(eshell-glob-entries (car rdirs) globs recurse-p)
(setq rdirs (cdr rdirs)))))