~ruther/guix-local

d28869afadd37757aca79c0f6272b962e2083e32 — Ludovic Courtès 11 years ago 29decd1
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.
1 files changed, 8 insertions(+), 0 deletions(-)

M guix/store.scm
M guix/store.scm => guix/store.scm +8 -0
@@ 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.