contrib/undumprevlog
author Pierre-Yves David <pierre-yves.david@octobus.net>
Wed, 21 Jun 2023 21:57:44 +0200
branchstable
changeset 50782 75d3306fbc9a
parent 48966 6000f5b25c9b
permissions -rwxr-xr-x
tags: avoid expensive access to repo.changelog in a loop repo.changelog needs some cache invalidation when run on filtered repository. Accessing it in that loop can be expensive when there is many heads (e.g. mozilla try and it 25 000 heads). Note that the loop itself seems useless, but after this patch it no longer take about ⅛ of the time we spend computing cache for mozilla try. before : ! wall 0.350994 comb 0.350000 user 0.330000 sys 0.020000 (median of 28) after : ! wall 0.319520 comb 0.310000 user 0.290000 sys 0.020000 (median of 30)

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


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

from mercurial.revlogutils import (
    constants as revlog_constants,
)

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])
        assert f.endswith(b'.i')
        r = revlog.revlog(
            opener,
            target=(revlog_constants.KIND_OTHER, b'undump-revlog'),
            radix=f[:-2],
        )
        procutil.stdout.write(b'%s\n' % f)
    elif l.startswith("node:"):
        n = bin(l[6:-1])
    elif l.startswith("linkrev:"):
        lr = int(l[9:-1])
    elif l.startswith("parents:"):
        p = l[9:-1].split()
        p1 = bin(p[0])
        p2 = 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()