From ae9b9509a76e49cbf4fb254b2b75d566be6434a8 Mon Sep 17 00:00:00 2001 From: Joel Holdsworth Date: Sun, 19 Dec 2021 15:40:27 +0000 Subject: git-p4: print size values in appropriate units 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 Signed-off-by: Junio C Hamano --- git-p4.py | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) (limited to 'git-p4.py') diff --git a/git-p4.py b/git-p4.py index 2b4500226a..74834736fa 100755 --- a/git-p4.py +++ b/git-p4.py @@ -56,6 +56,18 @@ defaultBlockSize = 1<<20 p4_access_checked = False +def format_size_human_readable(num): + """ Returns a number of units (typically bytes) formatted as a human-readable + string. + """ + if num < 1024: + return '{:d} B'.format(num) + for unit in ["Ki", "Mi", "Gi", "Ti", "Pi", "Ei", "Zi"]: + num /= 1024.0 + if num < 1024.0: + return "{:3.1f} {}B".format(num, unit) + return "{:.1f} YiB".format(num) + def p4_build_cmd(cmd): """Build a suitable p4 command line. @@ -2966,7 +2978,8 @@ class P4Sync(Command, P4UserMap): 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 +3077,8 @@ class P4Sync(Command, P4UserMap): 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 +3122,9 @@ class P4Sync(Command, P4UserMap): 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(size))) sys.stdout.flush() self.stream_have_file_info = True -- cgit v1.2.1 From 0f829620e6f2ccc441aef1ffd6c0a546b949ee39 Mon Sep 17 00:00:00 2001 From: Joel Holdsworth Date: Sun, 19 Dec 2021 15:40:28 +0000 Subject: git-p4: show progress as an integer 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 Acked-by: Luke Diamand Signed-off-by: Junio C Hamano --- git-p4.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'git-p4.py') diff --git a/git-p4.py b/git-p4.py index 74834736fa..a625077b83 100755 --- a/git-p4.py +++ b/git-p4.py @@ -3637,7 +3637,8 @@ class P4Sync(Command, P4UserMap): 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 -- cgit v1.2.1