diff mbox series

[bug#68406,core-updates] guix: build: Expand `copy-recursively'.

Message ID 20240112152407.5691-1-romain.garbage@inria.fr
State New
Headers show
Series [bug#68406,core-updates] guix: build: Expand `copy-recursively'. | expand

Commit Message

Romain GARBAGE Jan. 12, 2024, 3:24 p.m. UTC
* guix/build/utils.scm (copy-recursively): Add `select?' key.

Change-Id: Icfe226164bb88dfede58ae24c15a98db9b696c3b
---
 guix/build/utils.scm | 42 ++++++++++++++++++++++++------------------
 1 file changed, 24 insertions(+), 18 deletions(-)

Comments

Maxim Cournoyer Jan. 19, 2024, 4:20 a.m. UTC | #1
Hi,

Romain GARBAGE <romain.garbage@inria.fr> writes:

> * guix/build/utils.scm (copy-recursively): Add `select?' key.
>
> Change-Id: Icfe226164bb88dfede58ae24c15a98db9b696c3b

Reviewed-by: Maxim Cournoyer <maxim.cournoyer@gmail>
Maxim Cournoyer Jan. 21, 2024, 10:57 p.m. UTC | #2
Hi!

Romain GARBAGE <romain.garbage@inria.fr> writes:

> * guix/build/utils.scm (copy-recursively): Add `select?' key.

Applied to core-updates.
Ludovic Courtès Jan. 22, 2024, 11:30 a.m. UTC | #3
Hello!

Romain GARBAGE <romain.garbage@inria.fr> skribis:

> * guix/build/utils.scm (copy-recursively): Add `select?' key.
>
> Change-Id: Icfe226164bb88dfede58ae24c15a98db9b696c3b

[...]

> +  "Copy SOURCE directory to DESTINATION.  Follow symlinks if FOLLOW-SYMLINKS?  is
> +true; otherwise, just preserve them.  Call COPY-FILE to copy regular files.  When
> +KEEP-MTIME? is true, keep the modification time of the files in SOURCE on those of
> +DESTINATION.  When KEEP-PERMISSIONS? is true, preserve file permissions.  Write
> +verbose output to the LOG port. Call (SELECT?  FILE STAT) for each entry in source,
> +where FILE is the entry's absolute file name and STAT is the result of 'lstat' (or
> +'stat' if FOLLOW-SYMLINKS? is true); exclude entries for which SELECT? does not
> +return true."

Could you send a patch that updates ‘doc/guix.texi’ to match the
docstring?

I had completely overlooked that.

Thanks,
Ludo’.
diff mbox series

Patch

diff --git a/guix/build/utils.scm b/guix/build/utils.scm
index 2352a627e9..7567eb9e4d 100644
--- a/guix/build/utils.scm
+++ b/guix/build/utils.scm
@@ -430,32 +430,38 @@  (define* (copy-recursively source destination
                            (log (current-output-port))
                            (follow-symlinks? #f)
                            (copy-file copy-file)
-                           keep-mtime? keep-permissions?)
-  "Copy SOURCE directory to DESTINATION.  Follow symlinks if FOLLOW-SYMLINKS?
-is true; otherwise, just preserve them.  Call COPY-FILE to copy regular files.
-When KEEP-MTIME? is true, keep the modification time of the files in SOURCE on
-those of DESTINATION.  When KEEP-PERMISSIONS? is true, preserve file
-permissions.  Write verbose output to the LOG port."
+                           keep-mtime? keep-permissions?
+                           (select? (const #t)))
+  "Copy SOURCE directory to DESTINATION.  Follow symlinks if FOLLOW-SYMLINKS?  is
+true; otherwise, just preserve them.  Call COPY-FILE to copy regular files.  When
+KEEP-MTIME? is true, keep the modification time of the files in SOURCE on those of
+DESTINATION.  When KEEP-PERMISSIONS? is true, preserve file permissions.  Write
+verbose output to the LOG port. Call (SELECT?  FILE STAT) for each entry in source,
+where FILE is the entry's absolute file name and STAT is the result of 'lstat' (or
+'stat' if FOLLOW-SYMLINKS? is true); exclude entries for which SELECT? does not
+return true."
   (define strip-source
     (let ((len (string-length source)))
       (lambda (file)
         (substring file len))))
 
-  (file-system-fold (const #t)                    ; enter?
+  (file-system-fold (lambda (file stat result)    ; enter?
+                      (select? file stat))
                     (lambda (file stat result)    ; leaf
                       (let ((dest (string-append destination
                                                  (strip-source file))))
-                        (format log "`~a' -> `~a'~%" file dest)
-                        (case (stat:type stat)
-                          ((symlink)
-                           (let ((target (readlink file)))
-                             (symlink target dest)))
-                          (else
-                           (copy-file file dest)
-                           (when keep-permissions?
-                             (chmod dest (stat:perms stat)))))
-                        (when keep-mtime?
-                          (set-file-time dest stat))))
+                        (when (select? file stat)
+                          (format log "`~a' -> `~a'~%" file dest)
+                          (case (stat:type stat)
+                            ((symlink)
+                             (let ((target (readlink file)))
+                               (symlink target dest)))
+                            (else
+                             (copy-file file dest)
+                             (when keep-permissions?
+                               (chmod dest (stat:perms stat)))))
+                          (when keep-mtime?
+                            (set-file-time dest stat)))))
                     (lambda (dir stat result)     ; down
                       (let ((target (string-append destination
                                                    (strip-source dir))))