summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLudovic Courtès <ludo@gnu.org>2018-09-15 14:50:14 +0200
committerLudovic Courtès <ludo@gnu.org>2018-09-21 17:04:37 +0200
commite1a4ffdab52f616f41de4ff783a712bcd50a5187 (patch)
tree0da8a654841979daaf0de24ed4bee82899b85a8b
parent9daf046c5dd9256e45073dfd4647e12de10dcb3e (diff)
inferior: Add 'lookup-inferior-packages'.
* guix/inferior.scm (<inferior>)[packages, table]: New fields. (open-inferior): Initialize these new fields. (inferior-packages): Rename to... (%inferior-packages): ... this. (inferior-packages): New procedure; force the promise. (%inferior-package-table, lookup-inferior-packages): New procedures. * tests/inferior.scm ("lookup-inferior-packages") ("lookup-inferior-packages and eq?-ness"): New tests.
-rw-r--r--guix/inferior.scm47
-rw-r--r--tests/inferior.scm29
2 files changed, 70 insertions, 6 deletions
diff --git a/guix/inferior.scm b/guix/inferior.scm
index 5bef9648871..81b71d0c77d 100644
--- a/guix/inferior.scm
+++ b/guix/inferior.scm
@@ -22,7 +22,8 @@
22 #:use-module ((guix utils) 22 #:use-module ((guix utils)
23 #:select (%current-system 23 #:select (%current-system
24 source-properties->location 24 source-properties->location
25 call-with-temporary-directory)) 25 call-with-temporary-directory
26 version>? version-prefix?))
26 #:use-module ((guix store) 27 #:use-module ((guix store)
27 #:select (nix-server-socket 28 #:select (nix-server-socket
28 nix-server-major-version 29 nix-server-major-version
@@ -31,8 +32,10 @@
31 #:use-module ((guix derivations) 32 #:use-module ((guix derivations)
32 #:select (read-derivation-from-file)) 33 #:select (read-derivation-from-file))
33 #:use-module (guix gexp) 34 #:use-module (guix gexp)
35 #:use-module (srfi srfi-1)
34 #:use-module (ice-9 match) 36 #:use-module (ice-9 match)
35 #:use-module (ice-9 popen) 37 #:use-module (ice-9 popen)
38 #:use-module (ice-9 vlist)
36 #:use-module (ice-9 binary-ports) 39 #:use-module (ice-9 binary-ports)
37 #:export (inferior? 40 #:export (inferior?
38 open-inferior 41 open-inferior
@@ -45,6 +48,7 @@
45 inferior-package-version 48 inferior-package-version
46 49
47 inferior-packages 50 inferior-packages
51 lookup-inferior-packages
48 inferior-package-synopsis 52 inferior-package-synopsis
49 inferior-package-description 53 inferior-package-description
50 inferior-package-home-page 54 inferior-package-home-page
@@ -61,11 +65,13 @@
61 65
62;; Inferior Guix process. 66;; Inferior Guix process.
63(define-record-type <inferior> 67(define-record-type <inferior>
64 (inferior pid socket version) 68 (inferior pid socket version packages table)
65 inferior? 69 inferior?
66 (pid inferior-pid) 70 (pid inferior-pid)
67 (socket inferior-socket) 71 (socket inferior-socket)
68 (version inferior-version)) ;REPL protocol version 72 (version inferior-version) ;REPL protocol version
73 (packages inferior-package-promise) ;promise of inferior packages
74 (table inferior-package-table)) ;promise of vhash
69 75
70(define (inferior-pipe directory command) 76(define (inferior-pipe directory command)
71 "Return an input/output pipe on the Guix instance in DIRECTORY. This runs 77 "Return an input/output pipe on the Guix instance in DIRECTORY. This runs
@@ -109,7 +115,9 @@ equivalent. Return #f if the inferior could not be launched."
109 115
110 (match (read pipe) 116 (match (read pipe)
111 (('repl-version 0 rest ...) 117 (('repl-version 0 rest ...)
112 (let ((result (inferior 'pipe pipe (cons 0 rest)))) 118 (letrec ((result (inferior 'pipe pipe (cons 0 rest)
119 (delay (%inferior-packages result))
120 (delay (%inferior-package-table result)))))
113 (inferior-eval '(use-modules (guix)) result) 121 (inferior-eval '(use-modules (guix)) result)
114 (inferior-eval '(use-modules (gnu)) result) 122 (inferior-eval '(use-modules (gnu)) result)
115 (inferior-eval '(define %package-table (make-hash-table)) 123 (inferior-eval '(define %package-table (make-hash-table))
@@ -181,8 +189,8 @@ equivalent. Return #f if the inferior could not be launched."
181 189
182(set-record-type-printer! <inferior-package> write-inferior-package) 190(set-record-type-printer! <inferior-package> write-inferior-package)
183 191
184(define (inferior-packages inferior) 192(define (%inferior-packages inferior)
185 "Return the list of packages known to INFERIOR." 193 "Compute the list of inferior packages from INFERIOR."
186 (let ((result (inferior-eval 194 (let ((result (inferior-eval
187 '(fold-packages (lambda (package result) 195 '(fold-packages (lambda (package result)
188 (let ((id (object-address package))) 196 (let ((id (object-address package)))
@@ -198,6 +206,33 @@ equivalent. Return #f if the inferior could not be launched."
198 (inferior-package inferior name version id))) 206 (inferior-package inferior name version id)))
199 result))) 207 result)))
200 208
209(define (inferior-packages inferior)
210 "Return the list of packages known to INFERIOR."
211 (force (inferior-package-promise inferior)))
212
213(define (%inferior-package-table inferior)
214 "Compute a package lookup table for INFERIOR."
215 (fold (lambda (package table)
216 (vhash-cons (inferior-package-name package) package
217 table))
218 vlist-null
219 (inferior-packages inferior)))
220
221(define* (lookup-inferior-packages inferior name #:optional version)
222 "Return the sorted list of inferior packages matching NAME in INFERIOR, with
223highest version numbers first. If VERSION is true, return only packages with
224a version number prefixed by VERSION."
225 ;; This is the counterpart of 'find-packages-by-name'.
226 (sort (filter (lambda (package)
227 (or (not version)
228 (version-prefix? version
229 (inferior-package-version package))))
230 (vhash-fold* cons '() name
231 (force (inferior-package-table inferior))))
232 (lambda (p1 p2)
233 (version>? (inferior-package-version p1)
234 (inferior-package-version p2)))))
235
201(define (inferior-package-field package getter) 236(define (inferior-package-field package getter)
202 "Return the field of PACKAGE, an inferior package, accessed with GETTER." 237 "Return the field of PACKAGE, an inferior package, accessed with GETTER."
203 (let ((inferior (inferior-package-inferior package)) 238 (let ((inferior (inferior-package-inferior package))
diff --git a/tests/inferior.scm b/tests/inferior.scm
index 817fcb6c6b5..791e30b179d 100644
--- a/tests/inferior.scm
+++ b/tests/inferior.scm
@@ -79,6 +79,35 @@
79 (close-inferior inferior) 79 (close-inferior inferior)
80 result)))) 80 result))))
81 81
82(test-equal "lookup-inferior-packages"
83 (let ((->list (lambda (package)
84 (list (package-name package)
85 (package-version package)
86 (package-location package)))))
87 (list (map ->list (find-packages-by-name "guile" #f))
88 (map ->list (find-packages-by-name "guile" "2.2"))))
89 (let* ((inferior (open-inferior %top-builddir
90 #:command "scripts/guix"))
91 (->list (lambda (package)
92 (list (inferior-package-name package)
93 (inferior-package-version package)
94 (inferior-package-location package))))
95 (lst1 (map ->list
96 (lookup-inferior-packages inferior "guile")))
97 (lst2 (map ->list
98 (lookup-inferior-packages inferior
99 "guile" "2.2"))))
100 (close-inferior inferior)
101 (list lst1 lst2)))
102
103(test-assert "lookup-inferior-packages and eq?-ness"
104 (let* ((inferior (open-inferior %top-builddir
105 #:command "scripts/guix"))
106 (lst1 (lookup-inferior-packages inferior "guile"))
107 (lst2 (lookup-inferior-packages inferior "guile")))
108 (close-inferior inferior)
109 (every eq? lst1 lst2)))
110
82(test-equal "inferior-package-derivation" 111(test-equal "inferior-package-derivation"
83 (map derivation-file-name 112 (map derivation-file-name
84 (list (package-derivation %store %bootstrap-guile "x86_64-linux") 113 (list (package-derivation %store %bootstrap-guile "x86_64-linux")