From 4a3b8f4d5981de444b3590fca8dfa1facb768933 Mon Sep 17 00:00:00 2001 From: Maxim Cournoyer Date: Fri, 18 Feb 2022 15:42:07 -0500 Subject: system: Add a version field to the record. This version field exposes the (already present) version information of a boot parameters file. * gnu/system.scm (%boot-parameters-version): New variable. ()[version]: New field. (read-boot-parameters): Use it. (operating-system-boot-parameters-file): Likewise. * tests/boot-parameters.scm (test-read-boot-parameters): Use %boot-parameters-version as the default version value in the template. --- tests/boot-parameters.scm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'tests/boot-parameters.scm') diff --git a/tests/boot-parameters.scm b/tests/boot-parameters.scm index b2799d0596..d4b680df2e 100644 --- a/tests/boot-parameters.scm +++ b/tests/boot-parameters.scm @@ -101,7 +101,7 @@ ;; Call read-boot-parameters with the desired string as input. (define* (test-read-boot-parameters #:key - (version 0) + (version %boot-parameters-version) (bootloader-name 'grub) (bootloader-menu-entries '()) (label %default-label) -- cgit 1.4.1 From 47960b55268220ca1cb7d2fed41c53873181d816 Mon Sep 17 00:00:00 2001 From: Ludovic Courtès Date: Wed, 16 Mar 2022 15:03:01 +0100 Subject: 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 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. --- gnu/system.scm | 19 +++++++++++++++---- tests/boot-parameters.scm | 21 ++++++++++++++------- 2 files changed, 29 insertions(+), 11 deletions(-) (limited to 'tests/boot-parameters.scm') diff --git a/gnu/system.scm b/gnu/system.scm index dc980312ab..59b3dea93c 100644 --- a/gnu/system.scm +++ b/gnu/system.scm @@ -354,7 +354,7 @@ file system labels." (define (read-boot-parameters port) "Read boot parameters from PORT and return the corresponding - object or #f if the format is unrecognized." + 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\" diff --git a/tests/boot-parameters.scm b/tests/boot-parameters.scm index d4b680df2e..8e48e1775e 100644 --- a/tests/boot-parameters.scm +++ b/tests/boot-parameters.scm @@ -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: (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) -- cgit 1.4.1