summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--ravanan/command-line-tool.scm61
1 files changed, 54 insertions, 7 deletions
diff --git a/ravanan/command-line-tool.scm b/ravanan/command-line-tool.scm
index 6f95b88..ca78e4c 100644
--- a/ravanan/command-line-tool.scm
+++ b/ravanan/command-line-tool.scm
@@ -25,6 +25,7 @@
   #:use-module (ice-9 filesystem)
   #:use-module (ice-9 format)
   #:use-module (ice-9 match)
+  #:use-module (gnu packages)
   #:use-module ((gnu packages gnupg) #:select (guile-gcrypt))
   #:use-module ((gnu packages guile-xyz) #:select (guile-filesystem))
   #:use-module (guix derivations)
@@ -612,6 +613,27 @@ in a Guix inferior with @var{channels}."
       (manifest->environment (load-manifest manifest-file)
                              guix-daemon-socket)))
 
+(define (specifications->environment specifications channels guix-daemon-socket)
+  "Build a profile with package @var{specifications} and return an association list
+of environment variables to set to use the built profile. Connect to the Guix
+daemon specified by @var{guix-daemon-socket}. If @var{channels} is not
+@code{#f}, look up packages in a Guix inferior with @var{channels}."
+  (define packages->environment
+    (compose (cut manifest->environment <> guix-daemon-socket)
+             packages->manifest))
+
+  (if channels
+      (call-with-inferior (inferior-for-channels channels)
+        (lambda (inferior)
+          (packages->environment
+           (map (lambda (specification)
+                  (match (lookup-inferior-packages inferior specification)
+                    ((inferior-package _ ...)
+                     inferior-package)))
+                specifications))))
+      (packages->environment
+       (map specification->package specifications))))
+
 (define (manifest->environment manifest guix-daemon-socket)
   "Build @var{manifest} and return an association list of environment
 variables to set to use the built profile. Connect to the Guix daemon specified
@@ -656,6 +678,14 @@ same as in @code{run-workflow} from @code{(ravanan workflow)}."
                                                      "envValue"))))
                             (assoc-ref* env-var-requirement "envDef"))))
 
+  (define (software-package->package-specification package)
+    (string-append (assoc-ref* package "package")
+                   (from-maybe
+                    (maybe-bind (maybe-assoc-ref (just package) "version")
+                                (compose just
+                                         (cut string-append "@" <>)))
+                    "")))
+
   (define (files-to-stage initial-work-dir-requirement)
     (vector-map->list (lambda (listing-entry)
                         (if (string? listing-entry)
@@ -809,11 +839,18 @@ same as in @code{run-workflow} from @code{(ravanan workflow)}."
            (initial-work-dir-requirement (find-requirement requirements
                                                            "InitialWorkDirRequirement"))
            (manifest-file
+            (from-maybe (maybe-assoc-ref
+                         (find-requirement requirements "SoftwareRequirement")
+                         "manifest")
+                        manifest-file))
+           (package-specifications
             (from-maybe
-             (maybe-bind (find-requirement requirements "SoftwareRequirement")
-                         (compose just
-                                  (cut assoc-ref* <> "manifest")))
-             manifest-file)))
+             (maybe-let* ((packages (maybe-assoc-ref
+                                     (find-requirement requirements "SoftwareRequirement")
+                                     "packages")))
+               (just (vector-map->list software-package->package-specification
+                                       packages)))
+             '())))
       (with-imported-modules (source-module-closure '((ravanan work command-line-tool)
                                                       (ravanan work monads)
                                                       (ravanan work ui)
@@ -1015,9 +1052,19 @@ directory of the workflow."
               (for-each (match-lambda
                           ((name . value)
                            (setenv name value)))
-                        '#$(manifest-file->environment manifest-file
-                                                       channels
-                                                       guix-daemon-socket))
+                        '#$(match package-specifications
+                             ;; No package specifications; try the manifest
+                             ;; file.
+                             (()
+                              (manifest-file->environment manifest-file
+                                                          channels
+                                                          guix-daemon-socket))
+                             ;; Use package specifications to build an
+                             ;; environment.
+                             (_
+                              (specifications->environment package-specifications
+                                                           channels
+                                                           guix-daemon-socket))))
 
               (call-with-temporary-directory
                (lambda (inputs-directory)