GNU bug report logs - #68358
[PATCH] guix: import: cpan: add recursive

Previous Next

Package: guix-patches;

Reported by: "zero <at> fedora" <shinyzero0 <at> tilde.club>

Date: Wed, 10 Jan 2024 00:44:02 UTC

Severity: normal

Tags: patch

Done: Ludovic Courtès <ludo <at> gnu.org>

Bug is archived. No further changes may be made.

To add a comment to this bug, you must first unarchive it, by sending
a message to control AT debbugs.gnu.org, with unarchive 68358 in the body.
You can then email your comments to 68358 AT debbugs.gnu.org in the normal way.

Toggle the display of automated, internal messages from the tracker.

View this report as an mbox folder, status mbox, maintainer mbox


Report forwarded to guix <at> cbaines.net, dev <at> jpoiret.xyz, ludo <at> gnu.org, othacehe <at> gnu.org, rekado <at> elephly.net, zimon.toutoune <at> gmail.com, me <at> tobias.gr, guix-patches <at> gnu.org:
bug#68358; Package guix-patches. (Wed, 10 Jan 2024 00:44:02 GMT) Full text and rfc822 format available.

Acknowledgement sent to "zero <at> fedora" <shinyzero0 <at> tilde.club>:
New bug report received and forwarded. Copy sent to guix <at> cbaines.net, dev <at> jpoiret.xyz, ludo <at> gnu.org, othacehe <at> gnu.org, rekado <at> elephly.net, zimon.toutoune <at> gmail.com, me <at> tobias.gr, guix-patches <at> gnu.org. (Wed, 10 Jan 2024 00:44:02 GMT) Full text and rfc822 format available.

Message #5 received at submit <at> debbugs.gnu.org (full text, mbox):

From: "zero <at> fedora" <shinyzero0 <at> tilde.club>
To: guix-patches <at> gnu.org
Cc: "zero <at> fedora" <shinyzero0 <at> tilde.club>
Subject: [PATCH] guix: import: cpan: add recursive
Date: Wed, 10 Jan 2024 03:41:53 +0300
Change-Id: Id167c7ddd079f4e04650ce7cc1692a9de36cd8fe
---
 guix/import/cpan.scm         | 63 ++++++++++++++++++++++--------------
 guix/scripts/import/cpan.scm | 25 +++++++++++---
 2 files changed, 58 insertions(+), 30 deletions(-)

diff --git a/guix/import/cpan.scm b/guix/import/cpan.scm
index b87736eef6..2090da275d 100644
--- a/guix/import/cpan.scm
+++ b/guix/import/cpan.scm
@@ -37,12 +37,13 @@ (define-module (guix import cpan)
   #:use-module (guix utils)
   #:use-module (guix base32)
   #:use-module ((guix download) #:select (download-to-store url-fetch))
-  #:use-module ((guix import utils) #:select (factorize-uri))
+  #:use-module (guix import utils)
   #:use-module (guix import json)
   #:use-module (guix packages)
   #:use-module (guix upstream)
   #:use-module (guix derivations)
   #:export (cpan->guix-package
+            cpan-recursive-import
             metacpan-url->mirror-url
             %cpan-updater
 
@@ -284,35 +285,42 @@ (define (cpan-module->sexp release)
                                             upstream-input-downstream-name)
                                    inputs)))))))
 
