system: Improve 'read-boot-parameters' incompatibility diagnostic.

Previously, when reading an incompatible "parameters" file, 'guix
system' would print a warning and then crash with a wrong-type-arg
backtrace because code expects 'read-boot-parameters' to always return a
<boot-parameters> record.

* gnu/system.scm (read-boot-parameters): Upon incompatibility, raise an
error instead of returning #f.  Also raise a '&fix-hint' condition.
* tests/boot-parameters.scm ("read, construction, mandatory fields"):
Define 'test-read-boot-parameters' as a macro; expect
'formatted-message?' exceptions rather than #f returns.
This commit is contained in:
Ludovic Courtès 2022-03-16 15:03:01 +01:00
parent 5d4af22ef2
commit 47960b5526
No known key found for this signature in database
GPG key ID: 090B11993D9AEBB5
2 changed files with 29 additions and 11 deletions

View file

@ -354,7 +354,7 @@ (define (ensure-not-/dev device)
(define (read-boot-parameters port)
"Read boot parameters from PORT and return the corresponding
<boot-parameters> object or #f if the format is unrecognized."
<boot-parameters> object. Raise an error if the format is unrecognized."
(define device-sexp->device
(match-lambda
(('uuid (? symbol? type) (? bytevector? bv))
@ -481,9 +481,20 @@ (define (version? n)
(_ ;the old format
"/")))))
(x ;unsupported format
(warning (G_ "unrecognized boot parameters at '~a'~%")
(port-filename port))
#f)))
(raise
(make-compound-condition
(formatted-message
(G_ "unrecognized boot parameters at '~a'~%")
(port-filename port))
(condition
(&fix-hint (hint (format #f (G_ "This probably means that this version
of Guix is older than the one that created @file{~a}. To address this, you
need to update Guix:
@example
guix pull
@end example")
(port-filename port))))))))))
(define (read-boot-parameters-file system)
"Read boot parameters from SYSTEM's (system or generation) \"parameters\"

View file

@ -28,9 +28,11 @@ (define-module (test-boot-parameters)
#:use-module (gnu system)
#:use-module (gnu system file-systems)
#:use-module (gnu system uuid)
#:use-module ((guix diagnostics) #:select (formatted-message?))
#:use-module (guix gexp)
#:use-module (guix store)
#:use-module (guix tests)
#:use-module (srfi srfi-34)
#:use-module (srfi srfi-64)
#:use-module (rnrs bytevectors))
@ -151,13 +153,18 @@ (define (sexp-or-nothing fmt val)
;; XXX: <warning: unrecognized boot parameters at '#f'>
(test-assert "read, construction, mandatory fields"
(not (or (test-read-boot-parameters #:version #false)
(test-read-boot-parameters #:version 'false)
(test-read-boot-parameters #:version -1)
(test-read-boot-parameters #:version "0")
(test-read-boot-parameters #:root-device #false)
(test-read-boot-parameters #:kernel #false)
(test-read-boot-parameters #:label #false))))
(let-syntax ((test-read-boot-parameters
(syntax-rules ()
((_ args ...)
(guard (c ((formatted-message? c) #f))
(test-read-boot-parameters args ...))))))
(not (or (test-read-boot-parameters #:version #false)
(test-read-boot-parameters #:version 'false)
(test-read-boot-parameters #:version -1)
(test-read-boot-parameters #:version "0")
(test-read-boot-parameters #:root-device #false)
(test-read-boot-parameters #:kernel #false)
(test-read-boot-parameters #:label #false)))))
(test-assert "read, construction, optional fields"
(and (test-read-boot-parameters #:bootloader-name #false)