Mercurial > hg-stable
view contrib/undumprevlog @ 48575:e91aa800ae5b
rhg: desambiguate status without decompressing filelog if possible
When status is unsure based on `stat()` and the dirstate if a file is clean
or modified, we need to compare it against the filelog.
This comparison can skip looking at contents if the lengths differ.
This changeset optimize this further to deduce what we can about the length
if the filelog without decompressing it or resolving deltas.
Differential Revision: https://phab.mercurial-scm.org/D11965
author | Simon Sapin <simon.sapin@octobus.net> |
---|---|
date | Fri, 07 Jan 2022 14:40:21 +0100 |
parents | 8d3c2f9d4af7 |
children | 6000f5b25c9b |
line wrap: on
line source
#!/usr/bin/env python3 # Undump a dump from dumprevlog # $ hg init # $ undumprevlog < repo.dump from __future__ import absolute_import, print_function 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()