contrib/undumprevlog
author Martin von Zweigbergk <martinvonz@google.com>
Fri, 06 Sep 2019 23:10:28 -0700
changeset 42912 6d0fdba635e5
parent 39947 a063b84ce064
child 43659 99e231afc29c
permissions -rwxr-xr-x
repair: extract a helper for generating all manifest revlogs We'll need to walk the manifest revlogs also to figure out which manifests have linkrevs out of order (for fixing the bug shown in the previous patch). By the way, perhaps it would be more efficient in many cases to find only the relevant directory manifest revlogs based on the files instead of walking the entire store, but that can be changed later. Differential Revision: https://phab.mercurial-scm.org/D6794

#!/usr/bin/env python
# Undump a dump from dumprevlog
# $ hg init
# $ undumprevlog < repo.dump

from __future__ import absolute_import, print_function

import sys
from mercurial import (
    encoding,
    node,
    pycompat,
    revlog,
    transaction,
    vfs as vfsmod,
)
from mercurial.utils import (
    procutil,
)

for fp in (sys.stdin, sys.stdout, sys.stderr):
    procutil.setbinary(fp)

opener = vfsmod.vfs(b'.', False)
tr = transaction.transaction(sys.stderr.write, opener, {b'store': opener},
                             b"undump.journal")
while True:
    l = sys.stdin.readline()
    if not l:
        break
    if l.startswith("file:"):
        f = encoding.strtolocal(l[6:-1])
        r = revlog.revlog(opener, f)
        pycompat.stdout.write(b'%s\n' % f)
    elif l.startswith("node:"):
        n = node.bin(l[6:-1])
    elif l.startswith("linkrev:"):
        lr = int(l[9:-1])
    elif l.startswith("parents:"):
        p = l[9:-1].split()
        p1 = node.bin(p[0])
        p2 = node.bin(p[1])
    elif l.startswith("length:"):
        length = int(l[8:-1])
        sys.stdin.readline() # start marker
        d = encoding.strtolocal(sys.stdin.read(length))
        sys.stdin.readline() # end marker
        r.addrevision(d, tr, lr, p1, p2)

tr.close()