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