[bug#78828,1/8] build-system/pyproject: Use copy-recursively instead of merge-dirs.

Message ID 20250619075859.10878-1-ngraves@ngraves.fr
State New
Headers
Series Improvements to pyproject-build-system. |

Commit Message

Nicolas Graves June 19, 2025, 7:58 a.m. UTC
  Using rename-file, the destination had to be empty otherwise it would error
out.  This has been fixed by the use of copy-recursively, really merging them.
Changing this makes merge-directories mostly a duplicate of
copy-recursively, thus fully switch to copy-recursively.

* guix/build/pyproject-build-system.scm (install)
<python-hashbang>: Remove it, used only once.
<merge-directories>: Remove it, replace its calls by copy-recursively
and delete-file-recursively.
---
 guix/build/pyproject-build-system.scm | 51 ++++++++-------------------
 1 file changed, 15 insertions(+), 36 deletions(-)
  

Patch

diff --git a/guix/build/pyproject-build-system.scm b/guix/build/pyproject-build-system.scm
index 97fd4862f0..1b66dce99c 100644
--- a/guix/build/pyproject-build-system.scm
+++ b/guix/build/pyproject-build-system.scm
@@ -193,30 +193,6 @@  (define (extract file)
       ;; Use Python’s zipfile to avoid extra dependency
       (invoke "python" "-m" "zipfile" "-e" file site-dir))
 
-    (define python-hashbang
-      (string-append "#!" python "/bin/python"))
-
-    (define* (merge-directories source destination
-                                #:optional (post-move #f))
-      "Move all files in SOURCE into DESTINATION, merging the two directories."
-      (format #t "Merging directory ~a into ~a~%" source destination)
-      (for-each (lambda (file)
-                  (format #t "~a/~a -> ~a/~a~%"
-                          source file destination file)
-                  (mkdir-p destination)
-                  ;; Use 'copy-recursively' rather than 'rename-file' to guard
-                  ;; against the odd case where DESTINATION is a non-empty
-                  ;; directory, which may happen when using hybrid Python
-                  ;; build systems.
-                  (copy-recursively (string-append source "/" file)
-                                    (string-append destination "/" file))
-                  (delete-file-recursively (string-append source "/" file))
-                  (when post-move
-                    (post-move file)))
-                (scandir source
-                         (negate (cut member <> '("." "..")))))
-      (rmdir source))
-
     (define (expand-data-directory directory)
       "Move files from all .data subdirectories to their respective\ndestinations."
       ;; Python’s distutils.command.install defines this mapping from source to
@@ -224,29 +200,32 @@  (define (expand-data-directory directory)
       (let ((source (string-append directory "/scripts"))
             (destination (string-append out "/bin")))
         (when (file-exists? source)
-          (merge-directories source destination
-                             (lambda (f)
-                               (let ((dest-path (string-append destination
-                                                               "/" f)))
-                                 (chmod dest-path #o755)
-                                 ;; PEP 427 recommends that installers rewrite
-                                 ;; this odd shebang.
-                                 (substitute* dest-path
-                                   (("#!python")
-                                    python-hashbang)))))))
+          (copy-recursively source destination)
+          (delete-file-recursively source)
+          (for-each
+           (lambda (file)
+             (chmod file #o755)
+             ;; PEP 427 recommends that installers rewrite
+             ;; this odd shebang.
+             (substitute* file
+               (("#!python")
+                (string-append "#!" python "/bin/python"))))
+           (find-files destination))))
       ;; Data can be contained in arbitrary directory structures.  Most
       ;; commonly it is used for share/.
       (let ((source (string-append directory "/data"))
             (destination out))
         (when (file-exists? source)
-          (merge-directories source destination)))
+          (copy-recursively source destination)
+          (delete-file-recursively source)))
       (let* ((distribution (car (string-split (basename directory) #\-)))
              (source (string-append directory "/headers"))
              (destination (string-append out "/include/python"
                                          (python-version python)
                                          "/" distribution)))
         (when (file-exists? source)
-          (merge-directories source destination))))
+          (copy-recursively source destination)
+          (delete-file-recursively source))))
 
     (define (list-directories base predicate)
       ;; Cannot use find-files here, because it’s recursive.