diff options
| author | Ludovic Courtès <ludo@gnu.org> | 2018-09-15 14:50:14 +0200 |
|---|---|---|
| committer | Ludovic Courtès <ludo@gnu.org> | 2018-09-21 17:04:37 +0200 |
| commit | e1a4ffdab52f616f41de4ff783a712bcd50a5187 (patch) | |
| tree | 0da8a654841979daaf0de24ed4bee82899b85a8b | |
| parent | 9daf046c5dd9256e45073dfd4647e12de10dcb3e (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.scm | 47 | ||||
| -rw-r--r-- | tests/inferior.scm | 29 |
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 | ||
| 223 | highest version numbers first. If VERSION is true, return only packages with | ||
| 224 | a 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") |
