summary refs log tree commit diff
diff options
context:
space:
mode:
authorLudovic Courtès <ludo@gnu.org>2014-05-21 15:29:23 +0200
committerLudovic Courtès <ludo@gnu.org>2014-05-21 15:29:23 +0200
commitd28869afadd37757aca79c0f6272b962e2083e32 (patch)
tree3aca8dd9cdbeace3bb2cd7f0e78f7c0ae914a6a0
parent29decd1f368e769ac176822c0b5e0d54e056b7d2 (diff)
downloadguix-d28869afadd37757aca79c0f6272b962e2083e32.tar.gz
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.
-rw-r--r--guix/store.scm8
1 files changed, 8 insertions, 0 deletions
diff --git a/guix/store.scm b/guix/store.scm
index 073e024e38..864303ddb3 100644
--- a/guix/store.scm
+++ b/guix/store.scm
@@ -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.