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.
parent
5d4af22ef2
commit
47960b5526
|
@ -354,7 +354,7 @@ file system labels."
|
|||
|
||||
(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 @@ file system labels."
|
|||
(_ ;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\"
|
||||
|
|
|
@ -28,9 +28,11 @@
|
|||
#: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 @@
|
|||
|
||||
;; 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)
|
||||
|
|
Reference in New Issue