# HG changeset patch # User Brendan Cully # Date 1186189520 25200 # Node ID 86327d13d9161ef341c55da93d7ff4bd3ef951c5 # Parent ec70fd08e16c531f4ea6fbef8ff78970819f1247 imerge: handle renames diff --git a/hgext/imerge.py b/hgext/imerge.py --- a/hgext/imerge.py +++ b/hgext/imerge.py @@ -23,8 +23,9 @@ class ImergeStateFile(object): tf.add(st, os.path.join('.hg', 'imerge', 'status')) for f in self.im.resolved: - abssrc = self.im.repo.wjoin(f) - tf.add(abssrc, f) + (fd, fo) = self.im.conflicts[f] + abssrc = self.im.repo.wjoin(fd) + tf.add(abssrc, fd) tf.close() @@ -39,12 +40,10 @@ class ImergeStateFile(object): raise InvalidStateFileException('no status file') tf.extract(statusfile, self.im.repo.root) - self.im.load() - p1 = self.im.parents[0].node() - p2 = self.im.parents[1].node() - if self.im.repo.dirstate.parents()[0] != p1: - hg.clean(self.im.repo, self.im.parents[0].node()) - self.im.start(p2) + p1, p2 = self.im.load() + if self.im.repo.dirstate.parents()[0] != p1.node(): + hg.clean(self.im.repo, p1.node()) + self.im.start(p2.node()) tf.extractall(self.im.repo.root) self.im.load() @@ -56,13 +55,12 @@ class Imerge(object): self.path = repo.join('imerge') self.opener = util.opener(self.path) - self.parents = [self.repo.changectx(n) - for n in self.repo.dirstate.parents()] + self.wctx = self.repo.workingctx() self.conflicts = {} self.resolved = [] def merging(self): - return self.parents[1].node() != nullid + return len(self.wctx.parents()) > 1 def load(self): # status format. \0-delimited file, fields are @@ -76,7 +74,7 @@ class Imerge(object): raise util.Abort('invalid imerge status file') try: - self.parents = [self.repo.changectx(n) for n in status[:2]] + parents = [self.repo.changectx(n) for n in status[:2]] except LookupError: raise util.Abort('merge parent %s not in repository' % short(p)) @@ -86,6 +84,8 @@ class Imerge(object): for i in xrange(0, conflicts, 3): self.conflicts[status[i]] = (status[i+1], status[i+2]) + return parents + def save(self): lock = self.repo.lock() @@ -93,7 +93,7 @@ class Imerge(object): os.mkdir(self.path) fd = self.opener('status', 'wb') - out = [hex(n.node()) for n in self.parents] + out = [hex(n.node()) for n in self.wctx.parents()] out.append(str(len(self.conflicts))) for f in sorted(self.conflicts): out.append(f) @@ -109,8 +109,8 @@ class Imerge(object): wlock = self.repo.wlock() (fd, fo) = self.conflicts[fn] - return merge.filemerge(self.repo, fn, fd, fo, self.parents[0], - self.parents[1]) + p2 = self.wctx.parents()[1] + return merge.filemerge(self.repo, fn, fd, fo, self.wctx, p2) def start(self, rev=None): _filemerge = merge.filemerge @@ -121,21 +121,21 @@ class Imerge(object): commands.merge(self.ui, self.repo, rev=rev) merge.filemerge = _filemerge - self.parents = [self.repo.changectx(n) - for n in self.repo.dirstate.parents()] + self.wctx = self.repo.workingctx() self.save() def resume(self): self.load() dp = self.repo.dirstate.parents() - if self.parents[0].node() != dp[0] or self.parents[1].node() != dp[1]: + p1, p2 = self.wctx.parents() + if p1.node() != dp[0] or p2.node() != dp[1]: raise util.Abort('imerge state does not match working directory') def status(self): + p1, p2 = self.wctx.parents() self.ui.write('merging %s and %s\n' % \ - (short(self.parents[0].node()), - short(self.parents[1].node()))) + (short(p1.node()), short(p2.node()))) if self.resolved: self.ui.write('resolved:\n') diff --git a/tests/test-imerge b/tests/test-imerge --- a/tests/test-imerge +++ b/tests/test-imerge @@ -12,7 +12,8 @@ echo foo > foo echo bar > bar hg ci -Am0 -d '0 0' -echo foo >> foo +hg mv foo foo2 +echo foo >> foo2 hg ci -m1 -d '1 0' hg up -C 0 @@ -23,14 +24,17 @@ hg ci -m2 -d '2 0' echo % start imerge hg imerge -cat foo +cat foo2 cat bar echo % status hg imerge st +echo % next +hg imerge next + echo % merge next -hg imerge +hg --traceback imerge echo % unresolve hg imerge unres foo @@ -39,13 +43,13 @@ echo % merge foo hg imerge merge foo echo % save -echo foo > foo +echo foo > foo2 hg imerge save ../savedmerge echo % load hg up -C 0 hg imerge --traceback load ../savedmerge -cat foo +cat foo2 hg ci -m'merged' -d '3 0' hg tip -v diff --git a/tests/test-imerge.out b/tests/test-imerge.out --- a/tests/test-imerge.out +++ b/tests/test-imerge.out @@ -1,45 +1,47 @@ adding bar adding foo -1 files updated, 0 files merged, 0 files removed, 0 files unresolved +1 files updated, 0 files merged, 1 files removed, 0 files unresolved % start imerge 1 files updated, 0 files merged, 0 files removed, 0 files unresolved (branch merge, don't forget to commit) -merging e6da46716401 and 1c0a86e7db0d +merging e6da46716401 and 30d266f502e7 remaining: - foo + foo (foo2) foo bar bar bar % status -merging e6da46716401 and 1c0a86e7db0d +merging e6da46716401 and 30d266f502e7 remaining: - foo + foo (foo2) +% next +foo % merge next -merging foo +merging foo and foo2 all conflicts resolved % unresolve % merge foo -merging foo +merging foo and foo2 all conflicts resolved % save % load -2 files updated, 0 files merged, 0 files removed, 0 files unresolved +2 files updated, 0 files merged, 1 files removed, 0 files unresolved 2 files updated, 0 files merged, 0 files removed, 0 files unresolved 1 files updated, 0 files merged, 0 files removed, 0 files unresolved (branch merge, don't forget to commit) -merging e6da46716401 and 1c0a86e7db0d +merging e6da46716401 and 30d266f502e7 resolved: foo all conflicts resolved foo -changeset: 3:eaf80a943462 +changeset: 3:fa9a6defdcaf tag: tip parent: 2:e6da46716401 -parent: 1:1c0a86e7db0d +parent: 1:30d266f502e7 user: test date: Thu Jan 01 00:00:03 1970 +0000 -files: foo +files: foo foo2 description: merged