def __call__(self, oldrevid, newrevid, newparents): """Replay a commit in a working tree, with a different base. :param oldrevid: Old revision id :param newrevid: New revision id :param newparents: New parent revision ids """ repository = self.wt.branch.repository if self.merge_type is None: from bzrlib.merge import Merge3Merger merge_type = Merge3Merger else: merge_type = self.merge_type oldrev = self.wt.branch.repository.get_revision(oldrevid) # Make sure there are no conflicts or pending merges/changes # in the working tree complete_revert(self.wt, [newparents[0]]) assert not self.wt.changes_from(self.wt.basis_tree()).has_changed(), "Changes in rev" oldtree = repository.revision_tree(oldrevid) self.state.write_active_revid(oldrevid) merger = Merger(self.wt.branch, this_tree=self.wt) merger.set_other_revision(oldrevid, self.wt.branch) base_revid = self.determine_base(oldrevid, oldrev.parent_ids, newrevid, newparents) mutter('replaying %r as %r with base %r and new parents %r' % (oldrevid, newrevid, base_revid, newparents)) merger.set_base_revision(base_revid, self.wt.branch) merger.merge_type = merge_type merger.do_merge() for newparent in newparents[1:]: self.wt.add_pending_merge(newparent) self.commit_rebase(oldrev, newrevid) self.state.write_active_revid(None)