comparison cutils/treesum.py @ 338:e163e6754071

treesum: when printing an empty size on purpose do not provide an empty octet string but use -1 as size argument
author Franz Glasner <fzglas.hg@dom66.de>
date Mon, 31 Mar 2025 14:09:56 +0200
parents e89eb63fc319
children 9c7a03199092
comparison
equal deleted inserted replaced
337:e89eb63fc319 338:e163e6754071
693 util.interpolate_bytes( 693 util.interpolate_bytes(
694 b"%d:%s,%d:%s,", 694 b"%d:%s,%d:%s,",
695 len(self._algorithm[1]), util.b(self._algorithm[1]), 695 len(self._algorithm[1]), util.b(self._algorithm[1]),
696 len(linkdgst.digest()), linkdgst.digest())) 696 len(linkdgst.digest()), linkdgst.digest()))
697 if self._size_only: 697 if self._size_only:
698 self._writer.write_size(b"./@/", "") 698 self._writer.write_size(b"./@/", -1)
699 else: 699 else:
700 sz = "" if self._print_size else None 700 sz = -1 if self._print_size else None
701 self._writer.write_file_digest( 701 self._writer.write_file_digest(
702 self._algorithm[1], 702 self._algorithm[1],
703 b"./@/", 703 b"./@/",
704 dir_dgst.digest(), 704 dir_dgst.digest(),
705 sz) 705 sz)
822 self._writer.write_error(util.b( 822 self._writer.write_error(util.b(
823 util.interpolate_bytes( 823 util.interpolate_bytes(
824 b"No size in treesum-file `%s'", 824 b"No size in treesum-file `%s'",
825 fpath), 825 fpath),
826 "utf-8")) 826 "utf-8"))
827 sz = "" 827 sz = -1
828 else: 828 else:
829 sz = collector.size 829 sz = collector.size
830 else: 830 else:
831 sz = None 831 sz = None
832 if collector.digest is None: 832 if collector.digest is None:
961 # 961 #
962 if self._size_only: 962 if self._size_only:
963 self._writer.write_size( 963 self._writer.write_size(
964 util.interpolate_bytes( 964 util.interpolate_bytes(
965 b"%s/./@%s", opath, special_tag), 965 b"%s/./@%s", opath, special_tag),
966 "") 966 -1)
967 else: 967 else:
968 sz = "" if self._print_size else None 968 sz = -1 if self._print_size else None
969 self._writer.write_file_digest( 969 self._writer.write_file_digest(
970 self._algorithm[1], 970 self._algorithm[1],
971 util.interpolate_bytes( 971 util.interpolate_bytes(
972 b"%s/./@%s", opath, special_tag), 972 b"%s/./@%s", opath, special_tag),
973 linkdgst.digest(), 973 linkdgst.digest(),
1001 b"4:mode,%d:%s,", len(modestr), modestr)) 1001 b"4:mode,%d:%s,", len(modestr), modestr))
1002 if self._size_only: 1002 if self._size_only:
1003 self._writer.write_size( 1003 self._writer.write_size(
1004 util.interpolate_bytes( 1004 util.interpolate_bytes(
1005 b"%s/./%s", opath, special_tag), 1005 b"%s/./%s", opath, special_tag),
1006 "") 1006 -1)
1007 else: 1007 else:
1008 sz = "" if self._print_size else None 1008 sz = -1 if self._print_size else None
1009 self._writer.write_file_digest( 1009 self._writer.write_file_digest(
1010 self._algorithm[1], 1010 self._algorithm[1],
1011 util.interpolate_bytes( 1011 util.interpolate_bytes(
1012 b"%s/./%s", opath, special_tag), 1012 b"%s/./%s", opath, special_tag),
1013 b"", 1013 b"",
1043 len(self._algorithm[1]), util.b(self._algorithm[1]), 1043 len(self._algorithm[1]), util.b(self._algorithm[1]),
1044 len(linkdgst.digest()), linkdgst.digest())) 1044 len(linkdgst.digest()), linkdgst.digest()))
1045 if self._size_only: 1045 if self._size_only:
1046 self._writer.write_size( 1046 self._writer.write_size(
1047 util.interpolate_bytes(b"%s/./@/", opath), 1047 util.interpolate_bytes(b"%s/./@/", opath),
1048 "") 1048 -1)
1049 else: 1049 else:
1050 sz = "" if self._print_size else None 1050 sz = -1 if self._print_size else None
1051 self._writer.write_file_digest( 1051 self._writer.write_file_digest(
1052 self._algorithm[1], 1052 self._algorithm[1],
1053 util.interpolate_bytes(b"%s/./@/", opath), 1053 util.interpolate_bytes(b"%s/./@/", opath),
1054 linkdgst.digest(), 1054 linkdgst.digest(),
1055 sz) 1055 sz)
1136 len(self._algorithm[1]), util.b(self._algorithm[1]), 1136 len(self._algorithm[1]), util.b(self._algorithm[1]),
1137 len(linkdgst.digest()), linkdgst.digest())) 1137 len(linkdgst.digest()), linkdgst.digest()))
1138 if self._size_only: 1138 if self._size_only:
1139 self._writer.write_size( 1139 self._writer.write_size(
1140 util.interpolate_bytes(b"%s/./@", opath), 1140 util.interpolate_bytes(b"%s/./@", opath),
1141 "") 1141 -1)
1142 else: 1142 else:
1143 sz = "" if self._print_size else None 1143 sz = -1 if self._print_size else None
1144 self._writer.write_file_digest( 1144 self._writer.write_file_digest(
1145 self._algorithm[1], 1145 self._algorithm[1],
1146 util.interpolate_bytes(b"%s/./@", opath), 1146 util.interpolate_bytes(b"%s/./@", opath),
1147 linkdgst.digest(), 1147 linkdgst.digest(),
1148 sz) 1148 sz)
1339 """ 1339 """
1340 1340
1341 If `sz` is `None` then this is signals an error because a size is 1341 If `sz` is `None` then this is signals an error because a size is
1342 required. 1342 required.
1343 1343
1344 If the size should not be printed on purpose the `size` should be
1345 as negative number.
1346
1344 """ 1347 """
1345 raise NotImplementedError("write_size") 1348 raise NotImplementedError("write_size")
1346 1349
1347 def write_file_digest(self, algorithm, filename, digest, size): 1350 def write_file_digest(self, algorithm, filename, digest, size):
1348 """ 1351 """
1349 1352
1350 If `size` is `None` and the output of a size is required then this 1353 If `size` is `None` and the output of a size is required then this
1351 is an error signal. 1354 is an error signal.
1355
1356 If the size should not be printed on purpose the `size` should be
1357 as negative number.
1358
1359 If `digest` is `None` is an error signal.
1352 1360
1353 """ 1361 """
1354 raise NotImplementedError("write_file_digest") 1362 raise NotImplementedError("write_file_digest")
1355 1363
1356 @property 1364 @property
1465 self.write(b"SIZE (") 1473 self.write(b"SIZE (")
1466 self.write(filename) 1474 self.write(filename)
1467 self.write(b")") 1475 self.write(b")")
1468 if sz is not None: 1476 if sz is not None:
1469 self.write(b" = ") 1477 self.write(b" = ")
1470 self.write(util.b(str(sz))) 1478 self.write(b"" if sz < 0 else util.b(str(sz)))
1471 self.writeln(b"") 1479 self.writeln(b"")
1472 1480
1473 def write_accept_treesum_file(self, filename): 1481 def write_accept_treesum_file(self, filename):
1474 assert isinstance(filename, bytes) 1482 assert isinstance(filename, bytes)
1475 self.write(b"ACCEPT-TREESUM (") 1483 self.write(b"ACCEPT-TREESUM (")
1490 self.write(b" = ") 1498 self.write(b" = ")
1491 if digest is not None: 1499 if digest is not None:
1492 self.write(digest) 1500 self.write(digest)
1493 if size is not None: 1501 if size is not None:
1494 self.write(b",") 1502 self.write(b",")
1495 self.write(util.b(str(size))) 1503 self.write(b"" if size < 0 else util.b(str(size)))
1496 self.writeln(b"") 1504 self.writeln(b"")
1497 1505
1498 def finish(self): 1506 def finish(self):
1499 """Finish a block and write the current CRC""" 1507 """Finish a block and write the current CRC"""
1500 crc = self.crc.hexdigest() 1508 crc = self.crc.hexdigest()
1573 self.writeln(root) 1581 self.writeln(root)
1574 1582
1575 def write_size(self, filename, sz): 1583 def write_size(self, filename, sz):
1576 assert isinstance(filename, bytes) 1584 assert isinstance(filename, bytes)
1577 if sz is not None: 1585 if sz is not None:
1578 self.write(util.b(str(sz))) 1586 if sz >= 0:
1587 self.write(util.b(str(sz)))
1588 else:
1589 self.write(b"?????")
1579 self.write(b"\t") 1590 self.write(b"\t")
1580 self.writeln(filename) 1591 self.writeln(filename)
1581 1592
1582 def write_accept_treesum_file(self, filename): 1593 def write_accept_treesum_file(self, filename):
1583 assert isinstance(filename, bytes) 1594 assert isinstance(filename, bytes)
1592 else binascii.hexlify(digest)) 1603 else binascii.hexlify(digest))
1593 self.write(util.b(algorithm)) 1604 self.write(util.b(algorithm))
1594 self.write(b":") 1605 self.write(b":")
1595 if digest is not None: 1606 if digest is not None:
1596 self.write(digest) 1607 self.write(digest)
1608 else:
1609 self.write(b"?????")
1597 self.write(b"\t") 1610 self.write(b"\t")
1598 if size is not None: 1611 if size is not None:
1599 self.write(util.b(str(size))) 1612 if size >= 0:
1613 self.write(util.b(str(size)))
1614 else:
1615 self.write(b"?????")
1600 self.write(b"\t") 1616 self.write(b"\t")
1601 self.writeln(filename) 1617 self.writeln(filename)
1602 1618
1603 def finish(self): 1619 def finish(self):
1604 """Finish a block and write the current CRC""" 1620 """Finish a block and write the current CRC"""