-  (let ((tarball (with-store store
+  (let* ((tarball (with-store store
                    (download-to-store store source-url)))
-        (inputs (cpan-module-inputs release)))
-    `(package
-       (name ,(cpan-name->downstream-name name))
-       (version ,version)
-       (source (origin
-                 (method url-fetch)
-                 (uri (string-append ,@(factorize-uri source-url version)))
-                 (sha256
-                  (base32
-                   ,(bytevector->nix-base32-string (file-sha256 tarball))))))
-       (build-system perl-build-system)
-       ,@(maybe-inputs 'native-inputs
-                       (filter (upstream-input-type-predicate 'native)
-                               inputs))
-       ,@(maybe-inputs 'propagated-inputs
-                       (filter (upstream-input-type-predicate 'propagated)
-                               inputs))
-       (home-page ,(cpan-home name))
-       (synopsis ,(cpan-release-abstract release))
-       (description fill-in-yourself!)
-       (license ,(string->license (cpan-release-license release))))))
+         (inputs (cpan-module-inputs release))
+         (sexp
+           `(package
+              (name ,(cpan-name->downstream-name name))
+              (version ,version)
+              (source (origin
+                        (method url-fetch)
+                        (uri (string-append ,@(factorize-uri source-url version)))
+                        (sha256
+                          (base32
+                            ,(bytevector->nix-base32-string (file-sha256 tarball))))))
+              (build-system perl-build-system)
+              ,@(maybe-inputs 'native-inputs
+                              (filter (upstream-input-type-predicate 'native)
+                                      inputs))
+              ,@(maybe-inputs 'propagated-inputs
+                              (filter (upstream-input-type-predicate 'propagated)
+                                      inputs))
+              (home-page ,(cpan-home name))
+              (synopsis ,(cpan-release-abstract release))
+              (description fill-in-yourself!)
+              (license ,(string->license (cpan-release-license release))))))
+    (values
+      sexp
+      (map upstream-input-name inputs))
+    ))
 
-(define (cpan->guix-package module-name)
+(define* (cpan->guix-package module-name #:key version #:allow-other-keys)
   "Fetch the metadata for PACKAGE-NAME from metacpan.org, and return the
 `package' s-expression corresponding to that package, or #f on failure."
   (let ((release (cpan-fetch (module->name module-name))))
-    (and=> release cpan-module->sexp)))
+    (if release
+      (cpan-module->sexp release)
+      (values #f '()))))
 
 (define cpan-package?
   (let ((cpan-rx (make-regexp (string-append "("
@@ -357,6 +365,11 @@ (define* (latest-release package #:key (version #f))
         (urls (list url))
         (inputs (cpan-module-inputs release)))))))
 
+(define* (cpan-recursive-import package-name)
+  (recursive-import package-name
+                    #:repo->guix-package cpan->guix-package
+                    #:guix-name (compose cpan-name->downstream-name module->name)))
+
 (define %cpan-updater
   (upstream-updater
    (name 'cpan)
diff --git a/guix/scripts/import/cpan.scm b/guix/scripts/import/cpan.scm
index bdf5a1e423..cab6424068 100644
--- a/guix/scripts/import/cpan.scm
+++ b/guix/scripts/import/cpan.scm
@@ -43,6 +43,9 @@ (define (show-help)
 Import and convert the CPAN package for PACKAGE-NAME.\n"))
   (display (G_ "
   -h, --help             display this help and exit"))
+  (display (G_ "
+  -r, --recursive        generate package expressions for all Gem packages\
+ that are not yet in Guix"))
   (display (G_ "
   -V, --version          display version information and exit"))
   (newline)
@@ -54,6 +57,9 @@ (define %options
                  (lambda args
                    (show-help)
                    (exit 0)))
+         (option '(#\r "recursive") #f #f
+                 (lambda (opt name arg result)
+                   (alist-cons 'recursive #t result)))
          (option '(#\V "version") #f #f
                  (lambda args
                    (show-version-and-exit "guix import cpan")))
@@ -78,11 +84,20 @@ (define (guix-import-cpan . args)
                            (reverse opts))))
     (match args
       ((package-name)
-       (let ((sexp (cpan->guix-package package-name)))
-         (unless sexp
-           (leave (G_ "failed to download meta-data for package '~a'~%")
-                  package-name))
-         sexp))
+       (let ((sexp
+               (if (assoc-ref opts 'recursive)
+                 (map (match-lambda
+                        ((and ('package ('name name) . rest) pkg)
+                         `(define-public ,(string->symbol name)
+                                         ,pkg))
+                        (_ #f))
+                      (cpan-recursive-import package-name))
+                 (let ((sexp (cpan->guix-package package-name)))
+                   sexp))))
+             (unless sexp
+               (leave (G_ "failed to download meta-data for package '~a'~%")
+                      package-name))
+             sexp))
       (()
        (leave (G_ "too few arguments~%")))
       ((many ...)

base-commit: 931d893c550128591018587c90d2491fd66a11a4
-- 
2.43.0





Information forwarded to guix <at> cbaines.net, dev <at> jpoiret.xyz, ludo <at> gnu.org, othacehe <at> gnu.org, rekado <at> elephly.net, zimon.toutoune <at> gmail.com, me <at> tobias.gr, guix-patches <at> gnu.org:
bug#68358; Package guix-patches. (Wed, 10 Jan 2024 01:31:01 GMT) Full text and rfc822 format available.

Message #8 received at 68358 <at> debbugs.gnu.org (full text, mbox):

From: "zero <at> fedora" <shinyzero0 <at> tilde.club>
To: 68358 <at> debbugs.gnu.org
Cc: "zero <at> fedora" <shinyzero0 <at> tilde.club>
Subject: [PATCH] guix: import: cpan: add recursive
Date: Wed, 10 Jan 2024 04:29:56 +0300
* guix/import/cpan.scm: new function, some changes to make recursive import possible
* guix/scripts/import/cpan.scm: add recursive import

Change-Id: Id167c7ddd079f4e04650ce7cc1692a9de36cd8fe
---
 guix/import/cpan.scm         | 63 ++++++++++++++++++++++--------------
 guix/scripts/import/cpan.scm | 25 +++++++++++---
 2 files changed, 58 insertions(+), 30 deletions(-)

diff --git a/guix/import/cpan.scm b/guix/import/cpan.scm
index b87736eef6..2090da275d 100644
--- a/guix/import/cpan.scm
+++ b/guix/import/cpan.scm
@@ -37,12 +37,13 @@ (define-module (guix import cpan)
   #:use-module (guix utils)
   #:use-module (guix base32)
   #:use-module ((guix download) #:select (download-to-store url-fetch))
-  #:use-module ((guix import utils) #:select (factorize-uri))
+  #:use-module (guix import utils)
   #:use-module (guix import json)
   #:use-module (guix packages)
   #:use-module (guix upstream)
   #:use-module (guix derivations)
   #:export (cpan->guix-package
+            cpan-recursive-import
             metacpan-url->mirror-url
             %cpan-updater
 
@@ -284,35 +285,42 @@ (define (cpan-module->sexp release)
                                             upstream-input-downstream-name)
                                    inputs)))))))
 
