Subject: [PATCH] import/cran: Add input style "specification".
From: Ricardo Wurmus <[email-masked]>
To: [email-masked]
Cc: Ricardo Wurmus <[email-masked]>
Date: Thu, 17 Dec 2020 10:42:45 +0100
List-Id: <debbugs-submit.debbugs.gnu.org>

* guix/import/cran.scm (%input-style): New parameter.
(format-inputs): Use it.
* guix/scripts/import/cran.scm (guix-import-cran): Set the %input-style
parameter.
 (%options): Add "--style" option.
* doc/guix.texi (Invoking guix import): Document it.
---
 doc/guix.texi                |  7 ++++++
 guix/import/cran.scm         | 13 +++++++++--
 guix/scripts/import/cran.scm | 45 ++++++++++++++++++++----------------
 3 files changed, 43 insertions(+), 22 deletions(-)

diff --git a/doc/guix.texi b/doc/guix.texi
index 392baf5910..74cd86be37 100644
--- a/doc/guix.texi
+++ b/doc/guix.texi
@@ -11009,6 +11009,13 @@ When @option{--recursive} is added, the importer will traverse the
 dependency graph of the given upstream package recursively and generate
 package expressions for all those packages that are not yet in Guix.
 
+When @option{--style=specification} is added, the importer will generate
+package definitions whose inputs are package specifications instead of
+references to package variables.  This is useful when generated package
+definitions are to be appended to existing user modules, as the list of
+used package modules need not be changed.  The default is
+@option{--style=variable}.
+
 When @option{--archive=bioconductor} is added, metadata is imported from
 @uref{https://www.bioconductor.org/, Bioconductor}, a repository of R
 packages for the analysis and comprehension of high-throughput
diff --git a/guix/import/cran.scm b/guix/import/cran.scm
index 9d38be7a1e..fd44d80915 100644
--- a/guix/import/cran.scm
+++ b/guix/import/cran.scm
@@ -51,7 +51,9 @@
   #:use-module (guix upstream)
   #:use-module (guix packages)
   #:use-module (gnu packages)
-  #:export (cran->guix-package
+  #:export (%input-style
+
+            cran->guix-package
             bioconductor->guix-package
             cran-recursive-import
             %cran-updater
@@ -74,6 +76,9 @@
 ;;;
 ;;; Code:
 
+(define %input-style
+  (make-parameter 'variable)) ; or 'specification
+
 (define string->license
   (match-lambda
    ("AGPL-3" 'agpl3+)
@@ -128,7 +133,11 @@
 (define (format-inputs names)
   "Generate a sorted list of package inputs from a list of package NAMES."
   (map (lambda (name)
-         (list name (list 'unquote (string->symbol name))))
+         (case (%input-style)
+           ((specification)
+            (list name (list 'unquote (list 'specification->package name))))
+           (else
+            (list name (list 'unquote (string->symbol name))))))
        (sort names string-ci<?)))
 
 (define* (maybe-inputs package-inputs #:optional (type 'inputs))
diff --git a/guix/scripts/import/cran.scm b/guix/scripts/import/cran.scm
index 20e82ae2ca..4767bc082d 100644
--- a/guix/scripts/import/cran.scm
+++ b/guix/scripts/import/cran.scm
@@ -67,6 +67,10 @@ Import and convert the CRAN package for PACKAGE-NAME.\n"))
                  (lambda (opt name arg result)
                    (alist-cons 'repo (string->symbol arg)
                                (alist-delete 'repo result))))
+         (option '(#\s "style") #t #f
+                 (lambda (opt name arg result)
+                   (alist-cons 'style (string->symbol arg)
+                               (alist-delete 'style result))))
          (option '(#\r "recursive") #f #f
                  (lambda (opt name arg result)
                    (alist-cons 'recursive #t result)))
@@ -93,23 +97,24 @@ Import and convert the CRAN package for PACKAGE-NAME.\n"))
                              value)
                             (_ #f))
                            (reverse opts))))
-    (match args
-      ((package-name)
-       (if (assoc-ref opts 'recursive)
-           ;; Recursive import
-           (with-error-handling
-             (map package->definition
-                  (filter identity
-                          (cran-recursive-import package-name
-                                                 #:repo (or (assoc-ref opts 'repo) 'cran)))))
-           ;; Single import
-           (let ((sexp (cran->guix-package package-name
-                                           #:repo (or (assoc-ref opts 'repo) 'cran))))
-             (unless sexp
-               (leave (G_ "failed to download description for package '~a'~%")
-                      package-name))
-             sexp)))
-      (()
-       (leave (G_ "too few arguments~%")))
-      ((many ...)
-       (leave (G_ "too many arguments~%"))))))
+    (parameterize ((%input-style (assoc-ref opts 'style)))
+      (match args
+        ((package-name)
+         (if (assoc-ref opts 'recursive)
+             ;; Recursive import
+             (with-error-handling
+               (map package->definition
+                    (filter identity
+                            (cran-recursive-import package-name
+                                                   #:repo (or (assoc-ref opts 'repo) 'cran)))))
+             ;; Single import
+             (let ((sexp (cran->guix-package package-name
+                                             #:repo (or (assoc-ref opts 'repo) 'cran))))
+               (unless sexp
+                 (leave (G_ "failed to download description for package '~a'~%")
+                        package-name))
+               sexp)))
+        (()
+         (leave (G_ "too few arguments~%")))
+        ((many ...)
+         (leave (G_ "too many arguments~%")))))))
-- 
2.29.2