annotate hgext/imerge.py @ 5483:0c43f87baba3 default tip

Fix file-changed-to-dir and dir-to-file commits (issue660). Allow adding to dirstate files that clash with previously existing but marked for removal. Protect from reintroducing clashes by revert. This change doesn't address related issues with update. Current workaround is to do "clean" update by manually removing conflicting files/dirs from working directory.
author Maxim Dounin <mdounin@mdounin.ru>
date Sat, 27 Oct 2007 16:27:55 +0400
parents 3786ef8877d5
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
5042
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
1 # Copyright (C) 2007 Brendan Cully <brendan@kublai.com>
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
2 # Published under the GNU GPL
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
3
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
4 '''
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
5 imerge - interactive merge
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
6 '''
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
7
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
8 from mercurial.i18n import _
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
9 from mercurial.node import *
5221
8860f29447c1 imerge: fix ancestor calculation
Brendan Cully <brendan@kublai.com>
parents: 5154
diff changeset
10 from mercurial import commands, cmdutil, dispatch, fancyopts, hg, merge, util
5042
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
11 import os, tarfile
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
12
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
13 class InvalidStateFileException(Exception): pass
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
14
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
15 class ImergeStateFile(object):
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
16 def __init__(self, im):
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
17 self.im = im
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
18
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
19 def save(self, dest):
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
20 tf = tarfile.open(dest, 'w:gz')
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
21
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
22 st = os.path.join(self.im.path, 'status')
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
23 tf.add(st, os.path.join('.hg', 'imerge', 'status'))
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
24
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
25 for f in self.im.resolved:
5063
86327d13d916 imerge: handle renames
Brendan Cully <brendan@kublai.com>
parents: 5054
diff changeset
26 (fd, fo) = self.im.conflicts[f]
86327d13d916 imerge: handle renames
Brendan Cully <brendan@kublai.com>
parents: 5054
diff changeset
27 abssrc = self.im.repo.wjoin(fd)
86327d13d916 imerge: handle renames
Brendan Cully <brendan@kublai.com>
parents: 5054
diff changeset
28 tf.add(abssrc, fd)
5042
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
29
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
30 tf.close()
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
31
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
32 def load(self, source):
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
33 wlock = self.im.repo.wlock()
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
34 lock = self.im.repo.lock()
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
35
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
36 tf = tarfile.open(source, 'r')
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
37 contents = tf.getnames()
5153
1d5ebb0d366f imerge: fix status file lookups
Patrick Mezard <pmezard@gmail.com>
parents: 5117
diff changeset
38 # tarfile normalizes path separators to '/'
5154
ec24bfd852ab imerge: simplify 1d5ebb0d366f
Brendan Cully <brendan@kublai.com>
parents: 5153
diff changeset
39 statusfile = '.hg/imerge/status'
5042
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
40 if statusfile not in contents:
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
41 raise InvalidStateFileException('no status file')
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
42
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
43 tf.extract(statusfile, self.im.repo.root)
5063
86327d13d916 imerge: handle renames
Brendan Cully <brendan@kublai.com>
parents: 5054
diff changeset
44 p1, p2 = self.im.load()
86327d13d916 imerge: handle renames
Brendan Cully <brendan@kublai.com>
parents: 5054
diff changeset
45 if self.im.repo.dirstate.parents()[0] != p1.node():
86327d13d916 imerge: handle renames
Brendan Cully <brendan@kublai.com>
parents: 5054
diff changeset
46 hg.clean(self.im.repo, p1.node())
86327d13d916 imerge: handle renames
Brendan Cully <brendan@kublai.com>
parents: 5054
diff changeset
47 self.im.start(p2.node())
5055
56d48aed1f69 imerge: tarfile.extractall is only available in python2.5
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 5054
diff changeset
48 for tarinfo in tf:
56d48aed1f69 imerge: tarfile.extractall is only available in python2.5
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 5054
diff changeset
49 tf.extract(tarinfo, self.im.repo.root)
5042
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
50 self.im.load()
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
51
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
52 class Imerge(object):
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
53 def __init__(self, ui, repo):
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
54 self.ui = ui
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
55 self.repo = repo
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
56
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
57 self.path = repo.join('imerge')
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
58 self.opener = util.opener(self.path)
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
59
5063
86327d13d916 imerge: handle renames
Brendan Cully <brendan@kublai.com>
parents: 5054
diff changeset
60 self.wctx = self.repo.workingctx()
5042
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
61 self.conflicts = {}
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
62 self.resolved = []
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
63
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
64 def merging(self):
5063
86327d13d916 imerge: handle renames
Brendan Cully <brendan@kublai.com>
parents: 5054
diff changeset
65 return len(self.wctx.parents()) > 1
5042
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
66
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
67 def load(self):
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
68 # status format. \0-delimited file, fields are
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
69 # p1, p2, conflict count, conflict filenames, resolved filenames
5054
ec70fd08e16c Update imerge for new filemerge interface
Brendan Cully <brendan@kublai.com>
parents: 5042
diff changeset
70 # conflict filenames are tuples of localname, remoteorig, remotenew
5042
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
71
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
72 statusfile = self.opener('status')
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
73
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
74 status = statusfile.read().split('\0')
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
75 if len(status) < 3:
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
76 raise util.Abort('invalid imerge status file')
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
77
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
78 try:
5063
86327d13d916 imerge: handle renames
Brendan Cully <brendan@kublai.com>
parents: 5054
diff changeset
79 parents = [self.repo.changectx(n) for n in status[:2]]
5042
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
80 except LookupError:
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
81 raise util.Abort('merge parent %s not in repository' % short(p))
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
82
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
83 status = status[2:]
5054
ec70fd08e16c Update imerge for new filemerge interface
Brendan Cully <brendan@kublai.com>
parents: 5042
diff changeset
84 conflicts = int(status.pop(0)) * 3
5042
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
85 self.resolved = status[conflicts:]
5054
ec70fd08e16c Update imerge for new filemerge interface
Brendan Cully <brendan@kublai.com>
parents: 5042
diff changeset
86 for i in xrange(0, conflicts, 3):
ec70fd08e16c Update imerge for new filemerge interface
Brendan Cully <brendan@kublai.com>
parents: 5042
diff changeset
87 self.conflicts[status[i]] = (status[i+1], status[i+2])
5042
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
88
5063
86327d13d916 imerge: handle renames
Brendan Cully <brendan@kublai.com>
parents: 5054
diff changeset
89 return parents
86327d13d916 imerge: handle renames
Brendan Cully <brendan@kublai.com>
parents: 5054
diff changeset
90
5042
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
91 def save(self):
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
92 lock = self.repo.lock()
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
93
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
94 if not os.path.isdir(self.path):
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
95 os.mkdir(self.path)
5056
34a54cc5df1b imerge: sorted() is only available in python2.4 and above
Thomas Arendsen Hein <thomas@intevation.de>
parents: 5055
diff changeset
96 statusfile = self.opener('status', 'wb')
5042
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
97
5063
86327d13d916 imerge: handle renames
Brendan Cully <brendan@kublai.com>
parents: 5054
diff changeset
98 out = [hex(n.node()) for n in self.wctx.parents()]
5042
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
99 out.append(str(len(self.conflicts)))
5056
34a54cc5df1b imerge: sorted() is only available in python2.4 and above
Thomas Arendsen Hein <thomas@intevation.de>
parents: 5055
diff changeset
100 conflicts = self.conflicts.items()
34a54cc5df1b imerge: sorted() is only available in python2.4 and above
Thomas Arendsen Hein <thomas@intevation.de>
parents: 5055
diff changeset
101 conflicts.sort()
34a54cc5df1b imerge: sorted() is only available in python2.4 and above
Thomas Arendsen Hein <thomas@intevation.de>
parents: 5055
diff changeset
102 for fw, fd_fo in conflicts:
34a54cc5df1b imerge: sorted() is only available in python2.4 and above
Thomas Arendsen Hein <thomas@intevation.de>
parents: 5055
diff changeset
103 out.append(fw)
34a54cc5df1b imerge: sorted() is only available in python2.4 and above
Thomas Arendsen Hein <thomas@intevation.de>
parents: 5055
diff changeset
104 out.extend(fd_fo)
5042
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
105 out.extend(self.resolved)
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
106
5056
34a54cc5df1b imerge: sorted() is only available in python2.4 and above
Thomas Arendsen Hein <thomas@intevation.de>
parents: 5055
diff changeset
107 statusfile.write('\0'.join(out))
5042
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
108
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
109 def remaining(self):
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
110 return [f for f in self.conflicts if f not in self.resolved]
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
111
5223
3786ef8877d5 imerge: add automerge flag to attempt to batch merge all conflicts
Brendan Cully <brendan@kublai.com>
parents: 5221
diff changeset
112 def filemerge(self, fn, interactive=True):
5042
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
113 wlock = self.repo.wlock()
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
114
5054
ec70fd08e16c Update imerge for new filemerge interface
Brendan Cully <brendan@kublai.com>
parents: 5042
diff changeset
115 (fd, fo) = self.conflicts[fn]
5221
8860f29447c1 imerge: fix ancestor calculation
Brendan Cully <brendan@kublai.com>
parents: 5154
diff changeset
116 p1, p2 = self.wctx.parents()
5223
3786ef8877d5 imerge: add automerge flag to attempt to batch merge all conflicts
Brendan Cully <brendan@kublai.com>
parents: 5221
diff changeset
117
3786ef8877d5 imerge: add automerge flag to attempt to batch merge all conflicts
Brendan Cully <brendan@kublai.com>
parents: 5221
diff changeset
118 # this could be greatly improved
3786ef8877d5 imerge: add automerge flag to attempt to batch merge all conflicts
Brendan Cully <brendan@kublai.com>
parents: 5221
diff changeset
119 realmerge = os.environ.get('HGMERGE')
3786ef8877d5 imerge: add automerge flag to attempt to batch merge all conflicts
Brendan Cully <brendan@kublai.com>
parents: 5221
diff changeset
120 if not interactive:
3786ef8877d5 imerge: add automerge flag to attempt to batch merge all conflicts
Brendan Cully <brendan@kublai.com>
parents: 5221
diff changeset
121 os.environ['HGMERGE'] = 'merge'
3786ef8877d5 imerge: add automerge flag to attempt to batch merge all conflicts
Brendan Cully <brendan@kublai.com>
parents: 5221
diff changeset
122
5221
8860f29447c1 imerge: fix ancestor calculation
Brendan Cully <brendan@kublai.com>
parents: 5154
diff changeset
123 # The filemerge ancestor algorithm does not work if self.wctx
8860f29447c1 imerge: fix ancestor calculation
Brendan Cully <brendan@kublai.com>
parents: 5154
diff changeset
124 # already has two parents (in normal merge it doesn't yet). But
8860f29447c1 imerge: fix ancestor calculation
Brendan Cully <brendan@kublai.com>
parents: 5154
diff changeset
125 # this is very dirty.
8860f29447c1 imerge: fix ancestor calculation
Brendan Cully <brendan@kublai.com>
parents: 5154
diff changeset
126 self.wctx._parents.pop()
8860f29447c1 imerge: fix ancestor calculation
Brendan Cully <brendan@kublai.com>
parents: 5154
diff changeset
127 try:
5223
3786ef8877d5 imerge: add automerge flag to attempt to batch merge all conflicts
Brendan Cully <brendan@kublai.com>
parents: 5221
diff changeset
128 # TODO: we should probably revert the file if merge fails
5221
8860f29447c1 imerge: fix ancestor calculation
Brendan Cully <brendan@kublai.com>
parents: 5154
diff changeset
129 return merge.filemerge(self.repo, fn, fd, fo, self.wctx, p2)
8860f29447c1 imerge: fix ancestor calculation
Brendan Cully <brendan@kublai.com>
parents: 5154
diff changeset
130 finally:
8860f29447c1 imerge: fix ancestor calculation
Brendan Cully <brendan@kublai.com>
parents: 5154
diff changeset
131 self.wctx._parents.append(p2)
5223
3786ef8877d5 imerge: add automerge flag to attempt to batch merge all conflicts
Brendan Cully <brendan@kublai.com>
parents: 5221
diff changeset
132 if realmerge:
3786ef8877d5 imerge: add automerge flag to attempt to batch merge all conflicts
Brendan Cully <brendan@kublai.com>
parents: 5221
diff changeset
133 os.environ['HGMERGE'] = realmerge
3786ef8877d5 imerge: add automerge flag to attempt to batch merge all conflicts
Brendan Cully <brendan@kublai.com>
parents: 5221
diff changeset
134 elif not interactive:
3786ef8877d5 imerge: add automerge flag to attempt to batch merge all conflicts
Brendan Cully <brendan@kublai.com>
parents: 5221
diff changeset
135 del os.environ['HGMERGE']
5042
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
136
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
137 def start(self, rev=None):
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
138 _filemerge = merge.filemerge
5054
ec70fd08e16c Update imerge for new filemerge interface
Brendan Cully <brendan@kublai.com>
parents: 5042
diff changeset
139 def filemerge(repo, fw, fd, fo, wctx, mctx):
ec70fd08e16c Update imerge for new filemerge interface
Brendan Cully <brendan@kublai.com>
parents: 5042
diff changeset
140 self.conflicts[fw] = (fd, fo)
5042
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
141
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
142 merge.filemerge = filemerge
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
143 commands.merge(self.ui, self.repo, rev=rev)
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
144 merge.filemerge = _filemerge
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
145
5063
86327d13d916 imerge: handle renames
Brendan Cully <brendan@kublai.com>
parents: 5054
diff changeset
146 self.wctx = self.repo.workingctx()
5042
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
147 self.save()
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
148
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
149 def resume(self):
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
150 self.load()
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
151
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
152 dp = self.repo.dirstate.parents()
5063
86327d13d916 imerge: handle renames
Brendan Cully <brendan@kublai.com>
parents: 5054
diff changeset
153 p1, p2 = self.wctx.parents()
86327d13d916 imerge: handle renames
Brendan Cully <brendan@kublai.com>
parents: 5054
diff changeset
154 if p1.node() != dp[0] or p2.node() != dp[1]:
5042
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
155 raise util.Abort('imerge state does not match working directory')
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
156
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
157 def next(self):
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
158 remaining = self.remaining()
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
159 return remaining and remaining[0]
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
160
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
161 def resolve(self, files):
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
162 resolved = dict.fromkeys(self.resolved)
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
163 for fn in files:
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
164 if fn not in self.conflicts:
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
165 raise util.Abort('%s is not in the merge set' % fn)
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
166 resolved[fn] = True
5056
34a54cc5df1b imerge: sorted() is only available in python2.4 and above
Thomas Arendsen Hein <thomas@intevation.de>
parents: 5055
diff changeset
167 self.resolved = resolved.keys()
34a54cc5df1b imerge: sorted() is only available in python2.4 and above
Thomas Arendsen Hein <thomas@intevation.de>
parents: 5055
diff changeset
168 self.resolved.sort()
5042
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
169 self.save()
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
170 return 0
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
171
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
172 def unresolve(self, files):
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
173 resolved = dict.fromkeys(self.resolved)
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
174 for fn in files:
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
175 if fn not in resolved:
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
176 raise util.Abort('%s is not resolved' % fn)
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
177 del resolved[fn]
5056
34a54cc5df1b imerge: sorted() is only available in python2.4 and above
Thomas Arendsen Hein <thomas@intevation.de>
parents: 5055
diff changeset
178 self.resolved = resolved.keys()
34a54cc5df1b imerge: sorted() is only available in python2.4 and above
Thomas Arendsen Hein <thomas@intevation.de>
parents: 5055
diff changeset
179 self.resolved.sort()
5042
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
180 self.save()
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
181 return 0
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
182
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
183 def pickle(self, dest):
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
184 '''write current merge state to file to be resumed elsewhere'''
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
185 state = ImergeStateFile(self)
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
186 return state.save(dest)
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
187
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
188 def unpickle(self, source):
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
189 '''read merge state from file'''
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
190 state = ImergeStateFile(self)
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
191 return state.load(source)
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
192
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
193 def load(im, source):
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
194 if im.merging():
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
195 raise util.Abort('there is already a merge in progress '
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
196 '(update -C <rev> to abort it)' )
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
197 m, a, r, d = im.repo.status()[:4]
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
198 if m or a or r or d:
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
199 raise util.Abort('working directory has uncommitted changes')
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
200
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
201 rc = im.unpickle(source)
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
202 if not rc:
5065
12930b97a729 imerge: gussy up dispatcher to support subcommand opts.
Brendan Cully <brendan@kublai.com>
parents: 5064
diff changeset
203 status(im)
5042
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
204 return rc
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
205
5223
3786ef8877d5 imerge: add automerge flag to attempt to batch merge all conflicts
Brendan Cully <brendan@kublai.com>
parents: 5221
diff changeset
206 def merge_(im, filename=None, auto=False):
3786ef8877d5 imerge: add automerge flag to attempt to batch merge all conflicts
Brendan Cully <brendan@kublai.com>
parents: 5221
diff changeset
207 success = True
3786ef8877d5 imerge: add automerge flag to attempt to batch merge all conflicts
Brendan Cully <brendan@kublai.com>
parents: 5221
diff changeset
208 if auto and not filename:
3786ef8877d5 imerge: add automerge flag to attempt to batch merge all conflicts
Brendan Cully <brendan@kublai.com>
parents: 5221
diff changeset
209 for fn in im.remaining():
3786ef8877d5 imerge: add automerge flag to attempt to batch merge all conflicts
Brendan Cully <brendan@kublai.com>
parents: 5221
diff changeset
210 rc = im.filemerge(fn, interactive=False)
3786ef8877d5 imerge: add automerge flag to attempt to batch merge all conflicts
Brendan Cully <brendan@kublai.com>
parents: 5221
diff changeset
211 if rc:
3786ef8877d5 imerge: add automerge flag to attempt to batch merge all conflicts
Brendan Cully <brendan@kublai.com>
parents: 5221
diff changeset
212 success = False
3786ef8877d5 imerge: add automerge flag to attempt to batch merge all conflicts
Brendan Cully <brendan@kublai.com>
parents: 5221
diff changeset
213 else:
3786ef8877d5 imerge: add automerge flag to attempt to batch merge all conflicts
Brendan Cully <brendan@kublai.com>
parents: 5221
diff changeset
214 im.resolve([fn])
3786ef8877d5 imerge: add automerge flag to attempt to batch merge all conflicts
Brendan Cully <brendan@kublai.com>
parents: 5221
diff changeset
215 if success:
3786ef8877d5 imerge: add automerge flag to attempt to batch merge all conflicts
Brendan Cully <brendan@kublai.com>
parents: 5221
diff changeset
216 im.ui.write('all conflicts resolved\n')
3786ef8877d5 imerge: add automerge flag to attempt to batch merge all conflicts
Brendan Cully <brendan@kublai.com>
parents: 5221
diff changeset
217 else:
3786ef8877d5 imerge: add automerge flag to attempt to batch merge all conflicts
Brendan Cully <brendan@kublai.com>
parents: 5221
diff changeset
218 status(im)
3786ef8877d5 imerge: add automerge flag to attempt to batch merge all conflicts
Brendan Cully <brendan@kublai.com>
parents: 5221
diff changeset
219 return 0
3786ef8877d5 imerge: add automerge flag to attempt to batch merge all conflicts
Brendan Cully <brendan@kublai.com>
parents: 5221
diff changeset
220
5042
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
221 if not filename:
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
222 filename = im.next()
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
223 if not filename:
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
224 im.ui.write('all conflicts resolved\n')
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
225 return 0
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
226
5223
3786ef8877d5 imerge: add automerge flag to attempt to batch merge all conflicts
Brendan Cully <brendan@kublai.com>
parents: 5221
diff changeset
227 rc = im.filemerge(filename, interactive=not auto)
5042
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
228 if not rc:
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
229 im.resolve([filename])
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
230 if not im.next():
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
231 im.ui.write('all conflicts resolved\n')
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
232 return rc
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
233
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
234 def next(im):
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
235 n = im.next()
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
236 if n:
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
237 im.ui.write('%s\n' % n)
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
238 else:
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
239 im.ui.write('all conflicts resolved\n')
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
240 return 0
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
241
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
242 def resolve(im, *files):
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
243 if not files:
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
244 raise util.Abort('resolve requires at least one filename')
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
245 return im.resolve(files)
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
246
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
247 def save(im, dest):
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
248 return im.pickle(dest)
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
249
5065
12930b97a729 imerge: gussy up dispatcher to support subcommand opts.
Brendan Cully <brendan@kublai.com>
parents: 5064
diff changeset
250 def status(im, **opts):
12930b97a729 imerge: gussy up dispatcher to support subcommand opts.
Brendan Cully <brendan@kublai.com>
parents: 5064
diff changeset
251 if not opts.get('resolved') and not opts.get('unresolved'):
12930b97a729 imerge: gussy up dispatcher to support subcommand opts.
Brendan Cully <brendan@kublai.com>
parents: 5064
diff changeset
252 opts['resolved'] = True
12930b97a729 imerge: gussy up dispatcher to support subcommand opts.
Brendan Cully <brendan@kublai.com>
parents: 5064
diff changeset
253 opts['unresolved'] = True
12930b97a729 imerge: gussy up dispatcher to support subcommand opts.
Brendan Cully <brendan@kublai.com>
parents: 5064
diff changeset
254
12930b97a729 imerge: gussy up dispatcher to support subcommand opts.
Brendan Cully <brendan@kublai.com>
parents: 5064
diff changeset
255 if im.ui.verbose:
12930b97a729 imerge: gussy up dispatcher to support subcommand opts.
Brendan Cully <brendan@kublai.com>
parents: 5064
diff changeset
256 p1, p2 = [short(p.node()) for p in im.wctx.parents()]
12930b97a729 imerge: gussy up dispatcher to support subcommand opts.
Brendan Cully <brendan@kublai.com>
parents: 5064
diff changeset
257 im.ui.note(_('merging %s and %s\n') % (p1, p2))
12930b97a729 imerge: gussy up dispatcher to support subcommand opts.
Brendan Cully <brendan@kublai.com>
parents: 5064
diff changeset
258
12930b97a729 imerge: gussy up dispatcher to support subcommand opts.
Brendan Cully <brendan@kublai.com>
parents: 5064
diff changeset
259 conflicts = im.conflicts.keys()
12930b97a729 imerge: gussy up dispatcher to support subcommand opts.
Brendan Cully <brendan@kublai.com>
parents: 5064
diff changeset
260 conflicts.sort()
12930b97a729 imerge: gussy up dispatcher to support subcommand opts.
Brendan Cully <brendan@kublai.com>
parents: 5064
diff changeset
261 remaining = dict.fromkeys(im.remaining())
12930b97a729 imerge: gussy up dispatcher to support subcommand opts.
Brendan Cully <brendan@kublai.com>
parents: 5064
diff changeset
262 st = []
12930b97a729 imerge: gussy up dispatcher to support subcommand opts.
Brendan Cully <brendan@kublai.com>
parents: 5064
diff changeset
263 for fn in conflicts:
12930b97a729 imerge: gussy up dispatcher to support subcommand opts.
Brendan Cully <brendan@kublai.com>
parents: 5064
diff changeset
264 if opts.get('no_status'):
12930b97a729 imerge: gussy up dispatcher to support subcommand opts.
Brendan Cully <brendan@kublai.com>
parents: 5064
diff changeset
265 mode = ''
12930b97a729 imerge: gussy up dispatcher to support subcommand opts.
Brendan Cully <brendan@kublai.com>
parents: 5064
diff changeset
266 elif fn in remaining:
12930b97a729 imerge: gussy up dispatcher to support subcommand opts.
Brendan Cully <brendan@kublai.com>
parents: 5064
diff changeset
267 mode = 'U '
12930b97a729 imerge: gussy up dispatcher to support subcommand opts.
Brendan Cully <brendan@kublai.com>
parents: 5064
diff changeset
268 else:
12930b97a729 imerge: gussy up dispatcher to support subcommand opts.
Brendan Cully <brendan@kublai.com>
parents: 5064
diff changeset
269 mode = 'R '
12930b97a729 imerge: gussy up dispatcher to support subcommand opts.
Brendan Cully <brendan@kublai.com>
parents: 5064
diff changeset
270 if ((opts.get('resolved') and fn not in remaining)
12930b97a729 imerge: gussy up dispatcher to support subcommand opts.
Brendan Cully <brendan@kublai.com>
parents: 5064
diff changeset
271 or (opts.get('unresolved') and fn in remaining)):
12930b97a729 imerge: gussy up dispatcher to support subcommand opts.
Brendan Cully <brendan@kublai.com>
parents: 5064
diff changeset
272 st.append((mode, fn))
12930b97a729 imerge: gussy up dispatcher to support subcommand opts.
Brendan Cully <brendan@kublai.com>
parents: 5064
diff changeset
273 st.sort()
12930b97a729 imerge: gussy up dispatcher to support subcommand opts.
Brendan Cully <brendan@kublai.com>
parents: 5064
diff changeset
274 for (mode, fn) in st:
12930b97a729 imerge: gussy up dispatcher to support subcommand opts.
Brendan Cully <brendan@kublai.com>
parents: 5064
diff changeset
275 if im.ui.verbose:
12930b97a729 imerge: gussy up dispatcher to support subcommand opts.
Brendan Cully <brendan@kublai.com>
parents: 5064
diff changeset
276 fo, fd = im.conflicts[fn]
12930b97a729 imerge: gussy up dispatcher to support subcommand opts.
Brendan Cully <brendan@kublai.com>
parents: 5064
diff changeset
277 if fd != fn:
12930b97a729 imerge: gussy up dispatcher to support subcommand opts.
Brendan Cully <brendan@kublai.com>
parents: 5064
diff changeset
278 fn = '%s (%s)' % (fn, fd)
12930b97a729 imerge: gussy up dispatcher to support subcommand opts.
Brendan Cully <brendan@kublai.com>
parents: 5064
diff changeset
279 im.ui.write('%s%s\n' % (mode, fn))
12930b97a729 imerge: gussy up dispatcher to support subcommand opts.
Brendan Cully <brendan@kublai.com>
parents: 5064
diff changeset
280 if opts.get('unresolved') and not remaining:
12930b97a729 imerge: gussy up dispatcher to support subcommand opts.
Brendan Cully <brendan@kublai.com>
parents: 5064
diff changeset
281 im.ui.write(_('all conflicts resolved\n'))
12930b97a729 imerge: gussy up dispatcher to support subcommand opts.
Brendan Cully <brendan@kublai.com>
parents: 5064
diff changeset
282
5042
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
283 return 0
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
284
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
285 def unresolve(im, *files):
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
286 if not files:
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
287 raise util.Abort('unresolve requires at least one filename')
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
288 return im.unresolve(files)
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
289
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
290 subcmdtable = {
5065
12930b97a729 imerge: gussy up dispatcher to support subcommand opts.
Brendan Cully <brendan@kublai.com>
parents: 5064
diff changeset
291 'load': (load, []),
5223
3786ef8877d5 imerge: add automerge flag to attempt to batch merge all conflicts
Brendan Cully <brendan@kublai.com>
parents: 5221
diff changeset
292 'merge':
3786ef8877d5 imerge: add automerge flag to attempt to batch merge all conflicts
Brendan Cully <brendan@kublai.com>
parents: 5221
diff changeset
293 (merge_,
3786ef8877d5 imerge: add automerge flag to attempt to batch merge all conflicts
Brendan Cully <brendan@kublai.com>
parents: 5221
diff changeset
294 [('a', 'auto', None, _('automatically resolve if possible'))]),
5065
12930b97a729 imerge: gussy up dispatcher to support subcommand opts.
Brendan Cully <brendan@kublai.com>
parents: 5064
diff changeset
295 'next': (next, []),
12930b97a729 imerge: gussy up dispatcher to support subcommand opts.
Brendan Cully <brendan@kublai.com>
parents: 5064
diff changeset
296 'resolve': (resolve, []),
12930b97a729 imerge: gussy up dispatcher to support subcommand opts.
Brendan Cully <brendan@kublai.com>
parents: 5064
diff changeset
297 'save': (save, []),
5223
3786ef8877d5 imerge: add automerge flag to attempt to batch merge all conflicts
Brendan Cully <brendan@kublai.com>
parents: 5221
diff changeset
298 'status':
3786ef8877d5 imerge: add automerge flag to attempt to batch merge all conflicts
Brendan Cully <brendan@kublai.com>
parents: 5221
diff changeset
299 (status,
3786ef8877d5 imerge: add automerge flag to attempt to batch merge all conflicts
Brendan Cully <brendan@kublai.com>
parents: 5221
diff changeset
300 [('n', 'no-status', None, _('hide status prefix')),
3786ef8877d5 imerge: add automerge flag to attempt to batch merge all conflicts
Brendan Cully <brendan@kublai.com>
parents: 5221
diff changeset
301 ('', 'resolved', None, _('only show resolved conflicts')),
3786ef8877d5 imerge: add automerge flag to attempt to batch merge all conflicts
Brendan Cully <brendan@kublai.com>
parents: 5221
diff changeset
302 ('', 'unresolved', None, _('only show unresolved conflicts'))]),
5065
12930b97a729 imerge: gussy up dispatcher to support subcommand opts.
Brendan Cully <brendan@kublai.com>
parents: 5064
diff changeset
303 'unresolve': (unresolve, [])
5042
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
304 }
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
305
5221
8860f29447c1 imerge: fix ancestor calculation
Brendan Cully <brendan@kublai.com>
parents: 5154
diff changeset
306 def dispatch_(im, args, opts):
5042
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
307 def complete(s, choices):
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
308 candidates = []
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
309 for choice in choices:
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
310 if choice.startswith(s):
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
311 candidates.append(choice)
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
312 return candidates
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
313
5065
12930b97a729 imerge: gussy up dispatcher to support subcommand opts.
Brendan Cully <brendan@kublai.com>
parents: 5064
diff changeset
314 c, args = args[0], list(args[1:])
5042
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
315 cmd = complete(c, subcmdtable.keys())
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
316 if not cmd:
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
317 raise cmdutil.UnknownCommand('imerge ' + c)
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
318 if len(cmd) > 1:
5056
34a54cc5df1b imerge: sorted() is only available in python2.4 and above
Thomas Arendsen Hein <thomas@intevation.de>
parents: 5055
diff changeset
319 cmd.sort()
34a54cc5df1b imerge: sorted() is only available in python2.4 and above
Thomas Arendsen Hein <thomas@intevation.de>
parents: 5055
diff changeset
320 raise cmdutil.AmbiguousCommand('imerge ' + c, cmd)
5042
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
321 cmd = cmd[0]
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
322
5065
12930b97a729 imerge: gussy up dispatcher to support subcommand opts.
Brendan Cully <brendan@kublai.com>
parents: 5064
diff changeset
323 func, optlist = subcmdtable[cmd]
12930b97a729 imerge: gussy up dispatcher to support subcommand opts.
Brendan Cully <brendan@kublai.com>
parents: 5064
diff changeset
324 opts = {}
5042
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
325 try:
5065
12930b97a729 imerge: gussy up dispatcher to support subcommand opts.
Brendan Cully <brendan@kublai.com>
parents: 5064
diff changeset
326 args = fancyopts.fancyopts(args, optlist, opts)
12930b97a729 imerge: gussy up dispatcher to support subcommand opts.
Brendan Cully <brendan@kublai.com>
parents: 5064
diff changeset
327 return func(im, *args, **opts)
12930b97a729 imerge: gussy up dispatcher to support subcommand opts.
Brendan Cully <brendan@kublai.com>
parents: 5064
diff changeset
328 except fancyopts.getopt.GetoptError, inst:
5221
8860f29447c1 imerge: fix ancestor calculation
Brendan Cully <brendan@kublai.com>
parents: 5154
diff changeset
329 raise dispatch.ParseError('imerge', '%s: %s' % (cmd, inst))
5042
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
330 except TypeError:
5221
8860f29447c1 imerge: fix ancestor calculation
Brendan Cully <brendan@kublai.com>
parents: 5154
diff changeset
331 raise dispatch.ParseError('imerge', _('%s: invalid arguments') % cmd)
5042
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
332
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
333 def imerge(ui, repo, *args, **opts):
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
334 '''interactive merge
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
335
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
336 imerge lets you split a merge into pieces. When you start a merge
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
337 with imerge, the names of all files with conflicts are recorded.
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
338 You can then merge any of these files, and if the merge is
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
339 successful, they will be marked as resolved. When all files are
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
340 resolved, the merge is complete.
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
341
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
342 If no merge is in progress, hg imerge [rev] will merge the working
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
343 directory with rev (defaulting to the other head if the repository
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
344 only has two heads). You may also resume a saved merge with
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
345 hg imerge load <file>.
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
346
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
347 If a merge is in progress, hg imerge will default to merging the
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
348 next unresolved file.
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
349
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
350 The following subcommands are available:
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
351
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
352 status:
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
353 show the current state of the merge
5221
8860f29447c1 imerge: fix ancestor calculation
Brendan Cully <brendan@kublai.com>
parents: 5154
diff changeset
354 options:
8860f29447c1 imerge: fix ancestor calculation
Brendan Cully <brendan@kublai.com>
parents: 5154
diff changeset
355 -n --no-status: do not print the status prefix
8860f29447c1 imerge: fix ancestor calculation
Brendan Cully <brendan@kublai.com>
parents: 5154
diff changeset
356 --resolved: only print resolved conflicts
8860f29447c1 imerge: fix ancestor calculation
Brendan Cully <brendan@kublai.com>
parents: 5154
diff changeset
357 --unresolved: only print unresolved conflicts
5042
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
358 next:
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
359 show the next unresolved file merge
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
360 merge [<file>]:
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
361 merge <file>. If the file merge is successful, the file will be
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
362 recorded as resolved. If no file is given, the next unresolved
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
363 file will be merged.
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
364 resolve <file>...:
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
365 mark files as successfully merged
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
366 unresolve <file>...:
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
367 mark files as requiring merging.
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
368 save <file>:
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
369 save the state of the merge to a file to be resumed elsewhere
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
370 load <file>:
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
371 load the state of the merge from a file created by save
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
372 '''
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
373
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
374 im = Imerge(ui, repo)
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
375
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
376 if im.merging():
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
377 im.resume()
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
378 else:
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
379 rev = opts.get('rev')
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
380 if rev and args:
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
381 raise util.Abort('please specify just one revision')
5117
d4fa6bafc43a Remove trailing spaces, fix indentation
Thomas Arendsen Hein <thomas@intevation.de>
parents: 5065
diff changeset
382
5042
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
383 if len(args) == 2 and args[0] == 'load':
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
384 pass
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
385 else:
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
386 if args:
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
387 rev = args[0]
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
388 im.start(rev=rev)
5223
3786ef8877d5 imerge: add automerge flag to attempt to batch merge all conflicts
Brendan Cully <brendan@kublai.com>
parents: 5221
diff changeset
389 if opts.get('auto'):
3786ef8877d5 imerge: add automerge flag to attempt to batch merge all conflicts
Brendan Cully <brendan@kublai.com>
parents: 5221
diff changeset
390 args = ['merge', '--auto']
3786ef8877d5 imerge: add automerge flag to attempt to batch merge all conflicts
Brendan Cully <brendan@kublai.com>
parents: 5221
diff changeset
391 else:
3786ef8877d5 imerge: add automerge flag to attempt to batch merge all conflicts
Brendan Cully <brendan@kublai.com>
parents: 5221
diff changeset
392 args = ['status']
5042
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
393
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
394 if not args:
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
395 args = ['merge']
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
396
5221
8860f29447c1 imerge: fix ancestor calculation
Brendan Cully <brendan@kublai.com>
parents: 5154
diff changeset
397 return dispatch_(im, args, opts)
5042
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
398
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
399 cmdtable = {
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
400 '^imerge':
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
401 (imerge,
5223
3786ef8877d5 imerge: add automerge flag to attempt to batch merge all conflicts
Brendan Cully <brendan@kublai.com>
parents: 5221
diff changeset
402 [('r', 'rev', '', _('revision to merge')),
3786ef8877d5 imerge: add automerge flag to attempt to batch merge all conflicts
Brendan Cully <brendan@kublai.com>
parents: 5221
diff changeset
403 ('a', 'auto', None, _('automatically merge where possible'))],
3786ef8877d5 imerge: add automerge flag to attempt to batch merge all conflicts
Brendan Cully <brendan@kublai.com>
parents: 5221
diff changeset
404 'hg imerge [command]')
5042
58006f8b8275 imerge extension and test
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
405 }