# [PATCH 0/2] git-p4: improve formatting of numeric values

5 messages from 2021-12-17 to 2021-12-17. Participants: Joel Holdsworth, Andrew Oakley.
Thread: https://gitlist.dev/t/57108

## Joel Holdsworth, 2021-12-17 14:59

Subject: [PATCH 0/2] git-p4: improve formatting of numeric values
Message-ID: <20211217145949.2229886-1-jholdsworth@nvidia.com>
URL: https://gitlist.dev/e/20211217145949.2229886-1-jholdsworth%40nvidia.com

```
This patch-set contains patches designed to improvement the way in which
the git-p4 script reports files sizes and percentage values in an effort
to improve the readability of the logged messages.

Joel Holdsworth (2):
  git-p4: print size values in appropriate units
  git-p4: show progress as an integer

 git-p4.py | 25 +++++++++++++++++++------
 1 file changed, 19 insertions(+), 6 deletions(-)

-- 
2.34.1


```

## Joel Holdsworth, 2021-12-17 14:59

Subject: [PATCH 1/2] git-p4: print size values in appropriate units
Message-ID: <20211217145949.2229886-2-jholdsworth@nvidia.com>
URL: https://gitlist.dev/e/20211217145949.2229886-2-jholdsworth%40nvidia.com
In-Reply-To: <20211217145949.2229886-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>
---
 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)
+
 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()
 
         (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 MB.' % (
+                    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 MB)' % (
+                    self.stream_file['depotFile'], progress,
+                    format_size_human_readable(required_bytes)))
                 sys.stdout.flush()
 
         self.stream_have_file_info = True
-- 
2.34.1


```

## Joel Holdsworth, 2021-12-17 14:59

Subject: [PATCH 2/2] git-p4: show progress as an integer
Message-ID: <20211217145949.2229886-3-jholdsworth@nvidia.com>
URL: https://gitlist.dev/e/20211217145949.2229886-3-jholdsworth%40nvidia.com
In-Reply-To: <20211217145949.2229886-1-jholdsworth@nvidia.com>

```
When importing files from Perforce, git-p4 periodically logs the
progress of file transfers as a percentage. However, the value is
printed as a float with an excessive number of decimal places.

For example a typical update might contain the following message:

Importing revision 12345 (26.199617677553135%)

This patch simply rounds the value down to the nearest integer
percentage value, greatly improving readability.

Signed-off-by: Joel Holdsworth <jholdsworth@nvidia.com>
---
 git-p4.py | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/git-p4.py b/git-p4.py
index 8c1130cb8f..d1919c4e12 100755
--- a/git-p4.py
+++ b/git-p4.py
@@ -3635,7 +3635,8 @@ def importChanges(self, changes, origin_revision=0):
             self.updateOptionDict(description)
 
             if not self.silent:
-                sys.stdout.write("\rImporting revision %s (%s%%)" % (change, cnt * 100 / len(changes)))
+                sys.stdout.write("\rImporting revision %s (%d%%)" % (
+                    change, (cnt * 100) // len(changes)))
                 sys.stdout.flush()
             cnt = cnt + 1
 
-- 
2.34.1


```

## Andrew Oakley, 2021-12-17 16:56

Subject: Re: [PATCH 1/2] git-p4: print size values in appropriate units
Message-ID: <20211217165627.49e931d6@ado-tr.dyn.home.arpa>
URL: https://gitlist.dev/e/20211217165627.49e931d6%40ado-tr.dyn.home.arpa
In-Reply-To: <20211217145949.2229886-2-jholdsworth@nvidia.com>

```
On Fri, 17 Dec 2021 14:59:48 +0000
Joel Holdsworth <jholdsworth@nvidia.com> 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@nvidia.com>
> ---
>  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.

```

## Joel Holdsworth, 2021-12-17 20:39

Subject: RE: [PATCH 1/2] git-p4: print size values in appropriate units
Message-ID: <BN8PR12MB3361AD895447CF05A034D68BC8789@BN8PR12MB3361.namprd12.prod.outlook.com>
URL: https://gitlist.dev/e/BN8PR12MB3361AD895447CF05A034D68BC8789%40BN8PR12MB3361.namprd12.prod.outlook.com
In-Reply-To: <20211217165627.49e931d6@ado-tr.dyn.home.arpa>

```
> If it's always bytes, why keep the suffix separate?

> You've left the "MB" in.  The same thing happens elsewhere.

Both good points. I've resubmitted the patch set with the suggested amendments.

Joel

```
