progress: Rate limit drawing in the progress-reporter/bar.

This helps smooth the output in cases where the bar is updated very quickly,
for example in guix weather where it's computing derivations.

* guix/progress.scm (progress-reporter/bar): Wrap the drawing code with the
rate-limited procedure.
This commit is contained in:
Christopher Baines 2021-09-17 11:15:56 +01:00
parent c12c7f1284
commit 604880ae22
No known key found for this signature in database
GPG key ID: 5E28A33B0B84F577

View file

@ -270,19 +270,25 @@ (define* (progress-reporter/bar total
tasks is performed. Write PREFIX at the beginning of the line."
(define done 0)
(define (draw-bar)
(let* ((ratio (* 100. (/ done total))))
(erase-current-line port)
(if (string-null? prefix)
(display (progress-bar ratio (current-terminal-columns)) port)
(let ((width (- (current-terminal-columns)
(string-length prefix) 3)))
(display prefix port)
(display " " port)
(display (progress-bar ratio width) port)))
(force-output port)))
(define draw-bar/rate-limited
(rate-limited draw-bar %progress-interval))
(define (report-progress)
(set! done (+ 1 done))
(unless (> done total)
(let* ((ratio (* 100. (/ done total))))
(erase-current-line port)
(if (string-null? prefix)
(display (progress-bar ratio (current-terminal-columns)) port)
(let ((width (- (current-terminal-columns)
(string-length prefix) 3)))
(display prefix port)
(display " " port)
(display (progress-bar ratio width) port)))
(force-output port))))
(draw-bar/rate-limited)))
(progress-reporter
(start (lambda ()