~ruther/guix-local

b7b88288011aa41791b6634ae229f426bacc55ce — Ludovic Courtès 12 years ago fdc1bf6
records: `recutils->alist' recognizes comments.

* guix/records.scm (%recutils-comment-rx): New variable.
  (recutils->alist): Match comments.
* tests/records.scm ("recutils->alist"): Add comments.
2 files changed, 23 insertions(+), 3 deletions(-)

M guix/records.scm
M tests/records.scm
M guix/records.scm => guix/records.scm +11 -1
@@ 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)

M tests/records.scm => tests/records.scm +12 -2
@@ 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))))