Mercurial > hgrepos > Python > apps > py-cutils
diff cutils/treesum.py @ 173:e081b6ee5570
treesum.py now runs on Python3.4 also: use a workaround for its missing byte % formatting.
No extra module is required for it to run using sha SHA and SHA-2 family of
digests.
| author | Franz Glasner <fzglas.hg@dom66.de> |
|---|---|
| date | Fri, 10 Jan 2025 12:46:44 +0100 |
| parents | 804a823c63f5 |
| children | fc1055878775 |
line wrap: on
line diff
--- a/cutils/treesum.py Fri Jan 10 11:38:31 2025 +0100 +++ b/cutils/treesum.py Fri Jan 10 12:46:44 2025 +0100 @@ -341,11 +341,13 @@ if not handle_root_logical and os.path.islink(root): linktgt = util.fsencode(os.readlink(root)) linkdgst = algorithm[0]() - linkdgst.update(b"%d:%s," % (len(linktgt), linktgt)) + linkdgst.update( + util.interpolate_bytes(b"%d:%s,", len(linktgt), linktgt)) dir_dgst = algorithm[0]() dir_dgst.update(b"1:L,") dir_dgst.update( - b"%d:%s," % (len(linkdgst.digest()), linkdgst.digest())) + util.interpolate_bytes( + b"%d:%s,", len(linkdgst.digest()), linkdgst.digest())) if size_only: outfp.write( format_bsd_line( @@ -375,13 +377,15 @@ if fso.is_symlink and not follow_directory_symlinks: linktgt = util.fsencode(os.readlink(fso.path)) linkdgst = algorithm[0]() - linkdgst.update(b"%d:%s," % (len(linktgt), linktgt)) - dir_dgst.update(b"1:S,%d:%s," - % (len(fso.fsname), fso.fsname)) + linkdgst.update( + util.interpolate_bytes( + b"%d:%s,", len(linktgt), linktgt)) + dir_dgst.update(util.interpolate_bytes( + b"1:S,%d:%s,", len(fso.fsname), fso.fsname)) # no mtime and no mode for symlinks - dir_dgst.update( - b"%d:%s," - % (len(linkdgst.digest()), linkdgst.digest())) + dir_dgst.update(util.interpolate_bytes( + b"%d:%s,", + len(linkdgst.digest()), linkdgst.digest())) opath = "/".join(top) + "/" + fso.name if top else fso.name if size_only: outfp.write( @@ -403,21 +407,25 @@ # fetch from dir_digests dgst, dsz = dir_digests[top + (fso.name,)] dir_size += dsz - dir_dgst.update(b"1:d,%d:%s," % (len(fso.fsname), fso.fsname)) - dir_dgst.update(b"%d:%s," % (len(dgst), dgst)) + dir_dgst.update(util.interpolate_bytes( + b"1:d,%d:%s,", len(fso.fsname), fso.fsname)) + dir_dgst.update(util.interpolate_bytes( + b"%d:%s,", len(dgst), dgst)) if with_metadata_full_mode: modestr = normalized_mode_str(fso.stat.st_mode) if not isinstance(modestr, bytes): modestr = modestr.encode("ascii") - dir_dgst.update(b"8:fullmode,%d:%s," - % (len(modestr), modestr)) + dir_dgst.update(util.interpolate_bytes( + b"8:fullmode,%d:%s,", len(modestr), modestr)) elif with_metadata_mode: modestr = normalized_compatible_mode_str(fso.stat.st_mode) if not isinstance(modestr, bytes): modestr = modestr.encode("ascii") - dir_dgst.update(b"4:mode,%d:%s," % (len(modestr), modestr)) + dir_dgst.update(util.interpolate_bytes( + b"4:mode,%d:%s,", len(modestr), modestr)) else: - dir_dgst.update(b"1:f,%d:%s," % (len(fso.fsname), fso.fsname)) + dir_dgst.update(util.interpolate_bytes( + b"1:f,%d:%s,", len(fso.fsname), fso.fsname)) dir_size += fso.stat.st_size if with_metadata_mtime: mtime = datetime.datetime.utcfromtimestamp( @@ -425,22 +433,25 @@ mtime = mtime.isoformat("T") + "Z" if not isinstance(mtime, bytes): mtime = mtime.encode("ascii") - dir_dgst.update(b"5:mtime,%d:%s," % (len(mtime), mtime)) + dir_dgst.update(util.interpolate_bytes( + b"5:mtime,%d:%s,", len(mtime), mtime)) if with_metadata_full_mode: modestr = normalized_mode_str(fso.stat.st_mode) if not isinstance(modestr, bytes): modestr = modestr.encode("ascii") - dir_dgst.update(b"8:fullmode,%d:%s," - % (len(modestr), modestr)) + dir_dgst.update(util.interpolate_bytes( + b"8:fullmode,%d:%s,", len(modestr), modestr)) elif with_metadata_mode: modestr = normalized_compatible_mode_str(fso.stat.st_mode) if not isinstance(modestr, bytes): modestr = modestr.encode("ascii") - dir_dgst.update(b"4:mode,%d:%s," % (len(modestr), modestr)) + dir_dgst.update(util.interpolate_bytes( + b"4:mode,%d:%s,", len(modestr), modestr)) if not size_only: dgst = digest.compute_digest_file( algorithm[0], fso.path, use_mmap=use_mmap) - dir_dgst.update(b"%d:%s," % (len(dgst), dgst)) + dir_dgst.update(util.interpolate_bytes( + b"%d:%s,", len(dgst), dgst)) opath = "/".join(top) + "/" + fso.name if top else fso.name if size_only: outfp.write( @@ -496,23 +507,23 @@ what = what.encode("ascii") if what == b"TIMESTAMP": assert filename is None - return b"TIMESTAMP = %d%s" % (value, ls) + return util.interpolate_bytes(b"TIMESTAMP = %d%s", value, ls) if what in (b"ISOTIMESTAMP", b"FLAGS", b"VERSION"): assert filename is None if not isinstance(value, bytes): value = value.encode("ascii") - return b"%s = %s%s" % (what, value, ls) + return util.interpolate_bytes(b"%s = %s%s", what, value, ls) assert filename is not None if what == b"COMMENT": if not isinstance(filename, bytes): filename = filename.encode("utf-8") - return b"COMMENT (%s)%s" % (filename, ls) + return util.interpolate_bytes(b"COMMENT (%s)%s", filename, ls) if not isinstance(filename, bytes): filename = util.fsencode(filename) if what == b"SIZE": - return b"SIZE (%s) = %d%s" % (filename, size, ls) + return util.interpolate_bytes(b"SIZE (%s) = %d%s", filename, size, ls) if value is None: - return b"%s (%s)%s" % (what, filename, ls) + return util.interpolate_bytes(b"%s (%s)%s", what, filename, ls) if use_base64: value = base64.b64encode(value) else: @@ -520,9 +531,11 @@ if filename != b"./@": filename = util.normalize_filename(filename, True) if size is None: - return b"%s (%s) = %s%s" % (what, filename, value, ls) + return util.interpolate_bytes( + b"%s (%s) = %s%s", what, filename, value, ls) else: - return b"%s (%s) = %s,%d%s" % (what, filename, value, size, ls) + return util.interpolate_bytes( + b"%s (%s) = %s,%d%s", what, filename, value, size, ls) if __name__ == "__main__":
