From: Steve Sprang <steve.sprang@gmail.com>
To: guix-devel@gnu.org
Subject: [PATCH] build: Improve information density and appearance of download progress output.
Date: Sat, 5 Sep 2015 11:48:20 -0700 [thread overview]
Message-ID: <CA+xn8YCOfXeLLg6f7E+9mHAW0VBK9S5a5-eU-ov+exy1Eo7w+Q@mail.gmail.com> (raw)
[-- Attachment #1.1: Type: text/plain, Size: 621 bytes --]
This patch adds Arch/pacman style output when invoking 'guix download'.
Previous output:
$ guix download ftp://ftp.gnu.org/gnu/guile/guile-2.0.11.tar.gz
starting download of `/tmp/guix-file.IgqbP2' from `
ftp://ftp.gnu.org/gnu/guile/guile-2.0.11.tar.gz'...
ftp://ftp.gnu.org/.../guile-2.0.11.tar.gz 29.6% of 7339.9 KiB (781.
KiB/s)
Patched output:
$ guix download ftp://ftp.gnu.org/gnu/guile/guile-2.0.11.tar.gz
starting download of `/tmp/guix-file.ULgbny' from `
ftp://ftp.gnu.org/gnu/guile/guile-2.0.11.tar.gz'...
guile-2.0.11.tar.gz 7.2MiB 1.1MiB/s 00:00:02
[####### ] 36.6%
-Steve
[-- Attachment #1.2: Type: text/html, Size: 1087 bytes --]
[-- Attachment #2: progress-bar.patch --]
[-- Type: text/x-patch, Size: 6241 bytes --]
From 21f9829fab68e4660b19b651154f3c873b4d595e Mon Sep 17 00:00:00 2001
From: Steve Sprang <scs@stevesprang.com>
Date: Sat, 5 Sep 2015 11:32:39 -0700
Subject: [PATCH] build: Improve information density and appearance of download
progress output.
* guix/build/download.scm (seconds->string): New function.
(byte-count->string): New function.
(progress-bar): New function.
(throughput->string): Remove function.
(progress-proc): Display base file name, elapsed time, and progress bar.
---
guix/build/download.scm | 79 +++++++++++++++++++++++++++++++++++++------------
1 file changed, 60 insertions(+), 19 deletions(-)
diff --git a/guix/build/download.scm b/guix/build/download.scm
index ae59b01..e954963 100644
--- a/guix/build/download.scm
+++ b/guix/build/download.scm
@@ -1,6 +1,7 @@
;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2012, 2013, 2014, 2015 Ludovic Courtès <ludo@gnu.org>
;;; Copyright © 2015 Mark H Weaver <mhw@netris.org>
+;;; Copyright © 2015 Steve Sprang <scs@stevesprang.com>
;;;
;;; This file is part of GNU Guix.
;;;
@@ -54,17 +55,46 @@ object, as an inexact number."
(+ (time-second duration)
(/ (time-nanosecond duration) 1e9)))
-(define (throughput->string throughput)
- "Given THROUGHPUT, measured in bytes per second, return a string
-representing it in a human-readable way."
- (if (> throughput 3e6)
- (format #f "~,2f MiB/s" (/ throughput (expt 2. 20)))
- (format #f "~,0f KiB/s" (/ throughput 1024.0))))
+(define (seconds->string duration)
+ "Given DURATION in seconds, return a string representing it in 'hh:mm:ss'
+format."
+ (if (not (number? duration))
+ "00:00:00"
+ (let* ((total-seconds (inexact->exact (round duration)))
+ (extra-seconds (modulo total-seconds 3600))
+ (hours (quotient total-seconds 3600))
+ (mins (quotient extra-seconds 60))
+ (secs (modulo extra-seconds 60)))
+ (format #f "~2,'0d:~2,'0d:~2,'0d" hours mins secs))))
+
+(define (byte-count->string size)
+ "Given SIZE in bytes, return a string representing it in a human-readable
+way."
+ (let ((KiB 1024.)
+ (MiB (expt 1024. 2))
+ (GiB (expt 1024. 3))
+ (TiB (expt 1024. 4)))
+ (cond
+ ((< size KiB) (format #f "~dB" (inexact->exact size)))
+ ((< size MiB) (format #f "~dKiB" (inexact->exact (round (/ size KiB)))))
+ ((< size GiB) (format #f "~,1fMiB" (/ size MiB)))
+ ((< size TiB) (format #f "~,2fGiB" (/ size GiB)))
+ (else (format #f "~,3fTiB" (/ size TiB))))))
+
+(define* (progress-bar % #:optional (bar-width 20))
+ "Return % as a string representing an ASCII-art progress bar. The total
+width of the bar is BAR-WIDTH."
+ (let* ((fraction (/ % 100))
+ (filled (inexact->exact (floor (* fraction bar-width))))
+ (empty (- bar-width filled)))
+ (format #f "[~a~a]"
+ (make-string filled #\#)
+ (make-string empty #\space))))
(define* (progress-proc file size #:optional (log-port (current-output-port)))
- "Return a procedure to show the progress of FILE's download, which is
-SIZE byte long. The returned procedure is suitable for use as an
-argument to `dump-port'. The progress report is written to LOG-PORT."
+ "Return a procedure to show the progress of FILE's download, which is SIZE
+bytes long. The returned procedure is suitable for use as an argument to
+`dump-port'. The progress report is written to LOG-PORT."
;; XXX: Because of <http://bugs.gnu.org/19939> this procedure is often not
;; called as frequently as we'd like too; this is especially bad with Nginx
;; on hydra.gnu.org, which returns whole nars as a single chunk.
@@ -83,14 +113,24 @@ argument to `dump-port'. The progress report is written to LOG-PORT."
(if (number? size)
(lambda (transferred cont)
(with-elapsed-time elapsed
- (let ((% (* 100.0 (/ transferred size)))
- (throughput (if elapsed
- (/ transferred elapsed)
- 0)))
+ (let* ((% (* 100.0 (/ transferred size)))
+ (throughput (if elapsed
+ (/ transferred elapsed)
+ 0))
+ (left (format #f " ~a ~a"
+ (basename file)
+ (byte-count->string size)))
+ (right (format #f "~a/s ~a ~a~6,1f%"
+ (byte-count->string throughput)
+ (seconds->string elapsed)
+ (progress-bar %) %))
+ ;; TODO: Make this adapt to the actual terminal width.
+ (cols 90)
+ (num-spaces (max 1 (- cols (+ (string-length left)
+ (string-length right)))))
+ (gap (make-string num-spaces #\space)))
(display #\cr log-port)
- (format log-port "~a\t~5,1f% of ~,1f KiB (~a)"
- file % (/ size 1024.0)
- (throughput->string throughput))
+ (format log-port "~a~a~a" left gap right)
(flush-output-port log-port)
(cont))))
(lambda (transferred cont)
@@ -99,9 +139,10 @@ argument to `dump-port'. The progress report is written to LOG-PORT."
(/ transferred elapsed)
0)))
(display #\cr log-port)
- (format log-port "~a\t~6,1f KiB transferred (~a)"
- file (/ transferred 1024.0)
- (throughput->string throughput))
+ (format log-port "~a\t~a transferred (~a/s)"
+ file
+ (byte-count->string transferred)
+ (byte-count->string throughput))
(flush-output-port log-port)
(cont))))))))
--
2.5.0
next reply other threads:[~2015-09-05 18:48 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-09-05 18:48 Steve Sprang [this message]
2015-09-05 19:03 ` [PATCH] build: Improve information density and appearance of download progress output Thompson, David
2015-09-05 20:41 ` Taylan Ulrich Bayırlı/Kammer
2015-09-08 19:57 ` Ludovic Courtès
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=CA+xn8YCOfXeLLg6f7E+9mHAW0VBK9S5a5-eU-ov+exy1Eo7w+Q@mail.gmail.com \
--to=steve.sprang@gmail.com \
--cc=guix-devel@gnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this external index
https://git.savannah.gnu.org/cgit/guix.git
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.