Subject: Re: bug#60562: [PATCH] Fix split-string error if there is a space in the filename.

From: lux <[email-masked]>
Date: Sat, 7 Jan 2023 22:52:09 +0800

On Sat, 07 Jan 2023 11:29:58 +0200
Eli Zaretskii <[email-masked]> wrote:

> > Cc: [email-masked]
> > From: Robert Pluim <[email-masked]>
> > Date: Fri, 06 Jan 2023 10:48:43 +0100
> >   
> > >>>>> On Thu, 5 Jan 2023 06:56:05 +0800, lux <[email-masked]>
> > >>>>> said:  
> >   
> >     lux> * lisp/htmlfontify.el (hfy-list-files): Specify separator
> >     lux> (\n\r). ---
> >     lux>  lisp/htmlfontify.el | 5 +++--
> >     lux>  1 file changed, 3 insertions(+), 2 deletions(-)  
> >   
> >     lux> diff --git a/lisp/htmlfontify.el b/lisp/htmlfontify.el
> >     lux> index c989a12d205..be020b6b1c5 100644
> >     lux> --- a/lisp/htmlfontify.el
> >     lux> +++ b/lisp/htmlfontify.el
> >     lux> @@ -1826,8 +1826,9 @@ hfy-list-files
> >     lux>    ;;(message "hfy-list-files");;DBUG
> >     lux>    ;; FIXME: this changes the dir of the current buffer.
> >     lux> Is that right?? (cd directory)
> >     lux> -  (mapcar (lambda (F) (if (string-match "^./\\(.*\\)" F)
> >     lux> (match-string 1 F) F))
> >     lux> -          (split-string (shell-command-to-string
> >     lux> hfy-find-cmd))) )
> >     lux> +  (remove-if #'string-empty-p
> >     lux> +             (mapcar (lambda (F) (if (string-match
> >     lux> "^./\\(.*\\)" F) (match-string 1 F) F))
> >     lux> +                     (split-string
> >     lux> (shell-command-to-string hfy-find-cmd) "[\n\r]+")) ))  
> > 
> > You can avoid the issue (and improve portability) by using
> > `directory-files-recursively' instead of `find'  
> 
> Right.  Would you like to rewrite the patch using
> directory-files-recursively?
>

I try rewrite the patch using  directory-files-recursively.

>From 1e00b856ca423bb7e4491b9999cd3de80223d0bd Mon Sep 17 00:00:00 2001
From: Xi Lu <[email-masked]>
Date: Sat, 7 Jan 2023 22:46:40 +0800
Subject: [PATCH] Replace `hfy-find-cmd' with `directory-files-recursively'.

---
 lisp/htmlfontify.el | 20 ++++++++++++--------
 1 file changed, 12 insertions(+), 8 deletions(-)

diff --git a/lisp/htmlfontify.el b/lisp/htmlfontify.el
index c989a12d205..0746b5e3a36 100644
--- a/lisp/htmlfontify.el
+++ b/lisp/htmlfontify.el
@@ -372,11 +372,14 @@ hfy-istext-command
   :tag   "istext-command"
   :type  '(string))
 
-(defcustom hfy-find-cmd
-  "find . -type f \\! -name \\*~ \\! -name \\*.flc \\! -path \\*/CVS/\\*"
-  "Find command used to harvest a list of files to attempt to fontify."
-  :tag   "find-command"
-  :type  '(string))
+(defcustom hfy-exclude-file-rules
+  '("\\.flc$"
+    "/CVS/.*"
+    ".*~"
+    "\\.git/.*")
+  "Define some regular expressions to exclude files"
+  :tag "exclude-rules"
+  :type '(list string))
 
 (defcustom hfy-display-class nil
   "Display class to use to determine which display class to use when
@@ -1823,11 +1826,12 @@ htmlfontify-buffer
 (defun hfy-list-files (directory)
   "Return a list of files under DIRECTORY.
 Strips any leading \"./\" from each filename."
-  ;;(message "hfy-list-files");;DBUG
+  ;;(message "hfy-list-files");;DEBUG
   ;; FIXME: this changes the dir of the current buffer.  Is that right??
   (cd directory)
-  (mapcar (lambda (F) (if (string-match "^./\\(.*\\)" F) (match-string 1 F) F))
-          (split-string (shell-command-to-string hfy-find-cmd))) )
+  (remove-if (lambda (f) (seq-some (lambda (r)
+                                     (string-match r f)) hfy-exclude-file-rules))
+             (directory-files-recursively "." ".*")))
 
 ;; strip the filename off, return a directory name
 ;; not a particularly thorough implementation, but it will be
-- 
2.39.0