hgbook

changeset 128:d179d63ea018

New example script attempts to replay history, omitting selected changes.
author Bryan O'Sullivan <bos@serpentine.com>
date Tue Dec 26 16:56:50 2006 -0800 (2006-12-26)
parents ba2334e2ba9a
children 73efa1a01a6c
files examples/hg-replay
line diff
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/examples/hg-replay	Tue Dec 26 16:56:50 2006 -0800
     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)