git.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v2 0/2] git-p4: improve formatting of numeric values
@ 2021-12-17 20:38 Joel Holdsworth
  2021-12-17 20:38 ` [PATCH v2 1/2] git-p4: print size values in appropriate units Joel Holdsworth
  2021-12-17 20:38 ` [PATCH v2 2/2] git-p4: show progress as an integer Joel Holdsworth
  0 siblings, 2 replies; 7+ messages in thread
From: Joel Holdsworth @ 2021-12-17 20:38 UTC (permalink / raw)
  To: git
  Cc: Tzadik Vanderhoof, Dorgon Chang, Joachim Kuebart, Daniel Levin,
	Johannes Schindelin, Luke Diamand, Ben Keene, Andrew Oakley,
	Joel Holdsworth

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


^ permalink raw reply	[flat|nested] 7+ messages in thread

* [PATCH v2 1/2] git-p4: print size values in appropriate units
  2021-12-17 20:38 [PATCH v2 0/2] git-p4: improve formatting of numeric values Joel Holdsworth
@ 2021-12-17 20:38 ` Joel Holdsworth
  2021-12-18  7:44   ` Joachim Kuebart
  2021-12-17 20:38 ` [PATCH v2 2/2] git-p4: show progress as an integer Joel Holdsworth
  1 sibling, 1 reply; 7+ messages in thread
From: Joel Holdsworth @ 2021-12-17 20:38 UTC (permalink / raw)
  To: git
  Cc: Tzadik Vanderhoof, Dorgon Chang, Joachim Kuebart, Daniel Levin,
	Johannes Schindelin, Luke Diamand, Ben Keene, Andrew Oakley,
	Joel Holdsworth

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


^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [PATCH v2 2/2] git-p4: show progress as an integer
  2021-12-17 20:38 [PATCH v2 0/2] git-p4: improve formatting of numeric values Joel Holdsworth
  2021-12-17 20:38 ` [PATCH v2 1/2] git-p4: print size values in appropriate units Joel Holdsworth
@ 2021-12-17 20:38 ` Joel Holdsworth
  2021-12-18 10:12   ` Luke Diamand
  1 sibling, 1 reply; 7+ messages in thread
From: Joel Holdsworth @ 2021-12-17 20:38 UTC (permalink / raw)
  To: git
  Cc: Tzadik Vanderhoof, Dorgon Chang, Joachim Kuebart, Daniel Levin,
	Johannes Schindelin, Luke Diamand, Ben Keene, Andrew Oakley,
	Joel Holdsworth

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 4d8a249b85..3c621a6efd 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


^ permalink raw reply related	[flat|nested] 7+ messages in thread

* Re: [PATCH v2 1/2] git-p4: print size values in appropriate units
  2021-12-17 20:38 ` [PATCH v2 1/2] git-p4: print size values in appropriate units Joel Holdsworth
@ 2021-12-18  7:44   ` Joachim Kuebart
  2021-12-18 10:09     ` Luke Diamand
  0 siblings, 1 reply; 7+ messages in thread
From: Joachim Kuebart @ 2021-12-18  7:44 UTC (permalink / raw)
  To: Joel Holdsworth
  Cc: git, Tzadik Vanderhoof, Dorgon Chang, Daniel Levin,
	Johannes Schindelin, Luke Diamand, Ben Keene, Andrew Oakley



> On 17 Dec 2021, at 21:38, Joel Holdsworth <jholdsworth@nvidia.com> wrote:
> 
> 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)

This now has an extra pair of braces.

Cheers,
Joachim



^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH v2 1/2] git-p4: print size values in appropriate units
  2021-12-18  7:44   ` Joachim Kuebart
@ 2021-12-18 10:09     ` Luke Diamand
  0 siblings, 0 replies; 7+ messages in thread
From: Luke Diamand @ 2021-12-18 10:09 UTC (permalink / raw)
  To: Joachim Kuebart
  Cc: Joel Holdsworth, Git Users, Tzadik Vanderhoof, Dorgon Chang,
	Daniel Levin, Johannes Schindelin, Ben Keene, Andrew Oakley

On Sat, 18 Dec 2021 at 07:44, Joachim Kuebart <joachim.kuebart@gmail.com> wrote:
>
>
>
> > On 17 Dec 2021, at 21:38, Joel Holdsworth <jholdsworth@nvidia.com> wrote:
> >
> > 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)
>
> This now has an extra pair of braces.
>
> Cheers,
> Joachim

It also seems to add some slightly spurious floating point precision.
For example, 1<<20 comes out as "1.0 MiB" and 50 bytes comes out as
"50.0 B".

There's actually an older python2->python3 conversion bug going on here.

The code uses:

    Size / 1024 / 1024

With python2 that came out as an integer, which for bytes is what you want.
For python3 it comes out as a float - it should have been converted to
Size // 1024 // 1024.

I guess Joel was trying to preserve that original bug, but really we
should just fix it!

Overall I think this would definitely be an improvement, just needs to
drop the spurious precision (and fix the return for values beyond ZiB
as noted by Joachim).

Luke

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH v2 2/2] git-p4: show progress as an integer
  2021-12-17 20:38 ` [PATCH v2 2/2] git-p4: show progress as an integer Joel Holdsworth
@ 2021-12-18 10:12   ` Luke Diamand
  2021-12-20 20:02     ` Junio C Hamano
  0 siblings, 1 reply; 7+ messages in thread
From: Luke Diamand @ 2021-12-18 10:12 UTC (permalink / raw)
  To: Joel Holdsworth
  Cc: Git Users, Tzadik Vanderhoof, Dorgon Chang, Joachim Kuebart,
	Daniel Levin, Johannes Schindelin, Ben Keene, Andrew Oakley

On Fri, 17 Dec 2021 at 20:39, Joel Holdsworth <jholdsworth@nvidia.com> wrote:
>
> 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 4d8a249b85..3c621a6efd 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

Thanks for fixing this - this is one of those small python2->python3
bugs that's still left over.

Looks good to me, ack.

Luke

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH v2 2/2] git-p4: show progress as an integer
  2021-12-18 10:12   ` Luke Diamand
@ 2021-12-20 20:02     ` Junio C Hamano
  0 siblings, 0 replies; 7+ messages in thread
From: Junio C Hamano @ 2021-12-20 20:02 UTC (permalink / raw)
  To: Luke Diamand
  Cc: Joel Holdsworth, Git Users, Tzadik Vanderhoof, Dorgon Chang,
	Joachim Kuebart, Daniel Levin, Johannes Schindelin, Ben Keene,
	Andrew Oakley

Luke Diamand <luke@diamand.org> writes:

>> diff --git a/git-p4.py b/git-p4.py
>> index 4d8a249b85..3c621a6efd 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
>
> Thanks for fixing this - this is one of those small python2->python3
> bugs that's still left over.
>
> Looks good to me, ack.

Thanks.  I'll wait for an updated [1/2] but this is an independently
good change that does not depend on it, so I'll take [2/2] alone for
now.

^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2021-12-20 20:02 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-12-17 20:38 [PATCH v2 0/2] git-p4: improve formatting of numeric values Joel Holdsworth
2021-12-17 20:38 ` [PATCH v2 1/2] git-p4: print size values in appropriate units Joel Holdsworth
2021-12-18  7:44   ` Joachim Kuebart
2021-12-18 10:09     ` Luke Diamand
2021-12-17 20:38 ` [PATCH v2 2/2] git-p4: show progress as an integer Joel Holdsworth
2021-12-18 10:12   ` Luke Diamand
2021-12-20 20:02     ` Junio C Hamano

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).