hgbook
diff contrib/hg-replay @ 1019:746a888fb41b
some typo and better french translation
author | André Sintzoff <andre.sintzoff@gmail.com> |
---|---|
date | Mon Nov 30 10:57:42 2009 +0100 (2009-11-30) |
parents | d179d63ea018 |
children |
line diff
1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/contrib/hg-replay Mon Nov 30 10:57:42 2009 +0100 1.3 @@ -0,0 +1,107 @@ 1.4 +#!/usr/bin/env python 1.5 +# 1.6 +# Adapter for using interdiff with mercurial's extdiff extension. 1.7 +# 1.8 +# Copyright 2006 Bryan O'Sullivan <bos@serpentine.com> 1.9 +# 1.10 +# This software may be used and distributed according to the terms of 1.11 +# the GNU General Public License, incorporated herein by reference. 1.12 + 1.13 +import os 1.14 +import shutil 1.15 +import sys 1.16 +import tempfile 1.17 + 1.18 +if len(sys.argv) < 4: 1.19 + print >> sys.stderr, ('usage: %s srcrepo destrepo cset-to-omit [...]' % 1.20 + os.path.basename(sys.argv[0])) 1.21 + sys.exit(1) 1.22 + 1.23 +srcrepo, destrepo = sys.argv[1], sys.argv[2] 1.24 +omit = sys.argv[3:] 1.25 + 1.26 +changemap = {} 1.27 +revs = [] 1.28 + 1.29 +parent = None 1.30 + 1.31 +sys.stdout.write('gathering history...') 1.32 +sys.stdout.flush() 1.33 + 1.34 +for line in os.popen("hg --cwd %r log -r0:tip --template '{rev}:{node} {parents}\n'" % srcrepo): 1.35 + changes = line.split() 1.36 + cset = changes[0].split(':')[1] 1.37 + rev = len(revs) 1.38 + changemap[cset] = rev 1.39 + if len(changes) >= 2: 1.40 + p1 = int(changes[1].split(':', 1)[0]) 1.41 + if len(changes) == 3: 1.42 + p2 = int(changes[2].split(':', 1)[0]) 1.43 + else: 1.44 + p2 = None 1.45 + if len(changes) == 1: 1.46 + p1 = parent 1.47 + revs.append((cset, p1, p2)) 1.48 + parent = rev 1.49 + 1.50 +sys.stdout.write(' %d revs\n' % len(revs)) 1.51 + 1.52 +def findrev(r): 1.53 + try: 1.54 + i = int(r) 1.55 + if str(i) == r: 1.56 + rev = i 1.57 + if rev < 0: 1.58 + rev += len(revs) 1.59 + if rev < 0 or rev > len(revs): 1.60 + print >> sys.stderr, 'bad changeset: %r' % r 1.61 + sys.exit(1) 1.62 + cset = revs[rev][0] 1.63 + except ValueError: 1.64 + cset = r 1.65 + matches = [changemap[c] for c in changemap if c.startswith(cset)] 1.66 + if len(matches) != 1: 1.67 + print >> sys.stderr, 'bad changeset: %r' % r 1.68 + sys.exit(1) 1.69 + rev = matches[0] 1.70 + return rev 1.71 + 1.72 +def run(cmd): 1.73 + print cmd 1.74 + ret = os.system(cmd) 1.75 + if ret: 1.76 + print >> sys.stderr, 'failure:', cmd 1.77 + sys.exit(1) 1.78 + 1.79 +omit = map(findrev, omit) 1.80 +omit.sort() 1.81 +newrevs = revs[:omit[0]] 1.82 +tip = len(newrevs) - 1 1.83 +run('hg clone -q -r%s %r %r' % (tip, srcrepo, destrepo)) 1.84 + 1.85 +os.environ['HGMERGE'] = 'true' 1.86 + 1.87 +patchdir = tempfile.mkdtemp(prefix='replay.') 1.88 +try: 1.89 + run('hg --cwd %r export --git -o %r%s%%R %d:tip' % 1.90 + (srcrepo, patchdir, os.sep, omit[0]+1)) 1.91 + for rev in xrange(omit[0], len(revs)): 1.92 + if rev in omit: 1.93 + print 'omit', rev 1.94 + newrevs.append((None, revs[rev][1], None)) 1.95 + continue 1.96 + _, p1, p2 = revs[rev] 1.97 + np1 = newrevs[p1][1] 1.98 + if tip != np1: 1.99 + run('hg --cwd %r update -q -C %s' % (destrepo, np1)) 1.100 + np2 = None 1.101 + if p2: 1.102 + np2 = newrevs[p2][1] 1.103 + run('hg --cwd %r merge -q %s' % (destrepo, np2)) 1.104 + print >> sys.stderr, 'XXX - cannot handle merges properly yet' 1.105 + run('hg --cwd %r import -q -f %r%s%d' % (destrepo, patchdir, os.sep, rev)) 1.106 + tip = len(newrevs) - 1 1.107 + newrevs.append((None, tip, np2)) 1.108 +finally: 1.109 + print 'cleaning up ...' 1.110 + #shutil.rmtree(patchdir)