diff options
author | Ludovic Courtès <ludo@gnu.org> | 2015-03-05 22:00:11 +0100 |
---|---|---|
committer | Ludovic Courtès <ludo@gnu.org> | 2015-03-05 22:17:36 +0100 |
commit | ce72c780746776a86f59747f5eff8731cb4ff39b (patch) | |
tree | 72b3bd889fd71a4eeeca33811a56ec63cec52e1f /guix/serialization.scm | |
parent | 472e4c430343671a6cb4e5ed392beae04ef09da6 (diff) | |
download | gnu-guix-ce72c780746776a86f59747f5eff8731cb4ff39b.tar gnu-guix-ce72c780746776a86f59747f5eff8731cb4ff39b.tar.gz |
store: Attempt to decode build logs as UTF-8.
* guix/serialization.scm (read-maybe-utf8-string): New procedure.
* guix/store.scm (process-stderr): Use it for the build log and errors.
* tests/store.scm ("current-build-output-port, UTF-8",
"current-build-output-port, UTF-8 + garbage"): New tests.
Diffstat (limited to 'guix/serialization.scm')
-rw-r--r-- | guix/serialization.scm | 18 |
1 files changed, 17 insertions, 1 deletions
diff --git a/guix/serialization.scm b/guix/serialization.scm index da01ff39f5..a99f53ee0b 100644 --- a/guix/serialization.scm +++ b/guix/serialization.scm @@ -29,7 +29,8 @@ #:export (write-int read-int write-long-long read-long-long write-padding - write-string read-string read-latin1-string + write-string + read-string read-latin1-string read-maybe-utf8-string write-string-list read-string-list write-string-pairs write-store-path read-store-path @@ -130,6 +131,21 @@ ;; upgraded to Guile >= 2.0.9. (list->string (map integer->char (bytevector->u8-list bv))))) +(define (read-maybe-utf8-string p) + "Read a serialized string from port P. Attempt to decode it as UTF-8 and +substitute invalid byte sequences with question marks. This is a +\"permissive\" UTF-8 decoder." + ;; XXX: We rely on the port's decoding mechanism to do permissive decoding + ;; and substitute invalid byte sequences with question marks, but this is + ;; not very efficient. Eventually Guile may provide a lightweight + ;; permissive UTF-8 decoder. + (let* ((bv (read-byte-string p)) + (port (with-fluids ((%default-port-encoding "UTF-8") + (%default-port-conversion-strategy + 'substitute)) + (open-bytevector-input-port bv)))) + (get-string-all port))) + (define (write-string-list l p) (write-int (length l) p) (for-each (cut write-string <> p) l)) |