hgbook
annotate examples/hg-replay @ 385:0abd3d78172e
finished translation of a figure
translated a few paragraphs of tour-merge
translated a few paragraphs of tour-merge
author | Javier Rojas <jerojasro@devnull.li> |
---|---|
date | Sun Nov 02 13:54:42 2008 -0500 (2008-11-02) |
parents | |
children |
rev | line source |
---|---|
bos@128 | 1 #!/usr/bin/env python |
bos@128 | 2 # |
bos@128 | 3 # Adapter for using interdiff with mercurial's extdiff extension. |
bos@128 | 4 # |
bos@128 | 5 # Copyright 2006 Bryan O'Sullivan <bos@serpentine.com> |
bos@128 | 6 # |
bos@128 | 7 # This software may be used and distributed according to the terms of |
bos@128 | 8 # the GNU General Public License, incorporated herein by reference. |
bos@128 | 9 |
bos@128 | 10 import os |
bos@128 | 11 import shutil |
bos@128 | 12 import sys |
bos@128 | 13 import tempfile |
bos@128 | 14 |
bos@128 | 15 if len(sys.argv) < 4: |
bos@128 | 16 print >> sys.stderr, ('usage: %s srcrepo destrepo cset-to-omit [...]' % |
bos@128 | 17 os.path.basename(sys.argv[0])) |
bos@128 | 18 sys.exit(1) |
bos@128 | 19 |
bos@128 | 20 srcrepo, destrepo = sys.argv[1], sys.argv[2] |
bos@128 | 21 omit = sys.argv[3:] |
bos@128 | 22 |
bos@128 | 23 changemap = {} |
bos@128 | 24 revs = [] |
bos@128 | 25 |
bos@128 | 26 parent = None |
bos@128 | 27 |
bos@128 | 28 sys.stdout.write('gathering history...') |
bos@128 | 29 sys.stdout.flush() |
bos@128 | 30 |
bos@128 | 31 for line in os.popen("hg --cwd %r log -r0:tip --template '{rev}:{node} {parents}\n'" % srcrepo): |
bos@128 | 32 changes = line.split() |
bos@128 | 33 cset = changes[0].split(':')[1] |
bos@128 | 34 rev = len(revs) |
bos@128 | 35 changemap[cset] = rev |
bos@128 | 36 if len(changes) >= 2: |
bos@128 | 37 p1 = int(changes[1].split(':', 1)[0]) |
bos@128 | 38 if len(changes) == 3: |
bos@128 | 39 p2 = int(changes[2].split(':', 1)[0]) |
bos@128 | 40 else: |
bos@128 | 41 p2 = None |
bos@128 | 42 if len(changes) == 1: |
bos@128 | 43 p1 = parent |
bos@128 | 44 revs.append((cset, p1, p2)) |
bos@128 | 45 parent = rev |
bos@128 | 46 |
bos@128 | 47 sys.stdout.write(' %d revs\n' % len(revs)) |
bos@128 | 48 |
bos@128 | 49 def findrev(r): |
bos@128 | 50 try: |
bos@128 | 51 i = int(r) |
bos@128 | 52 if str(i) == r: |
bos@128 | 53 rev = i |
bos@128 | 54 if rev < 0: |
bos@128 | 55 rev += len(revs) |
bos@128 | 56 if rev < 0 or rev > len(revs): |
bos@128 | 57 print >> sys.stderr, 'bad changeset: %r' % r |
bos@128 | 58 sys.exit(1) |
bos@128 | 59 cset = revs[rev][0] |
bos@128 | 60 except ValueError: |
bos@128 | 61 cset = r |
bos@128 | 62 matches = [changemap[c] for c in changemap if c.startswith(cset)] |
bos@128 | 63 if len(matches) != 1: |
bos@128 | 64 print >> sys.stderr, 'bad changeset: %r' % r |
bos@128 | 65 sys.exit(1) |
bos@128 | 66 rev = matches[0] |
bos@128 | 67 return rev |
bos@128 | 68 |
bos@128 | 69 def run(cmd): |
bos@128 | 70 print cmd |
bos@128 | 71 ret = os.system(cmd) |
bos@128 | 72 if ret: |
bos@128 | 73 print >> sys.stderr, 'failure:', cmd |
bos@128 | 74 sys.exit(1) |
bos@128 | 75 |
bos@128 | 76 omit = map(findrev, omit) |
bos@128 | 77 omit.sort() |
bos@128 | 78 newrevs = revs[:omit[0]] |
bos@128 | 79 tip = len(newrevs) - 1 |
bos@128 | 80 run('hg clone -q -r%s %r %r' % (tip, srcrepo, destrepo)) |
bos@128 | 81 |
bos@128 | 82 os.environ['HGMERGE'] = 'true' |
bos@128 | 83 |
bos@128 | 84 patchdir = tempfile.mkdtemp(prefix='replay.') |
bos@128 | 85 try: |
bos@128 | 86 run('hg --cwd %r export --git -o %r%s%%R %d:tip' % |
bos@128 | 87 (srcrepo, patchdir, os.sep, omit[0]+1)) |
bos@128 | 88 for rev in xrange(omit[0], len(revs)): |
bos@128 | 89 if rev in omit: |
bos@128 | 90 print 'omit', rev |
bos@128 | 91 newrevs.append((None, revs[rev][1], None)) |
bos@128 | 92 continue |
bos@128 | 93 _, p1, p2 = revs[rev] |
bos@128 | 94 np1 = newrevs[p1][1] |
bos@128 | 95 if tip != np1: |
bos@128 | 96 run('hg --cwd %r update -q -C %s' % (destrepo, np1)) |
bos@128 | 97 np2 = None |
bos@128 | 98 if p2: |
bos@128 | 99 np2 = newrevs[p2][1] |
bos@128 | 100 run('hg --cwd %r merge -q %s' % (destrepo, np2)) |
bos@128 | 101 print >> sys.stderr, 'XXX - cannot handle merges properly yet' |
bos@128 | 102 run('hg --cwd %r import -q -f %r%s%d' % (destrepo, patchdir, os.sep, rev)) |
bos@128 | 103 tip = len(newrevs) - 1 |
bos@128 | 104 newrevs.append((None, tip, np2)) |
bos@128 | 105 finally: |
bos@128 | 106 print 'cleaning up ...' |
bos@128 | 107 #shutil.rmtree(patchdir) |