diff --git a/guix/records.scm b/guix/records.scm index 64581f1be2..57664df5a6 100644 --- a/guix/records.scm +++ b/guix/records.scm @@ -217,13 +217,23 @@ PORT, according to FIELDS. FIELDS must be a list of field name/getter pairs." (define %recutils-field-rx (make-regexp "^([[:graph:]]+): (.*)$")) +(define %recutils-comment-rx + ;; info "(recutils) Comments" + (make-regexp "^#")) + (define (recutils->alist port) "Read a recutils-style record from PORT and return it as a list of key/value pairs. Stop upon an empty line (after consuming it) or EOF." (let loop ((line (read-line port)) (result '())) - (cond ((or (eof-object? line) (string-null? line)) + (cond ((eof-object? line) (reverse result)) + ((string-null? line) + (if (null? result) + (loop (read-line port) result) ; leading space: ignore it + (reverse result))) ; end-of-record marker + ((regexp-exec %recutils-comment-rx line) + (loop (read-line port) result)) ((regexp-exec %recutils-field-rx line) => (lambda (match) diff --git a/tests/records.scm b/tests/records.scm index 470644451c..d0635ebb1f 100644 --- a/tests/records.scm +++ b/tests/records.scm @@ -138,13 +138,23 @@ ("Something_else" . "chbouib")) (("Name" . "bar") ("Version" . "1.5"))) - (let ((p (open-input-string "Name: foo + (let ((p (open-input-string " +# Comment following an empty line, and +# preceding a couple of empty lines, all of +# which should be silently consumed. + + +Name: foo Version: 0.1 +# Comment right in the middle, +# spanning two lines. Synopsis: foo bar Something_else: chbouib +# Comment right before. Name: bar -Version: 1.5"))) +Version: 1.5 +# Comment at the end."))) (list (recutils->alist p) (recutils->alist p))))