From c7c1b9222bf50edd78b02d377e85907a68ec2e25 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Antoine=20Beaupr=C3=A9?= Date: Tue, 20 Oct 2015 12:42:54 -0400 Subject: [PATCH] convert to more flexible size formatters those can now support both file sizes (in SI/decimal format, powers of 10) and memory sizes (in binary format, powers of 2) tests still fail because the result is always displayed as floats --- borg/helpers.py | 24 ++++++++++++++---------- borg/testsuite/helpers.py | 4 ++-- 2 files changed, 16 insertions(+), 12 deletions(-) diff --git a/borg/helpers.py b/borg/helpers.py index f6c042817..6a52ecfb9 100644 --- a/borg/helpers.py +++ b/borg/helpers.py @@ -460,16 +460,20 @@ def format_file_mode(mod): def format_file_size(v): """Format file size into a human friendly format """ - if abs(v) > 10**12: - return '%.2f TB' % (v / 10**12) - elif abs(v) > 10**9: - return '%.2f GB' % (v / 10**9) - elif abs(v) > 10**6: - return '%.2f MB' % (v / 10**6) - elif abs(v) > 10**3: - return '%.2f kB' % (v / 10**3) - else: - return '%d B' % v + return sizeof_fmt_decimal(v, suffix='B', sep=' ') + +def sizeof_fmt(num, suffix='B', units=None, power=None, sep=''): + for unit in units[:-1]: + if abs(round(num, 2)) < power: + return "%3.2f%s%s%s" % (num, sep, unit, suffix) + num /= float(power) + return "%.2f%s%s%s" % (num, sep, units[-1], suffix) + +def sizeof_fmt_iec(num, suffix='B', sep=''): + return sizeof_fmt(num, suffix=suffix, sep=sep, units=['','Ki','Mi','Gi','Ti','Pi','Ei','Zi', 'Yi'], power=1024) + +def sizeof_fmt_decimal(num, suffix='B', sep=''): + return sizeof_fmt(num, suffix=suffix, sep=sep, units=['','k','M','G','T','P','E','Z', 'Y'], power=1000) def format_archive(archive): diff --git a/borg/testsuite/helpers.py b/borg/testsuite/helpers.py index f0f079e72..ce3e060f1 100644 --- a/borg/testsuite/helpers.py +++ b/borg/testsuite/helpers.py @@ -450,7 +450,7 @@ def test_size(): 1: '1 B', 142: '142 B', 999: '999 B', - 1000: '1000 B', # XXX: fail + 1000: '1.00 kB', 1001: '1.00 kB', 1234: '1.23 kB', 10**6: '1.00 MB', @@ -459,7 +459,7 @@ def test_size(): 10**9+1: '1.00 GB', 10**9-1: '1.00 GB', 10**9-10*10**3: '999.99 MB', - 10**9-10*10**3+1: '1.00 GB', + 10**9-10*10**3+5*10**3: '1.00 GB', 10**12+1: '1.00 TB', 10**15+1: '1.00 PB', 10**18+1: '1.00 EB',