-  (let ((tarball (with-store store
+  (let* ((tarball (with-store store
                    (download-to-store store source-url)))
-        (inputs (cpan-module-inputs release)))
-    `(package
-       (name ,(cpan-name->downstream-name name))
-       (version ,version)
-       (source (origin
-                 (method url-fetch)
-                 (uri (string-append ,@(factorize-uri source-url version)))
-                 (sha256
-                  (base32
-                   ,(bytevector->nix-base32-string (file-sha256 tarball))))))
-       (build-system perl-build-system)
-       ,@(maybe-inputs 'native-inputs
-                       (filter (upstream-input-type-predicate 'native)
-                               inputs))
-       ,@(maybe-inputs 'propagated-inputs
-                       (filter (upstream-input-type-predicate 'propagated)
-                               inputs))
-       (home-page ,(cpan-home name))
-       (synopsis ,(cpan-release-abstract release))
-       (description fill-in-yourself!)
-       (license ,(string->license (cpan-release-license release))))))
+         (inputs (cpan-module-inputs release))
+         (sexp
+           `(package
+              (name ,(cpan-name->downstream-name name))
+              (version ,version)
+              (source (origin
+                        (method url-fetch)
+                        (uri (string-append ,@(factorize-uri source-url version)))
+                        (sha256
+                          (base32
+                            ,(bytevector->nix-base32-string (file-sha256 tarball))))))
+              (build-system perl-build-system)
+              ,@(maybe-inputs 'native-inputs
+                              (filter (upstream-input-type-predicate 'native)
+                                      inputs))
+              ,@(maybe-inputs 'propagated-inputs
+                              (filter (upstream-input-type-predicate 'propagated)
+                                      inputs))
+              (home-page ,(cpan-home name))
+              (synopsis ,(cpan-release-abstract release))
+              (description fill-in-yourself!)
+              (license ,(string->license (cpan-release-license release))))))
+    (values
+      sexp
+      (map upstream-input-name inputs))
+    ))
 
-(define (cpan->guix-package module-name)
+(define* (cpan->guix-package module-name #:key version #:allow-other-keys)
   "Fetch the metadata for PACKAGE-NAME from metacpan.org, and return the
 `package' s-expression corresponding to that package, or #f on failure."
   (let ((release (cpan-fetch (module->name module-name))))
-    (and=> release cpan-module->sexp)))
+    (if release
+      (cpan-module->sexp release)
+      (values #f '()))))
 
 (define cpan-package?
   (let ((cpan-rx (make-regexp (string-append "("
@@ -357,6 +365,11 @@ (define* (latest-release package #:key (version #f))
         (urls (list url))
         (inputs (cpan-module-inputs release)))))))
 
+(define* (cpan-recursive-import package-name)
+  (recursive-import package-name
+                    #:repo->guix-package cpan->guix-package
+                    #:guix-name (compose cpan-name->downstream-name module->name)))
+
 (define %cpan-updater
   (upstream-updater
    (name 'cpan)
diff --git a/guix/scripts/import/cpan.scm b/guix/scripts/import/cpan.scm
index bdf5a1e423..cab6424068 100644
--- a/guix/scripts/import/cpan.scm
+++ b/guix/scripts/import/cpan.scm
@@ -43,6 +43,9 @@ (define (show-help)
 Import and convert the CPAN package for PACKAGE-NAME.\n"))
   (display (G_ "
   -h, --help             display this help and exit"))
+  (display (G_ "
+  -r, --recursive        generate package expressions for all Gem packages\
+ that are not yet in Guix"))
   (display (G_ "
   -V, --version          display version information and exit"))
   (newline)
@@ -54,6 +57,9 @@ (define %options
                  (lambda args
                    (show-help)
                    (exit 0)))
+         (option '(#\r "recursive") #f #f
+                 (lambda (opt name arg result)
+                   (alist-cons 'recursive #t result)))
          (option '(#\V "version") #f #f
                  (lambda args
                    (show-version-and-exit "guix import cpan")))
@@ -78,11 +84,20 @@ (define (guix-import-cpan . args)
                            (reverse opts))))
     (match args
       ((package-name)
-       (let ((sexp (cpan->guix-package package-name)))
-         (unless sexp
-           (leave (G_ "failed to download meta-data for package '~a'~%")
-                  package-name))
-         sexp))
+       (let ((sexp
+               (if (assoc-ref opts 'recursive)
+                 (map (match-lambda
+                        ((and ('package ('name name) . rest) pkg)
+                         `(define-public ,(string->symbol name)
+                                         ,pkg))
+                        (_ #f))
+                      (cpan-recursive-import package-name))
+                 (let ((sexp (cpan->guix-package package-name)))
+                   sexp))))
+             (unless sexp
+               (leave (G_ "failed to download meta-data for package '~a'~%")
+                      package-name))
+             sexp))
       (()
        (leave (G_ "too few arguments~%")))
       ((many ...)

base-commit: 931d893c550128591018587c90d2491fd66a11a4
-- 
2.43.0





Reply sent to Ludovic Courtès <ludo <at> gnu.org>:
You have taken responsibility. (Sat, 23 Nov 2024 15:24:03 GMT) Full text and rfc822 format available.

Notification sent to "zero <at> fedora" <shinyzero0 <at> tilde.club>:
bug acknowledged by developer. (Sat, 23 Nov 2024 15:24:03 GMT) Full text and rfc822 format available.

Message #13 received at 68358-done <at> debbugs.gnu.org (full text, mbox):

From: Ludovic Courtès <ludo <at> gnu.org>
To: "zero <at> fedora" <shinyzero0 <at> tilde.club>
Cc: Josselin Poiret <dev <at> jpoiret.xyz>, 68358-done <at> debbugs.gnu.org,
 Simon Tournier <zimon.toutoune <at> gmail.com>, Mathieu Othacehe <othacehe <at> gnu.org>,
 Tobias Geerinckx-Rice <me <at> tobias.gr>, Ricardo Wurmus <rekado <at> elephly.net>,
 Christopher Baines <guix <at> cbaines.net>
Subject: Re: [bug#68358] [PATCH] guix: import: cpan: add recursive
Date: Sat, 23 Nov 2024 16:22:57 +0100
[Message part 1 (text/plain, inline)]
Hi,

"zero <at> fedora" <shinyzero0 <at> tilde.club> skribis:

> * guix/import/cpan.scm: new function, some changes to make recursive import possible
> * guix/scripts/import/cpan.scm: add recursive import
>
> Change-Id: Id167c7ddd079f4e04650ce7cc1692a9de36cd8fe

Applied with the cosmetic changes below and tweaks to the commit log.

Thank you, and apologies for the long delay!

Ludo’.

[Message part 2 (text/x-patch, inline)]
diff --git a/doc/guix.texi b/doc/guix.texi
index 454dd66c18..8297ad2ca6 100644
--- a/doc/guix.texi
+++ b/doc/guix.texi
@@ -14207,6 +14207,17 @@ Invoking guix import
 guix import cpan Acme::Boolean
 @end example
 
+Like many other importers, the @code{cpan} importer supports recursive
+imports:
+
+@table @code
+@item --recursive
+@itemx -r
+Traverse the dependency graph of the given upstream package recursively
+and generate package expressions for all those packages that are not yet
+in Guix.
+@end table
+
 @item cran
 @cindex CRAN
 @cindex Bioconductor
diff --git a/guix/import/cpan.scm b/guix/import/cpan.scm
index 2090da275d..85e5e69098 100644
--- a/guix/import/cpan.scm
+++ b/guix/import/cpan.scm
@@ -37,7 +37,8 @@ (define-module (guix import cpan)
   #:use-module (guix utils)
   #:use-module (guix base32)
   #:use-module ((guix download) #:select (download-to-store url-fetch))
-  #:use-module (guix import utils)
+  #:use-module ((guix import utils)
+                #:select (factorize-uri recursive-import))
   #:use-module (guix import json)
   #:use-module (guix packages)
   #:use-module (guix upstream)
@@ -309,18 +310,15 @@ (define (cpan-module->sexp release)
               (synopsis ,(cpan-release-abstract release))
               (description fill-in-yourself!)
               (license ,(string->license (cpan-release-license release))))))
-    (values
-      sexp
-      (map upstream-input-name inputs))
-    ))
+    (values sexp (map upstream-input-name inputs))))
 
 (define* (cpan->guix-package module-name #:key version #:allow-other-keys)
   "Fetch the metadata for PACKAGE-NAME from metacpan.org, and return the
 `package' s-expression corresponding to that package, or #f on failure."
   (let ((release (cpan-fetch (module->name module-name))))
     (if release
-      (cpan-module->sexp release)
-      (values #f '()))))
+        (cpan-module->sexp release)
+        (values #f '()))))
 
 (define cpan-package?
   (let ((cpan-rx (make-regexp (string-append "("
diff --git a/guix/scripts/import/cpan.scm b/guix/scripts/import/cpan.scm
index cab6424068..4ddd85ee57 100644
--- a/guix/scripts/import/cpan.scm
+++ b/guix/scripts/import/cpan.scm
@@ -44,8 +44,7 @@ (define (show-help)
   (display (G_ "
   -h, --help             display this help and exit"))
   (display (G_ "
-  -r, --recursive        generate package expressions for all Gem packages\
- that are not yet in Guix"))
+  -r, --recursive        import missing packages recursively"))
   (display (G_ "
   -V, --version          display version information and exit"))
   (newline)

bug archived. Request was from Debbugs Internal Request <help-debbugs <at> gnu.org> to internal_control <at> debbugs.gnu.org. (Sun, 22 Dec 2024 12:24:12 GMT) Full text and rfc822 format available.

This bug report was last modified 81 days ago.

Previous Next


GNU bug tracking system
Copyright (C) 1999 Darren O. Benham, 1997,2003 nCipher Corporation Ltd, 1994-97 Ian Jackson.