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
-~----------~----~----~----~------~----~------~--~---

Reply via email to