hgbook

annotate contrib/hg-replay @ 1102:77fa81a32f2e

2.7.5 zh translated ,1 fuzzy
author Zhaoping Sun <zhaopingsun@gmail.com>
date Wed Nov 25 21:51:40 2009 -0500 (2009-11-25)
parents d179d63ea018
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)