Modified readmdir/readtree to make reading non-truncated data easier
This commit is contained in:
+13
-48
@@ -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(
|
||||
'<II', tag.data[:8].ljust(8, b'\xff')))
|
||||
if tag.is_('ctzstruct'):
|
||||
f.write(" ctz {%#x} size %d" % struct.unpack(
|
||||
'<II', tag.data[:8].ljust(8, b'\xff')))
|
||||
if tag.is_('inlinestruct'):
|
||||
f.write(" inline size %d" % tag.size)
|
||||
if tag.is_('gstate'):
|
||||
f.write(" 0x%s" % ''.join('%02x' % c for c in tag.data))
|
||||
if tag.is_('tail'):
|
||||
f.write(" tail {%#x, %#x}" % struct.unpack(
|
||||
'<II', tag.data[:8].ljust(8, b'\xff')))
|
||||
f.write("\n")
|
||||
|
||||
if args.data:
|
||||
for i in range(0, len(tag.data), 16):
|
||||
f.write(" %-47s %-16s\n" % (
|
||||
' '.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 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()))
|
||||
|
||||
Reference in New Issue
Block a user