# HG changeset patch # User Martin von Zweigbergk # Date 1520181689 28800 # Node ID c8eb8d1fc6cfc8ca60d9b48904e5d26bc39ba00d # Parent b7823bd59b078bfdf7ce9c208a4f9e3d470fa5c0 rebase: move abort() onto rebaseruntime The function depends on a lot of the state of rebaseruntime, so it makes sense for it to be an instance method. This will let us remove many of the arguments to the method. That will be done in a later patch. Differential Revision: https://phab.mercurial-scm.org/D5392 diff -r b7823bd59b07 -r c8eb8d1fc6cf hgext/rebase.py --- a/hgext/rebase.py Wed Mar 21 16:46:28 2018 -0700 +++ b/hgext/rebase.py Sun Mar 04 08:41:29 2018 -0800 @@ -347,9 +347,9 @@ if isabort: backup = backup and self.backupf - return abort(self.repo, self.originalwd, self.destmap, self.state, - activebookmark=self.activebookmark, backup=backup, - suppwarns=suppwarns) + return self._abort(self.repo, self.originalwd, self.destmap, + self.state, activebookmark=self.activebookmark, + backup=backup, suppwarns=suppwarns) def _preparenewrebase(self, destmap): if not destmap: @@ -653,6 +653,66 @@ repo['.'].node() == repo._bookmarks[self.activebookmark]): bookmarks.activate(repo, self.activebookmark) + def _abort(self, repo, originalwd, destmap, state, activebookmark=None, + backup=True, suppwarns=False): + '''Restore the repository to its original state. Additional args: + + activebookmark: the name of the bookmark that should be active after the + restore''' + + try: + # If the first commits in the rebased set get skipped during the + # rebase, their values within the state mapping will be the dest + # rev id. The rebased list must must not contain the dest rev + # (issue4896) + rebased = [s for r, s in state.items() + if s >= 0 and s != r and s != destmap[r]] + immutable = [d for d in rebased if not repo[d].mutable()] + cleanup = True + if immutable: + repo.ui.warn(_("warning: can't clean up public changesets %s\n") + % ', '.join(bytes(repo[r]) for r in immutable), + hint=_("see 'hg help phases' for details")) + cleanup = False + + descendants = set() + if rebased: + descendants = set(repo.changelog.descendants(rebased)) + if descendants - set(rebased): + repo.ui.warn(_("warning: new changesets detected on " + "destination branch, can't strip\n")) + cleanup = False + + if cleanup: + shouldupdate = False + if rebased: + strippoints = [ + c.node() for c in repo.set('roots(%ld)', rebased)] + + updateifonnodes = set(rebased) + updateifonnodes.update(destmap.values()) + updateifonnodes.add(originalwd) + shouldupdate = repo['.'].rev() in updateifonnodes + + # Update away from the rebase if necessary + if shouldupdate or needupdate(repo, state): + mergemod.update(repo, originalwd, branchmerge=False, + force=True) + + # Strip from the first rebased revision + if rebased: + repair.strip(repo.ui, repo, strippoints, backup=backup) + + if activebookmark and activebookmark in repo._bookmarks: + bookmarks.activate(repo, activebookmark) + + finally: + clearstatus(repo) + clearcollapsemsg(repo) + if not suppwarns: + repo.ui.warn(_('rebase aborted\n')) + return 0 + @command('rebase', [('s', 'source', '', _('rebase the specified changeset and descendants'), _('REV')), @@ -1609,64 +1669,6 @@ return False -def abort(repo, originalwd, destmap, state, activebookmark=None, backup=True, - suppwarns=False): - '''Restore the repository to its original state. Additional args: - - activebookmark: the name of the bookmark that should be active after the - restore''' - - try: - # If the first commits in the rebased set get skipped during the rebase, - # their values within the state mapping will be the dest rev id. The - # rebased list must must not contain the dest rev (issue4896) - rebased = [s for r, s in state.items() - if s >= 0 and s != r and s != destmap[r]] - immutable = [d for d in rebased if not repo[d].mutable()] - cleanup = True - if immutable: - repo.ui.warn(_("warning: can't clean up public changesets %s\n") - % ', '.join(bytes(repo[r]) for r in immutable), - hint=_("see 'hg help phases' for details")) - cleanup = False - - descendants = set() - if rebased: - descendants = set(repo.changelog.descendants(rebased)) - if descendants - set(rebased): - repo.ui.warn(_("warning: new changesets detected on destination " - "branch, can't strip\n")) - cleanup = False - - if cleanup: - shouldupdate = False - if rebased: - strippoints = [ - c.node() for c in repo.set('roots(%ld)', rebased)] - - updateifonnodes = set(rebased) - updateifonnodes.update(destmap.values()) - updateifonnodes.add(originalwd) - shouldupdate = repo['.'].rev() in updateifonnodes - - # Update away from the rebase if necessary - if shouldupdate or needupdate(repo, state): - mergemod.update(repo, originalwd, branchmerge=False, force=True) - - # Strip from the first rebased revision - if rebased: - repair.strip(repo.ui, repo, strippoints, backup=backup) - - if activebookmark and activebookmark in repo._bookmarks: - bookmarks.activate(repo, activebookmark) - - finally: - clearstatus(repo) - clearcollapsemsg(repo) - if not suppwarns: - repo.ui.warn(_('rebase aborted\n')) - return 0 - def sortsource(destmap): """yield source revisions in an order that we only rebase things once