diff options
author | Federico Beffa <beffa@fbengineering.ch> | 2015-11-11 16:20:45 +0100 |
---|---|---|
committer | Federico Beffa <beffa@fbengineering.ch> | 2015-11-26 18:17:23 +0100 |
commit | 94abc84887ddbb56c0428a4ad783318845fcb281 (patch) | |
tree | 8281f2a75a29b6196dcc89373534115252fb633a /guix/import/cabal.scm | |
parent | 876fd23ab6dd03c6d7d5d6b2494fbc0e1c5874ce (diff) |
import: hackage: Make parsing of tests and fields more flexible.
* guix/import/cabal.scm (is-test): Allow spaces between keyword and
parentheses.
(is-id): Add argument 'port'. Allow spaces between keyword and column.
(lex-word): Adjust call to 'is-id'.
Diffstat (limited to 'guix/import/cabal.scm')
-rw-r--r-- | guix/import/cabal.scm | 19 |
1 files changed, 13 insertions, 6 deletions
diff --git a/guix/import/cabal.scm b/guix/import/cabal.scm index 63de74af00..c20e074e18 100644 --- a/guix/import/cabal.scm +++ b/guix/import/cabal.scm @@ -333,7 +333,7 @@ matching a string against the created regexp." (make-regexp pat)))) (cut regexp-exec rx <>))) -(define is-property (make-rx-matcher "([a-z0-9-]+):[ \t]*(\\w?.*)$" +(define is-property (make-rx-matcher "([a-z0-9-]+)[ \t]*:[ \t]*(\\w?.*)$" regexp/icase)) (define is-flag (make-rx-matcher "^flag +([a-z0-9_-]+)" @@ -366,17 +366,24 @@ matching a string against the created regexp." (define (is-or s) (string=? s "||")) -(define (is-id s) +(define (is-id s port) (let ((cabal-reserved-words '("if" "else" "library" "flag" "executable" "test-suite" - "source-repository" "benchmark"))) + "source-repository" "benchmark")) + (spaces (read-while (cut char-set-contains? char-set:blank <>) port)) + (c (peek-char port))) + (unread-string spaces port) (and (every (cut string-ci<> s <>) cabal-reserved-words) - (not (char=? (last (string->list s)) #\:))))) + (and (not (char=? (last (string->list s)) #\:)) + (not (char=? #\: c)))))) (define (is-test s port) (let ((tests-rx (make-regexp "os|arch|flag|impl")) + (spaces (read-while (cut char-set-contains? char-set:blank <>) port)) (c (peek-char port))) - (and (regexp-exec tests-rx s) (char=? #\( c)))) + (if (and (regexp-exec tests-rx s) (char=? #\( c)) + #t + (begin (unread-string spaces port) #f)))) ;; Lexers for individual tokens. @@ -509,7 +516,7 @@ LOC is the current port location." ((is-false w) (lex-false loc)) ((is-and w) (lex-and loc)) ((is-or w) (lex-or loc)) - ((is-id w) (lex-id w loc)) + ((is-id w port) (lex-id w loc)) (else (unread-string w port) #f)))) (define (lex-line port loc) |