Mercurial > hgrepos > Python > apps > py-cutils
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 |
