changeset 331:9ee84624587f

treesum: move the handling of base64 digest output into the writers completely
author Franz Glasner <fzglas.hg@dom66.de>
date Fri, 28 Mar 2025 15:16:12 +0100
parents 61cbae10103c
children 5b98810fe367
files cutils/treesum.py
diffstat 1 files changed, 17 insertions(+), 27 deletions(-) [+]
line wrap: on
line diff
--- a/cutils/treesum.py	Fri Mar 28 14:20:45 2025 +0100
+++ b/cutils/treesum.py	Fri Mar 28 15:16:12 2025 +0100
@@ -539,10 +539,10 @@
         raise NotImplementedError("`output_style'")
 
     with out_cm as outfp:
-        writer = writerstyle(outfp)
+        writer = writerstyle(outfp, use_base64=opts.base64)
         for d in opts.directories:
             V1DirectoryTreesumGenerator(
-                opts.algorithm, opts.mmap, opts.base64,
+                opts.algorithm, opts.mmap,
                 opts.follow_symlinks,
                 opts.generator,
                 opts.metadata_mode,
@@ -558,7 +558,7 @@
 
 class V1DirectoryTreesumGenerator(object):
 
-    def __init__(self, algorithm, use_mmap, use_base64,
+    def __init__(self, algorithm, use_mmap,
                  follow_symlinks,
                  with_generator,
                  with_metadata_mode, with_metadata_full_mode,
@@ -568,7 +568,6 @@
         super(V1DirectoryTreesumGenerator, self).__init__()
         self._algorithm = algorithm
         self._use_mmap = use_mmap
-        self._use_base64 = use_base64
         self._follow_symlinks = follow_symlinks
         self._with_generator = with_generator
         self._with_metadata_mode = with_metadata_mode
@@ -678,7 +677,6 @@
                     self._algorithm[1],
                     b"./@/",
                     dir_dgst.digest(),
-                    self._use_base64,
                     size=sz)
             self._writer.flush()
         else:
@@ -821,7 +819,6 @@
                                     collector.algorithm or "MD5",
                                     opath,
                                     None,
-                                    use_base64=self._use_base64,
                                     size=sz)
                                 return (errno.ESRCH, None, None, None)
                         # We got all required infos without errors
@@ -831,7 +828,7 @@
                         else:
                             self._writer.write_file_digest(
                                 collector.algorithm, opath, collector.digest,
-                                use_base64=self._use_base64, size=sz)
+                                size=sz)
                         return (0,
                                 collector.algorithm,
                                 collector.digest,
@@ -851,7 +848,7 @@
                         else:
                             self._writer.write_file_digest(
                                 self._algorithm[1], opath, None,
-                                use_base64=self._use_base64, size=None)
+                                size=None)
                         return (eno, None, None, None)
         #
         # No treesum file: just process normally with digesting
@@ -949,7 +946,6 @@
                             util.interpolate_bytes(
                                 b"%s/./@%s", opath, special_tag),
                             linkdgst.digest(),
-                            self._use_base64,
                             size=sz)
                 else:
                     #
@@ -990,7 +986,6 @@
                             util.interpolate_bytes(
                                 b"%s/./%s", opath, special_tag),
                             b"",
-                            self._use_base64,
                             size=sz)
             elif fso.is_dir:
                 assert fso.stat is not None        # because .is_dir is True
@@ -1031,8 +1026,7 @@
                         self._writer.write_file_digest(
                             self._algorithm[1],
                             util.interpolate_bytes(b"%s/./@/", opath),
-                            linkdgst.digest(),
-                            self._use_base64)
+                            linkdgst.digest())
                 else:
                     #
                     # Follow the symlink to dir or handle a "real" directory
@@ -1125,7 +1119,6 @@
                             self._algorithm[1],
                             util.interpolate_bytes(b"%s/./@", opath),
                             linkdgst.digest(),
-                            self._use_base64,
                             size=sz)
                 else:
                     #
@@ -1217,7 +1210,6 @@
                                       else None)
                                 self._writer.write_file_digest(
                                     self._algorithm[1], opath, dgst,
-                                    use_base64=self._use_base64,
                                     size=sz)
             self._writer.flush()
         opath = join_output_path(top, None)
@@ -1238,8 +1230,7 @@
         else:
             sz = dir_size if self._print_size else None
             self._writer.write_file_digest(
-                self._algorithm[1], opath, dir_dgst.digest(),
-                use_base64=self._use_base64, size=sz)
+                self._algorithm[1], opath, dir_dgst.digest(), size=sz)
         self._writer.flush()
         return (0, self._algorithm[1], dir_dgst.digest(), dir_size)
 
@@ -1296,8 +1287,9 @@
 
     LS = util.b(os.linesep)
 
-    def __init__(self, outfp):
+    def __init__(self, outfp, use_base64=False):
         self._outfp = outfp
+        self.use_base64 = use_base64
         self.reset_crc()
 
     @property
@@ -1336,13 +1328,13 @@
     """Writer to write treesum digest files in a format similar to BSD
     digest files.
 
-    Provides high-level methods to write data lines.
+    Provides high-level methods to write data lines and some very common
+    attributes that control some aspects of the output format.
 
     """
 
     def __init__(self, outfp, **kwds):
-        # IGNORE **kwds
-        super(TaggedTreesumWriter, self).__init__(outfp)
+        super(TaggedTreesumWriter, self).__init__(outfp, **kwds)
 
     def start(self, version):
         """Begin a new block, reset the current CRC and write the VERSION
@@ -1419,12 +1411,11 @@
         self.write(filename)
         self.writeln(b")")
 
-    def write_file_digest(self, algorithm, filename, digest,
-                          use_base64=False, size=None):
+    def write_file_digest(self, algorithm, filename, digest, size=None):
         assert isinstance(filename, bytes)
         if digest is not None:
             digest = (base64.b64encode(digest)
-                      if use_base64
+                      if self.use_base64
                       else binascii.hexlify(digest))
         self.write(util.b(algorithm))
         self.write(b" (")
@@ -1457,7 +1448,7 @@
     """
 
     def __init__(self, outfp, **kwds):
-        super(TabularTreesumWriter, self).__init__(outfp)
+        super(TabularTreesumWriter, self).__init__(outfp, **kwds)
 
     def start(self, version):
         """Begin a new block, reset the current CRC and write the VERSION
@@ -1525,12 +1516,11 @@
         self.write(b"ACCEPT-TREESUM\t")
         self.writeln(filename)
 
-    def write_file_digest(self, algorithm, filename, digest,
-                          use_base64=False, size=None):
+    def write_file_digest(self, algorithm, filename, digest, size=None):
         assert isinstance(filename, bytes)
         if digest is not None:
             digest = (base64.b64encode(digest)
-                      if use_base64
+                      if self.use_base64
                       else binascii.hexlify(digest))
         self.write(util.b(algorithm))
         self.write(b":")