I've looked into this some more and it looks like we can completely reconstruct a repository from the export of all its keywords. The trick is to use the --exact keyword when importing. This forces it to apply the given patch to the correct parent (sometimes creating a new head) and will also correctly import merge patches (removing heads). Some scripts to do this are up at
http://sage.math.washington.edu/home/robertwb/hg/ I've successfully exported and re-created simple repositories (with branching) with these scripts, and it works great and preserves all the history. The only issue is that I can't seem to get it to work with any repositories older than a certain date. I think the issue is that mercurial changed the way nodeid's are calculated (and I keep getting an error "abort: patch is damaged or loses information" which is thrown when the newly computed nodeid does not match the one in the patch (command.py:1632 in 0.9.5)). Matt Mackall, any suggestions on how to cleanly get around this/get the old node-id numbers instead? - Robert FYI, the sage-main repo has 244MB of patches, compressing down to 33MB under bzip2. On Mar 27, 2008, at 2:04 PM, didier deshommes wrote: > >> From the scripts below I was able to dump a text version of the SAGE > repo and recover it to make another hg repo out of it. This requires: > - mercurial 1.0 > - a change in the layout of the sage repo. It's not too hard: hg > clone --pull $SAGE_REPO will create an exact copy of the repository in > the new format. > > Here's what I did: > $ pwd # old repo > old-hg/ > $ find .hg/store/ -name "*.i" | xargs dumprevlog > repo.dump > > $ cd ~/new-hg # new repo > $ hg init > $ undumprevlog < ~/old-repo/repo.dump > [stuff happens...] > > $ hg tip > dfdeshom <at> sage:~/new-hg$ hg tip > changeset: 8962:211b127eab5d > tag: tip > user: William Stein <wstein <at> gmail.com> > date: Mon Mar 17 16:03:46 2008 -0700 > files: sage/rings/polynomial/multi_polynomial_element.py sage/ > version.py > description: > 2.10.4 > > And doing hg co will re-populate this directory. And it looks like > these scripts will be incorporated in the new version of hg (in > /contribs/ I guess). Thanks to Matt for his quick response! > > didier > > ---------- Forwarded message ---------- > From: Matt Mackall <[EMAIL PROTECTED]> > Date: Thu, Mar 27, 2008 at 1:49 PM > Subject: Re: mercurial --> plain text --> mercurial > To: didier deshommes <[EMAIL PROTECTED]> > Cc: [EMAIL PROTECTED] > > > 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() > > Tested on the Mercurial repo. > > ps: making this work on systems that have braindead notions about > text > vs binary files is an exercise left to the reader > > > > -- > Mathematics is the supreme nostalgia of our time. > > --~--~---------~--~----~------------~-------~--~----~ To post to this group, send email to sage-devel@googlegroups.com To unsubscribe from this group, send email to [EMAIL PROTECTED] For more options, visit this group at http://groups.google.com/group/sage-devel URLs: http://www.sagemath.org -~----------~----~----~----~------~----~------~--~---