diff options
author | Federico Beffa <beffa@fbengineering.ch> | 2015-11-11 15:31:46 +0100 |
---|---|---|
committer | Federico Beffa <beffa@fbengineering.ch> | 2015-11-26 18:17:23 +0100 |
commit | 876fd23ab6dd03c6d7d5d6b2494fbc0e1c5874ce (patch) | |
tree | 6150ef356a4f2ccbaf1a239ad913080cf37fd3a4 | |
parent | 9be54eb1b1dab6a3e3ea11734f720a5ef703d76b (diff) | |
download | guix-876fd23ab6dd03c6d7d5d6b2494fbc0e1c5874ce.tar guix-876fd23ab6dd03c6d7d5d6b2494fbc0e1c5874ce.tar.gz |
import: hackage: Make it resilient to missing final newline.
* guix/import/cabal.scm (peek-next-line-indent): Check for missing final
newline.
-rw-r--r-- | guix/import/cabal.scm | 31 |
1 files changed, 18 insertions, 13 deletions
diff --git a/guix/import/cabal.scm b/guix/import/cabal.scm index ed6394ef6d..63de74af00 100644 --- a/guix/import/cabal.scm +++ b/guix/import/cabal.scm @@ -227,19 +227,24 @@ to the stack." "This function can be called when the next character on PORT is #\newline and returns the indentation of the line starting after the #\newline character. Discard (and consume) empty and comment lines." - (let ((initial-newline (string (read-char port)))) - (let loop ((char (peek-char port)) - (word "")) - (cond ((eqv? char #\newline) (read-char port) - (loop (peek-char port) "")) - ((or (eqv? char #\space) (eqv? char #\tab)) - (let ((c (read-char port))) - (loop (peek-char port) (string-append word (string c))))) - ((comment-line port char) (loop (peek-char port) "")) - (else - (let ((len (string-length word))) - (unread-string (string-append initial-newline word) port) - len)))))) + (if (eof-object? (peek-char port)) + ;; If the file is missing the #\newline on the last line, add it and act + ;; as if it were there. This is needed for proper operation of + ;; indentation based block recognition (based on ‘port-column’). + (begin (unread-char #\newline port) (read-char port) 0) + (let ((initial-newline (string (read-char port)))) + (let loop ((char (peek-char port)) + (word "")) + (cond ((eqv? char #\newline) (read-char port) + (loop (peek-char port) "")) + ((or (eqv? char #\space) (eqv? char #\tab)) + (let ((c (read-char port))) + (loop (peek-char port) (string-append word (string c))))) + ((comment-line port char) (loop (peek-char port) "")) + (else + (let ((len (string-length word))) + (unread-string (string-append initial-newline word) port) + len))))))) (define* (read-value port value min-indent #:optional (separator " ")) "The next character on PORT must be #\newline. Append to VALUE the |