mercurial --> plain text --> mercurial

didier deshommes dfdeshom at gmail.com
Thu Mar 27 13:31:48 CDT 2008


Matt Mackall <mpm <at> selenic.com> writes:

> 
> Alright, here's a pair of scripts that will do end-to-end:
> 
> diff -r bc142ee1522c contrib/dumprevlog
> --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
> +++ b/contrib/dumprevlog	Thu Mar 27 12:40:17 2008 -0500
> @@ -0,0 +1,21 @@
> +#!/usr/bin/env python
> +# Dump revlogs as raw data stream
> +# $ find .hg/store/ -name "*.i" | xargs dumprevlog > repo.dump
> +
> +import sys
> +from mercurial import revlog, node
> +
> +for f in sys.argv[1:]:
> +    r = revlog.revlog(open, f)
> +    print "file:", f
> +    for i in xrange(r.count()):
> +        n = r.node(i)
> +        p = r.parents(n)
> +        d = r.revision(n)
> +        print "node:", node.hex(n)
> +        print "linkrev:", r.linkrev(n)
> +        print "parents:", node.hex(p[0]), node.hex(p[1])
> +        print "length:", len(d)
> +        print "-start-"
> +        print d
> +        print "-end-"
> diff -r bc142ee1522c contrib/undumprevlog
> --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
> +++ b/contrib/undumprevlog	Thu Mar 27 12:40:17 2008 -0500
> @@ -0,0 +1,34 @@
> +#!/usr/bin/env python
> +# Undump a dump from dumprevlog
> +# $ hg init
> +# $ undumprevlog < repo.dump
> +
> +import sys
> +from mercurial import revlog, node, util, transaction
> +
> +opener = util.opener('.', False)
> +tr = transaction.transaction(sys.stderr.write, opener, "undump.journal")
> +while 1:
> +    l = sys.stdin.readline()
> +    if not l:
> +        break
> +    if l.startswith("file:"):
> +        f = l[6:-1]
> +        r = revlog.revlog(opener, f)
> +        print 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 = sys.stdin.read(length)
> +        sys.stdin.readline() # end marker
> +        r.addrevision(d, tr, lr, p1, p2)
> +
> +tr.close()

The undump script is doing something, but after it's done, I'm still left with
an empty directory. Here's what I did:
$ ls #original hg repo
build   dumprevlog   MANIFEST.in          sage        spkg-debian-maybe
bundle  dumprevlog~  mercurial-howto.txt  sage-push   spkg-delauto
c_lib   export       pull                 setupnb.py  spkg-dist
debian  install      README.txt           setup.py    spkg-install

$ mv repo.dum ~/hg-test
$ hg init # new hg repo
$ undumprevlog < repo.dump
[...]
$ ls   # where are all the files?
repo.dump  undumprevlog
$ ls .hg/data/
boring.i          commit.i   MANIFEST.in.i          README.i      setup.py.i
build             config.i   mercurial-howto.txt.i  README.txt.i 
spkg-debian-maybe.i
bundle.i          debian     new.i                  sage          spkg-delauto.i
changes.i         doc        notes.txt.i            sage-push.i   spkg-dist.i
c_lib             export.i   PKG-INFO.i             setupnb.py.i  spkg-install.i
cmfcore.tailor.i  install.i  pull.i                 setup.py.d    test_changed.i

$ hg tip
changeset:   -1:000000000000
tag:         tip
user:
date:        Thu Jan 01 00:00:00 1970 +0000

All of this is in the repo which is great, but I was expecting all the relevant
files to be restored, not just the repo.

didier




More information about the Mercurial mailing list