diff --git a/scripts/readmdir.py b/scripts/readmdir.py index 1730f02..ef634a9 100755 --- a/scripts/readmdir.py +++ b/scripts/readmdir.py @@ -2,6 +2,7 @@ import struct import binascii +import sys import itertools as it TAG_TYPES = { @@ -271,37 +272,39 @@ class MetadataPair: raise KeyError(gmask, gtag) - def _dump_tags(self, tags, truncate=True): - sys.stdout.write("%-8s %-8s %-13s %4s %4s %s\n" % ( - 'off', 'tag', 'type', 'id', 'len', - 'data (truncated)' if truncate else 12*' '+'data')) + def _dump_tags(self, tags, f=sys.stdout, truncate=True): + f.write("%-8s %-8s %-13s %4s %4s" % ( + 'off', 'tag', 'type', 'id', 'len')) + if truncate: + f.write(' data (truncated)') + f.write('\n') for tag in tags: - sys.stdout.write("%08x: %08x %-13s %4s %4s" % ( + f.write("%08x: %08x %-13s %4s %4s" % ( tag.off, tag, tag.typerepr(), tag.idrepr(), tag.sizerepr())) if truncate: - sys.stdout.write(" %-23s %-8s\n" % ( + f.write(" %-23s %-8s\n" % ( ' '.join('%02x' % c for c in tag.data[:8]), ''.join(c if c >= ' ' and c <= '~' else '.' for c in map(chr, tag.data[:8])))) else: - sys.stdout.write("\n") + f.write("\n") for i in range(0, len(tag.data), 16): - sys.stdout.write("%08x: %-47s %-16s\n" % ( + f.write(" %08x: %-47s %-16s\n" % ( tag.off+i, ' '.join('%02x' % c for c in tag.data[i:i+16]), ''.join(c if c >= ' ' and c <= '~' else '.' for c in map(chr, tag.data[i:i+16])))) - def dump_tags(self, truncate=True): - self._dump_tags(self.tags, truncate=truncate) + def dump_tags(self, f=sys.stdout, truncate=True): + self._dump_tags(self.tags, f=f, truncate=truncate) - def dump_log(self, truncate=True): - self._dump_tags(self.log, truncate=truncate) + def dump_log(self, f=sys.stdout, truncate=True): + self._dump_tags(self.log, f=f, truncate=truncate) - def dump_all(self, truncate=True): - self._dump_tags(self.all_, truncate=truncate) + def dump_all(self, f=sys.stdout, truncate=True): + self._dump_tags(self.all_, f=f, truncate=truncate) def main(args): blocks = [] @@ -337,10 +340,10 @@ if __name__ == "__main__": help="First block address for finding the metadata pair.") parser.add_argument('block2', nargs='?', type=lambda x: int(x, 0), help="Second block address for finding the metadata pair.") - parser.add_argument('-a', '--all', action='store_true', - help="Show all tags in log, included tags in corrupted commits.") parser.add_argument('-l', '--log', action='store_true', help="Show tags in log.") + parser.add_argument('-a', '--all', action='store_true', + help="Show all tags in log, included tags in corrupted commits.") parser.add_argument('-T', '--no-truncate', action='store_true', - help="Don't truncate large amounts of data in tags.") + help="Don't truncate large amounts of data.") sys.exit(main(parser.parse_args())) diff --git a/scripts/readtree.py b/scripts/readtree.py index ecfdab9..ea8cb5f 100755 --- a/scripts/readtree.py +++ b/scripts/readtree.py @@ -13,45 +13,6 @@ def popc(x): def ctz(x): return len(bin(x)) - len(bin(x).rstrip('0')) -def dumptags(args, mdir, f): - if args.all: - tags = mdir.all_ - elif args.log: - tags = mdir.log - else: - tags = mdir.tags - - for k, tag in enumerate(tags): - f.write("tag %08x %s" % (tag, tag.typerepr())) - if tag.id != 0x3ff: - f.write(" id %d" % tag.id) - if tag.size != 0x3ff: - f.write(" size %d" % tag.size) - if tag.is_('name'): - f.write(" name %s" % - json.dumps(tag.data.decode('utf8'))) - if tag.is_('dirstruct'): - f.write(" dir {%#x, %#x}" % struct.unpack( - '= ' ' and c <= '~' else '.' - for c in map(chr, tag.data[i:i+16])))) - def dumpentries(args, mdir, f): for k, id_ in enumerate(mdir.ids): name = mdir[Tag('name', id_, 0)] @@ -72,8 +33,8 @@ def dumpentries(args, mdir, f): if args.data and struct_.is_('inlinestruct'): for i in range(0, len(struct_.data), 16): - f.write(" %-47s %-16s\n" % ( - ' '.join('%02x' % c for c in struct_.data[i:i+16]), + f.write(" %08x: %-47s %-16s\n" % ( + i, ' '.join('%02x' % c for c in struct_.data[i:i+16]), ''.join(c if c >= ' ' and c <= '~' else '.' for c in map(chr, struct_.data[i:i+16])))) elif args.data and struct_.is_('ctzstruct'): @@ -95,8 +56,8 @@ def dumpentries(args, mdir, f): it.chain.from_iterable(reversed(data)), size)) for i in range(0, min(len(data), 256) if not args.no_truncate else len(data), 16): - f.write(" %-47s %-16s\n" % ( - ' '.join('%02x' % c for c in data[i:i+16]), + f.write(" %08x: %-47s %-16s\n" % ( + i, ' '.join('%02x' % c for c in data[i:i+16]), ''.join(c if c >= ' ' and c <= '~' else '.' for c in map(chr, data[i:i+16])))) @@ -239,8 +200,12 @@ def main(args): ' (corrupted)' if not mdir else '')) f = io.StringIO() - if args.tags or args.all or args.log: - dumptags(args, mdir, f) + if args.tags: + mdir.dump_tags(f, truncate=not args.no_truncate) + elif args.log: + mdir.dump_log(f, truncate=not args.no_truncate) + elif args.all: + mdir.dump_all(f, truncate=not args.no_truncate) else: dumpentries(args, mdir, f) @@ -285,12 +250,12 @@ if __name__ == "__main__": help="Show contents of metadata-pairs/directories.") parser.add_argument('-t', '--tags', action='store_true', help="Show metadata tags instead of reconstructing entries.") - parser.add_argument('-a', '--all', action='store_true', - help="Show all tags in log, included tags in corrupted commits.") parser.add_argument('-l', '--log', action='store_true', help="Show tags in log.") + parser.add_argument('-a', '--all', action='store_true', + help="Show all tags in log, included tags in corrupted commits.") parser.add_argument('-d', '--data', action='store_true', help="Also show the raw contents of files/attrs/tags.") parser.add_argument('-T', '--no-truncate', action='store_true', - help="Don't truncate large amounts of data in files.") + help="Don't truncate large amounts of data.") sys.exit(main(parser.parse_args()))