store: Flush the output when the build process emits '\r'.

This allows progress reports emitted by 'substitute-binary' to be
correctly displayed.

* guix/store.scm (%newlines): New variable.
  (process-stderr) <%stderr-next>: Flush (current-build-output-port)
  when S contains one of %NEWLINES.
This commit is contained in:
Ludovic Courtès 2014-05-21 15:29:23 +02:00
parent 29decd1f36
commit d28869afad

@ -370,6 +370,12 @@ to OUT, using chunks of BUFFER-SIZE bytes."
(min (- len total) buffer-size)
buffer-size)))))))
(define %newlines
;; Newline characters triggering a flush of 'current-build-output-port'.
;; Unlike Guile's _IOLBF, we flush upon #\return so that progress reports
;; that use that trick are correctly displayed.
(char-set #\newline #\return))
(define* (process-stderr server #:optional user-port)
"Read standard output and standard error from SERVER, writing it to
CURRENT-BUILD-OUTPUT-PORT. Return #t when SERVER is done sending data, and
@ -412,6 +418,8 @@ encoding conversion errors."
;; Log a string.
(let ((s (read-latin1-string p)))
(display s (current-build-output-port))
(when (string-any %newlines s)
(flush-output-port (current-build-output-port)))
#f))
((= k %stderr-error)
;; Report an error.