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