On Fri, 17 Dec 2021 14:59:48 +0000 Joel Holdsworth <jholdsworth@xxxxxxxxxx> wrote: > The git-p4 script reports file sizes in various log messages. > Previously, in each case the script would print them as the number of > bytes divided by 1048576 i.e. the size in mebibytes, rounded down to > an integer. This resulted in small files being described as having a > size of "0 MB". > > This patch replaces the existing behaviour with a new helper function: > format_size_human_readable, which takes a number of bytes (or any > other quantity), and computes the appropriate prefix to use: none, > Ki, Mi, Gi, Ti, Pi, Ei, Zi, Yi. > > For example, a size of 123456 will now be printed as "120.6 KiB" > greatly improving the readability of the log output. > > Large valued prefixes such as pebi, exbi, zebi and yobi are included > for completeness, though they not expected to appear in any real-world > Perforce repository! > > Signed-off-by: Joel Holdsworth <jholdsworth@xxxxxxxxxx> > --- > git-p4.py | 22 +++++++++++++++++----- > 1 file changed, 17 insertions(+), 5 deletions(-) > > diff --git a/git-p4.py b/git-p4.py > index 2b4500226a..8c1130cb8f 100755 > --- a/git-p4.py > +++ b/git-p4.py > @@ -56,6 +56,16 @@ > > p4_access_checked = False > > +def format_size_human_readable(num, suffix="B"): > + """ Returns a number of units (typically bytes) formatted as a > human-readable > + string. > + """ > + for unit in ["", "Ki", "Mi", "Gi", "Ti", "Pi", "Ei", "Zi"]: > + if abs(num) < 1024.0: > + return "{:3.1f} {}{}".format(num, unit, suffix) > + num /= 1024.0 > + return "{:.1f} Yi{}".format(num, suffix) If it's always bytes, why keep the suffix separate? > + > def p4_build_cmd(cmd): > """Build a suitable p4 command line. > > @@ -2966,7 +2976,8 @@ def streamOneP4File(self, file, contents): > size = int(self.stream_file['fileSize']) > else: > size = 0 # deleted files don't get a fileSize > apparently > - sys.stdout.write('\r%s --> %s (%i MB)\n' % (file_path, > relPath, size/1024/1024)) > + sys.stdout.write('\r%s --> %s (%s MB)\n' % ( > + file_path, relPath, > format_size_human_readable(size))) sys.stdout.flush() You've left the "MB" in. The same thing happens elsewhere.