summary refs log tree commit diff
diff options
context:
space:
mode:
authorSteve Sprang <scs@stevesprang.com>2015-09-09 13:59:52 -0700
committerMark H Weaver <mhw@netris.org>2015-09-14 23:36:26 -0400
commiteb95ace9f191a7291e6daf9c4af8759237408696 (patch)
treecefc432ad10a85416a9607d43a8c64c0f5e35ba3
parentd89e0990f50a00cd4eddd781f31c7a801b0bc9c3 (diff)
downloadguix-eb95ace9f191a7291e6daf9c4af8759237408696.tar.gz
download: Avoid type errors when formatting download progress output.
* guix/build/download.scm (nearest-exact-integer): New procedure.
  (seconds->string, byte-count->string): Use it.
-rw-r--r--guix/build/download.scm11
1 files changed, 8 insertions, 3 deletions
diff --git a/guix/build/download.scm b/guix/build/download.scm
index 6e85174bc9..31d60fbcda 100644
--- a/guix/build/download.scm
+++ b/guix/build/download.scm
@@ -49,6 +49,11 @@
   ;; Size of the HTTP receive buffer.
   65536)
 
+(define (nearest-exact-integer x)
+  "Given a real number X, return the nearest exact integer, with ties going to
+the nearest exact even integer."
+  (inexact->exact (round x)))
+
 (define (duration->seconds duration)
   "Return the number of seconds represented by DURATION, a 'time-duration'
 object, as an inexact number."
@@ -60,7 +65,7 @@ object, as an inexact number."
 format."
   (if (not (number? duration))
       "00:00:00"
-      (let* ((total-seconds (inexact->exact (round duration)))
+      (let* ((total-seconds (nearest-exact-integer duration))
              (extra-seconds (modulo total-seconds 3600))
              (hours         (quotient total-seconds 3600))
              (mins          (quotient extra-seconds 60))
@@ -75,8 +80,8 @@ way."
         (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 KiB) (format #f "~dB"     (nearest-exact-integer size)))
+     ((< size MiB) (format #f "~dKiB"   (nearest-exact-integer (/ size KiB))))
      ((< size GiB) (format #f "~,1fMiB" (/ size MiB)))
      ((< size TiB) (format #f "~,2fGiB" (/ size GiB)))
      (else         (format #f "~,3fTiB" (/ size TiB))))))