git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH v2 1/2] git-p4: print size values in appropriate units

From
Joel Holdsworth <jholdsworth@nvidia.com>
Date
Dec 17, 2021, 20:38 UTC
Message-ID
<20211217203856.2339161-2-jholdsworth@nvidia.com>
In-Reply-To
<20211217203856.2339161-1-jholdsworth@nvidia.com>

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@nvidia.com>
---
This second version of the patch makes the following changes:
  * Corrects an issue with the messages being suffixed with an spurious
    "MB" text.
  * Makes the units of format_size_human_readable hard-coded to bytes.
 git-p4.py | 22 +++++++++++++++++-----
 1 file changed, 17 insertions(+), 5 deletions(-)
diff --git a/git-p4.py b/git-p4.py
index 2b4500226a..4d8a249b85 100755
--- a/git-p4.py
+++ b/git-p4.py
@@ -56,6 +56,16 @@
 
 p4_access_checked = False
 
+def format_size_human_readable(num):
+    """ 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} {}B".format(num, unit)
+        num /= 1024.0
+    return "{:.1f} Yi{}B".format(num)
+
 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)\n' % (
+                file_path, relPath, format_size_human_readable(size)))
             sys.stdout.flush()
 
         (type_base, type_mods) = split_p4_type(file["type"])
@@ -3064,9 +3075,8 @@ def streamP4FilesCb(self, marshalled):
         if not err and 'fileSize' in self.stream_file:
             required_bytes = int((4 * int(self.stream_file["fileSize"])) - calcDiskFree())
             if required_bytes > 0:
-                err = 'Not enough space left on %s! Free at least %i MB.' % (
-                    os.getcwd(), required_bytes/1024/1024
-                )
+                err = 'Not enough space left on %s! Free at least %s.' % (
+                    os.getcwd(), format_size_human_readable(required_bytes))
 
         if err:
             f = None
@@ -3110,7 +3120,9 @@ def streamP4FilesCb(self, marshalled):
             size = int(self.stream_file["fileSize"])
             if size > 0:
                 progress = 100*self.stream_file['streamContentSize']/size
-                sys.stdout.write('\r%s %d%% (%i MB)' % (self.stream_file['depotFile'], progress, int(size/1024/1024)))
+                sys.stdout.write('\r%s %d%% (%s)' % (
+                    self.stream_file['depotFile'], progress,
+                    format_size_human_readable(required_bytes)))
                 sys.stdout.flush()
 
         self.stream_have_file_info = True
-- 
2.34.1
Previous: Joel HoldsworthNext: Joachim Kuebart
Message 2 of 7 in “git-p4: improve formatting of numeric values”
  1. 0/2 git-p4: improve formatting of numeric valuesJoel Holdsworth, Dec 17, 2021
  2. 1/2 git-p4: print size values in appropriate unitsJoel Holdsworth, Dec 17, 2021
  3. Joachim KuebartDec 18, 2021
  4. Luke DiamandDec 18, 2021
  5. 2/2 git-p4: show progress as an integerJoel Holdsworth, Dec 17, 2021
  6. Luke DiamandDec 18, 2021
  7. Junio C HamanoDec 20, 2021

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.