Mercurial > hgrepos > Python > apps > py-cutils
comparison shasum.py @ 5:bbcb225640de
Handle standard and BSD-style output formats
| author | Franz Glasner <fzglas.hg@dom66.de> |
|---|---|
| date | Fri, 04 Dec 2020 13:14:47 +0100 |
| parents | 67d10529ce88 |
| children | a21e83c855cc |
comparison
equal
deleted
inserted
replaced
| 4:67d10529ce88 | 5:bbcb225640de |
|---|---|
| 28 fromfile_prefix_chars='@') | 28 fromfile_prefix_chars='@') |
| 29 aparser.add_argument( | 29 aparser.add_argument( |
| 30 "--binary", "-b", action="store_false", dest="text_mode", default=False, | 30 "--binary", "-b", action="store_false", dest="text_mode", default=False, |
| 31 help="read in binary mode (default)") | 31 help="read in binary mode (default)") |
| 32 aparser.add_argument( | 32 aparser.add_argument( |
| 33 "--bsd", "-B", action="store_true", | |
| 34 help="write BSD style output") | |
| 35 aparser.add_argument( | |
| 33 "--text", "-t", action="store_true", dest="text_mode", default=False, | 36 "--text", "-t", action="store_true", dest="text_mode", default=False, |
| 34 help="read in text mode (not yet supported)") | 37 help="read in text mode (not yet supported)") |
| 35 aparser.add_argument( | 38 aparser.add_argument( |
| 36 "files", nargs="*", metavar="FILE") | 39 "files", nargs="*", metavar="FILE") |
| 37 | 40 |
| 38 opts = aparser.parse_args(args=argv) | 41 opts = aparser.parse_args(args=argv) |
| 39 | 42 |
| 40 if opts.text_mode: | 43 if opts.text_mode: |
| 41 print("ERROR: text mode not supported", file=sys.stderr) | 44 print("ERROR: text mode not supported", file=sys.stderr) |
| 42 sys.exit(78) # :manpage:`sysexits(3)` EX_CONFIG | 45 sys.exit(78) # :manpage:`sysexits(3)` EX_CONFIG |
| 46 | |
| 47 if opts.bsd: | |
| 48 out = out_bsd | |
| 49 else: | |
| 50 out = out_std | |
| 51 | |
| 43 if not opts.files: | 52 if not opts.files: |
| 44 opts.files.append("-") | 53 opts.files.append('-') |
| 45 if len(opts.files) == 1 and opts.files[0] == "-": | 54 if len(opts.files) == 1 and opts.files[0] == '-': |
| 46 if PY2: | 55 if PY2: |
| 47 if sys.platform == "win32": | 56 if sys.platform == "win32": |
| 48 import os. msvcrt | 57 import os. msvcrt |
| 49 msvcrt.setmode(sys.stdin.fileno(), os.O_BINARY) | 58 msvcrt.setmode(sys.stdin.fileno(), os.O_BINARY) |
| 50 source = sys.stdin | 59 source = sys.stdin |
| 51 else: | 60 else: |
| 52 source = sys.stdin.buffer | 61 source = sys.stdin.buffer |
| 53 print(compute_digest(hashlib.sha256, source)) | 62 out(sys.stdout, |
| 63 compute_digest(hashlib.sha256, source), | |
| 64 None, | |
| 65 "SHA256", | |
| 66 True) | |
| 54 else: | 67 else: |
| 55 for fn in opts.files: | 68 for fn in opts.files: |
| 56 with open(fn, "rb") as source: | 69 with open(fn, "rb") as source: |
| 57 print(compute_digest(hashlib.sha256, source)) | 70 out(sys.stdout, |
| 71 compute_digest(hashlib.sha256, source), | |
| 72 fn, | |
| 73 "SHA256", | |
| 74 True) | |
| 75 | |
| 76 | |
| 77 def out_bsd(dest, digest, filename, digestname, binary): | |
| 78 if filename is None: | |
| 79 print(digest, file=dest) | |
| 80 else: | |
| 81 print("{} ({}) = {}".format(digestname, filename, digest), | |
| 82 file=dest) | |
| 83 | |
| 84 | |
| 85 def out_std(dest, digest, filename, digestname, binary): | |
| 86 print("{} {}{}".format(digest, | |
| 87 '*' if binary else ' ', | |
| 88 '-' if filename is None else filename), | |
| 89 file=dest) | |
| 58 | 90 |
| 59 | 91 |
| 60 def compute_digest(hashobj, instream): | 92 def compute_digest(hashobj, instream): |
| 61 """ | 93 """ |
| 62 | 94 |
