diff 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
line wrap: on
line diff
--- a/shasum.py	Fri Dec 04 12:37:29 2020 +0100
+++ b/shasum.py	Fri Dec 04 13:14:47 2020 +0100
@@ -30,6 +30,9 @@
         "--binary", "-b", action="store_false", dest="text_mode", default=False,
         help="read in binary mode (default)")
     aparser.add_argument(
+        "--bsd", "-B", action="store_true",
+        help="write BSD style output")
+    aparser.add_argument(
         "--text", "-t", action="store_true", dest="text_mode", default=False,
         help="read in text mode (not yet supported)")
     aparser.add_argument(
@@ -40,9 +43,15 @@
     if opts.text_mode:
         print("ERROR: text mode not supported", file=sys.stderr)
         sys.exit(78)   # :manpage:`sysexits(3)` EX_CONFIG
+
+    if opts.bsd:
+        out = out_bsd
+    else:
+        out = out_std
+
     if not opts.files:
-        opts.files.append("-")
-    if len(opts.files) == 1 and opts.files[0] == "-":
+        opts.files.append('-')
+    if len(opts.files) == 1 and opts.files[0] == '-':
         if PY2:
             if sys.platform == "win32":
                 import os. msvcrt
@@ -50,11 +59,34 @@
             source = sys.stdin
         else:
             source = sys.stdin.buffer
-        print(compute_digest(hashlib.sha256, source))
+        out(sys.stdout,
+            compute_digest(hashlib.sha256, source),
+            None,
+            "SHA256",
+            True)
     else:
         for fn in opts.files:
             with open(fn, "rb") as source:
-                print(compute_digest(hashlib.sha256, source))
+                out(sys.stdout,
+                    compute_digest(hashlib.sha256, source),
+                    fn,
+                    "SHA256",
+                    True)
+
+
+def out_bsd(dest, digest, filename, digestname, binary):
+    if filename is None:
+        print(digest, file=dest)
+    else:
+        print("{} ({}) = {}".format(digestname, filename, digest),
+              file=dest)
+
+
+def out_std(dest, digest, filename, digestname, binary):
+    print("{} {}{}".format(digest,
+                           '*' if binary else ' ',
+                           '-' if filename is None else filename),
+          file=dest)
 
 
 def compute_digest(hashobj, instream):