comparison cutils/treesum.py @ 382:dd0bc31064e4

treesum: Replace "DigestSizeCollector" by "TreesumInfo"
author Franz Glasner <fzglas.hg@dom66.de>
date Sat, 17 May 2025 13:32:39 +0200
parents ff4424a7a8cf
children ea73723be05e
comparison
equal deleted inserted replaced
381:ff4424a7a8cf 382:dd0bc31064e4
791 for fso in fsobjects: 791 for fso in fsobjects:
792 fpath = join_output_path(top, fso.name) 792 fpath = join_output_path(top, fso.name)
793 if self._fnmatcher.shall_accept_treesum(fpath): 793 if self._fnmatcher.shall_accept_treesum(fpath):
794 # Yes we have hit a treesum digest file 794 # Yes we have hit a treesum digest file
795 logging.debug("Accepting existing treesum from: %s", fpath) 795 logging.debug("Accepting existing treesum from: %s", fpath)
796 collector = DigestSizeCollector() 796 treesum_info = None
797 try: 797 try:
798 collector.collect_from_file(os.path.join(root, fpath)) 798 treesum_info = TreesumInfo.collect_last_from_file(
799 os.path.join(root, fpath))
799 except OSError as e: 800 except OSError as e:
800 eno = e.errno 801 eno = e.errno
801 emsg = e.strerror 802 emsg = e.strerror
802 except Exception as e: 803 except Exception as e:
803 # XXX FIXME: other EIO, EBADF, EFAULT 804 # XXX FIXME: other EIO, EBADF, EFAULT
816 # Now check whether the infos we got from it are 817 # Now check whether the infos we got from it are
817 # compatible with our current requirements 818 # compatible with our current requirements
818 # (digest, size). 819 # (digest, size).
819 # 820 #
820 if self._size_only: 821 if self._size_only:
821 if collector.size is None: 822 if treesum_info.size is None:
822 # 823 #
823 # This is a severe error here: just the size 824 # This is a severe error here: just the size
824 # is required, but we have not got one. 825 # is required, but we have not got one.
825 # 826 #
826 self._writer.write_error( 827 self._writer.write_error(
830 fso.npath, self._utf8_mode)) 831 fso.npath, self._utf8_mode))
831 self._writer.write_size(opath, None) 832 self._writer.write_size(opath, None)
832 return (errno.ESRCH, None, None, None) 833 return (errno.ESRCH, None, None, None)
833 else: 834 else:
834 if self._print_size: 835 if self._print_size:
835 if collector.size is None: 836 if treesum_info.size is None:
836 # 837 #
837 # XXX FIXME: Is this a **severe** error 838 # XXX FIXME: Is this a **severe** error
838 # here? Currently: no 839 # here? Currently: no
839 # 840 #
840 self._writer.write_error( 841 self._writer.write_error(
841 b"Missing size in treesum-file `%s'", 842 b"Missing size in treesum-file `%s'",
842 walk.WalkDirEntry.alt_bytes( 843 walk.WalkDirEntry.alt_bytes(
843 fso.npath, self._utf8_mode)) 844 fso.npath, self._utf8_mode))
844 sz = -1 845 sz = -1
845 else: 846 else:
846 sz = collector.size 847 sz = treesum_info.size
847 else: 848 else:
848 sz = None 849 sz = None
849 if collector.digest is None: 850 if treesum_info.digest is None:
850 # 851 #
851 # This is really a severe error. Most probably 852 # This is really a severe error. Most probably
852 # the treesum file was created with 853 # the treesum file was created with
853 # "--size-only" and contains no digest. 854 # "--size-only" and contains no digest.
854 # 855 #
856 b"Missing required digest in treesum-file" 857 b"Missing required digest in treesum-file"
857 b" `%s'", 858 b" `%s'",
858 walk.WalkDirEntry.alt_bytes( 859 walk.WalkDirEntry.alt_bytes(
859 fso.npath, self._utf8_mode)) 860 fso.npath, self._utf8_mode))
860 self._writer.write_file_digest( 861 self._writer.write_file_digest(
861 collector.algorithm or "MD5", 862 treesum_info.algorithm or "MD5",
862 opath, 863 opath,
863 None, 864 None,
864 sz) 865 sz)
865 return (errno.ESRCH, None, None, None) 866 return (errno.ESRCH, None, None, None)
866 # We got all required infos without errors 867 # We got all required infos without errors
867 self._writer.write_accept_treesum_file(fpath) 868 self._writer.write_accept_treesum_file(fpath)
868 if self._size_only: 869 if self._size_only:
869 self._writer.write_size(opath, collector.size) 870 self._writer.write_size(opath, treesum_info.size)
870 else: 871 else:
871 self._writer.write_file_digest( 872 self._writer.write_file_digest(
872 collector.algorithm, opath, collector.digest, 873 treesum_info.algorithm,
874 opath,
875 treesum_info.digest,
873 sz) 876 sz)
874 return (0, 877 return (0,
875 collector.algorithm, 878 treesum_info.algorithm,
876 collector.digest, 879 treesum_info.digest,
877 collector.size) 880 treesum_info.size)
878 else: 881 else:
879 # 882 #
880 # treesum file could not be read 883 # treesum file could not be read
881 # 884 #
882 self._writer.write_error( 885 self._writer.write_error(
2034 print(" ", err) 2037 print(" ", err)
2035 else: 2038 else:
2036 print(" Errors: <none>") 2039 print(" Errors: <none>")
2037 2040
2038 2041
2039 class DigestSizeCollector(object): 2042 class TreesumInfo(object):
2040 2043
2041 def __init__(self): 2044 def __init__(self):
2042 self._algorithm = self._digest = self._size = None 2045 self._algorithm = self._digest = self._size = None
2043 2046
2044 def __call__(self, block_no, tag, generator, fsencoding, flags, 2047 def __call__(self, block_no, tag, generator, fsencoding, flags,
2058 2061
2059 @property 2062 @property
2060 def size(self): 2063 def size(self):
2061 return self._size 2064 return self._size
2062 2065
2063 def collect_from_file(self, digest_file):
2064 get_infos_from_digestfile([digest_file], self, True)
2065
2066
2067 class TreesumInfo(object):
2068
2069 def __init__(self):
2070 self._algorithm = self._digest = self._size = None
2071
2072 def __call__(self, block_no, tag, generator, fsencoding, flags,
2073 fnmatch_filters, comments, errors,
2074 algorithm, digest, size):
2075 self._algorithm = algorithm
2076 self._digest = digest
2077 self._size = size
2078
2079 @property
2080 def algorithm(self):
2081 return self._algorithm
2082
2083 @property
2084 def digest(self):
2085 return self._digest
2086
2087 @property
2088 def size(self):
2089 return self._size
2090
2091 @classmethod 2066 @classmethod
2092 def collect_last_from_file(cls, digest_file): 2067 def collect_last_from_file(cls, digest_file):
2093 info = cls() 2068 info = cls()
2094 get_infos_from_digestfile([digest_file], info, True) 2069 get_infos_from_digestfile([digest_file], info, True)
2095 return info 2070 return info