1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77
|
#!/usr/bin/env python3
# Dump revlogs as raw data stream
# $ find .hg/store/ -name "*.i" | xargs dumprevlog > repo.dump
import os
import sys
from mercurial.node import hex
from mercurial import (
encoding,
pycompat,
revlog,
)
from mercurial.utils import procutil
from mercurial.revlogutils import (
constants as revlog_constants,
)
BASE = b'/'
if pycompat.iswindows:
# use os.path.splitroot once we drop support for Python 3.11
pieces = os.path.splitdrive(os.getcwdb())
BASE = pieces[0] + pieces[1][0:1]
for fp in (sys.stdin, sys.stdout, sys.stderr):
procutil.setbinary(fp)
def binopen(path, mode=b'rb'):
if b'b' not in mode:
mode = mode + b'b'
if not os.path.isabs(path):
path = BASE + path
return open(path, pycompat.sysstr(mode))
binopen.options = {}
binopen.filter_name = None
if pycompat.iswindows:
binopen.base = os.path.splitdrive(os.getcwdb())[0]
else:
binopen.base = b"/"
binopen.read_write = False
def printb(data, end=b'\n'):
sys.stdout.flush()
procutil.stdout.write(data + end)
for f in sys.argv[1:]:
absstr = os.path.abspath(f)
abslocal = encoding.strtolocal(absstr)
localf = os.path.relpath(abslocal, BASE)
if not localf.endswith(b'.i'):
print("file:", f, file=sys.stderr)
print(" invalid filename", file=sys.stderr)
r = revlog.revlog(
binopen,
target=(revlog_constants.KIND_OTHER, b'dump-revlog'),
radix=localf[:-2],
)
print("file:", f)
for i in r:
n = r.node(i)
p = r.parents(n)
d = r.revision(n)
printb(b"node: %s" % hex(n))
printb(b"linkrev: %d" % r.linkrev(i))
printb(b"parents: %s %s" % (hex(p[0]), hex(p[1])))
printb(b"length: %d" % len(d))
printb(b"-start-")
printb(d)
printb(b"-end-")
|