changeset 47:5bec7a5d894a

Allow internal output redirection: print() always to explicitely given file objects
author Franz Glasner <fzglas.hg@dom66.de>
date Wed, 19 Jan 2022 09:14:34 +0100
parents dc198b661149
children 7a3bb86e2d15
files shasum.py
diffstat 1 files changed, 14 insertions(+), 9 deletions(-) [+]
line wrap: on
line diff
--- a/shasum.py	Wed Jan 19 01:04:36 2022 +0100
+++ b/shasum.py	Wed Jan 19 09:14:34 2022 +0100
@@ -97,11 +97,13 @@
     if not opts.algorithm:
         opts.algorithm = argv2algo("1")
 
+    opts.dest = None
+
     return shasum(opts)
 
 
 def gen_opts(files=[], algorithm="SHA1", bsd=False, text_mode=False,
-             checklist=False, check=False):
+             checklist=False, check=False, dest=None):
     if text_mode:
         raise ValueError("text mode not supported")
     if checklist and check:
@@ -112,7 +114,8 @@
                               bsd=bsd,
                               checklist=checklist,
                               check=check,
-                              text_mode=False)
+                              text_mode=False,
+                              dest=dest)
     return opts
 
 
@@ -145,7 +148,7 @@
             True)
     else:
         for fn in opts.files:
-            out(sys.stdout,
+            out(opts.dest or sys.stdout,
                 compute_digest_file(opts.algorithm[0], fn),
                 fn,
                 opts.algorithm[1],
@@ -154,6 +157,7 @@
 
 
 def verify_digests_with_checklist(opts):
+    dest = opts.dest or sys.stdout
     exit_code = 0
     if not opts.files or (len(opts.files) == 1 and opts.files[0] == '-'):
         if PY2:
@@ -166,7 +170,7 @@
         pl = get_parsed_digest_line_from_checklist(opts.checklist, opts, None)
         if pl is None:
             exit_code = 1
-            print("-: MISSING")
+            print("-: MISSING", file=dest)
         else:
             tag, algo, cl_filename, cl_digest = pl
             computed_digest = compute_digest_stream(algo, source)
@@ -175,12 +179,12 @@
             else:
                 res = "FAILED"
                 exit_code = 1
-            print("{}: {}: {}".format(tag, "-", res))
+            print("{}: {}: {}".format(tag, "-", res), file=dest)
     else:
         for fn in opts.files:
             pl = get_parsed_digest_line_from_checklist(opts.checklist, opts, fn)
             if pl is None:
-                print("{}: MISSING".format(fn))
+                print("{}: MISSING".format(fn), file=dest)
                 exit_code = 1
             else:
                 tag, algo, cl_filename, cl_digest = pl
@@ -190,18 +194,19 @@
                 else:
                     exit_code = 1
                     res = "FAILED"
-                print("{}: {}: {}".format(tag, fn, res))
+                print("{}: {}: {}".format(tag, fn, res), file=dest)
     return exit_code
 
 
 def verify_digests_from_files(opts):
+    dest = opts.dest or sys.stdout
     exit_code = 0
     if not opts.files or (len(opts.files) == 1 and opts.files[0] == '-'):
         for checkline in sys.stdin:
             if not checkline:
                 continue
             r, fn, tag = handle_checkline(opts, checkline)
-            print("{}: {}: {}".format(tag, fn, r.upper()))
+            print("{}: {}: {}".format(tag, fn, r.upper()), file=dest)
             if r != "ok" and exit_code == 0:
                 exit_code = 1
     else:
@@ -211,7 +216,7 @@
                     if not checkline:
                         continue
                     r, fn, tag = handle_checkline(opts, checkline)
-                    print("{}: {}: {}".format(tag, fn, r.upper()))
+                    print("{}: {}: {}".format(tag, fn, r.upper()), file=dest)
                     if r != "ok" and exit_code == 0:
                         exit_code = 1
     return exit_code