[PATCH 22 of 23 v2] rebase: move rebase finish logic to be a method of the rebase runtime class

Kostia Balytskyi ikostia at fb.com
Tue May 31 19:23:42 EDT 2016


# HG changeset patch
# User Kostia Balytskyi <ikostia at fb.com>
# Date 1464612827 -3600
#      Mon May 30 13:53:47 2016 +0100
# Node ID 3258b18e240aaa2b0190144fb2f27d3600b96c05
# Parent  3b61bd49e233dbb6e970c467daa0d38441fc8034
rebase: move rebase finish logic to be a method of the rebase runtime class

Rebase finish logic includes collapsing wd state into a single commit,
moving bookmarks, clearing status and collapsemsg files, reporting skipped
commits to the user and obsoleting precursors of the newly created commits.

diff --git a/hgext/rebase.py b/hgext/rebase.py
--- a/hgext/rebase.py
+++ b/hgext/rebase.py
@@ -464,6 +464,88 @@
         ui.progress(_('rebasing'), None)
         ui.note(_('rebase merging completed\n'))
 
+    def _finishrebase(self):
+        repo, ui, opts = self.repo, self.ui, self.opts
+        if self.collapsef and not self.keepopen:
+            p1, p2, _base = defineparents(repo, min(self.state),
+                                          self.target, self.state,
+                                          self.targetancestors,
+                                          self.obsoletenotrebased)
+            editopt = opts.get('edit')
+            editform = 'rebase.collapse'
+            if self.collapsemsg:
+                commitmsg = self.collapsemsg
+            else:
+                commitmsg = 'Collapsed revision'
+                for rebased in self.state:
+                    if rebased not in self.skipped and\
+                       self.state[rebased] > nullmerge:
+                        commitmsg += '\n* %s' % repo[rebased].description()
+                editopt = True
+            editor = cmdutil.getcommiteditor(edit=editopt, editform=editform)
+            revtoreuse = self.sortedstate[-1]
+            newnode = concludenode(repo, revtoreuse, p1, self.external,
+                                   commitmsg=commitmsg,
+                                   extrafn=self.extrafn, editor=editor,
+                                   keepbranches=self.keepbranchesf,
+                                   date=self.date)
+            if newnode is None:
+                newrev = self.target
+            else:
+                newrev = repo[newnode].rev()
+            for oldrev in self.state.iterkeys():
+                if self.state[oldrev] > nullmerge:
+                    self.state[oldrev] = newrev
+
+        if 'qtip' in repo.tags():
+            updatemq(repo, self.state, self.skipped, **opts)
+
+        if self.currentbookmarks:
+            # Nodeids are needed to reset bookmarks
+            nstate = {}
+            for k, v in self.state.iteritems():
+                if v > nullmerge:
+                    nstate[repo[k].node()] = repo[v].node()
+            # XXX this is the same as dest.node() for the non-continue path --
+            # this should probably be cleaned up
+            targetnode = repo[self.target].node()
+
+        # restore original working directory
+        # (we do this before stripping)
+        newwd = self.state.get(self.originalwd, self.originalwd)
+        if newwd < 0:
+            # original directory is a parent of rebase set root or ignored
+            newwd = self.originalwd
+        if newwd not in [c.rev() for c in repo[None].parents()]:
+            ui.note(_("update back to initial working directory parent\n"))
+            hg.updaterepo(repo, newwd, False)
+
+        if not self.keepf:
+            collapsedas = None
+            if self.collapsef:
+                collapsedas = newnode
+            clearrebased(ui, repo, self.state, self.skipped, collapsedas)
+
+        with repo.transaction('bookmark') as tr:
+            if self.currentbookmarks:
+                updatebookmarks(repo, targetnode, nstate,
+                                self.currentbookmarks, tr)
+                if self.activebookmark not in repo._bookmarks:
+                    # active bookmark was divergent one and has been deleted
+                    self.activebookmark = None
+        clearstatus(repo)
+        clearcollapsemsg(repo)
+
+        ui.note(_("rebase completed\n"))
+        util.unlinkpath(repo.sjoin('undo'), ignoremissing=True)
+        if self.skipped:
+            skippedlen = len(self.skipped)
+            ui.note(_("%d revisions have been skipped\n") % skippedlen)
+
+        if (self.activebookmark and
+            repo['.'].node() == repo._bookmarks[self.activebookmark]):
+                bookmarks.activate(repo, self.activebookmark)
+
 @command('rebase',
     [('s', 'source', '',
      _('rebase the specified changeset and descendants'), _('REV')),
@@ -592,87 +674,7 @@
                 return retcode
 
         rtstate._performrebase()
-
-        if rtstate.collapsef and not rtstate.keepopen:
-            p1, p2, _base = defineparents(repo, min(rtstate.state),
-                                          rtstate.target, rtstate.state,
-                                          rtstate.targetancestors,
-                                          rtstate.obsoletenotrebased)
-            editopt = opts.get('edit')
-            editform = 'rebase.collapse'
-            if rtstate.collapsemsg:
-                commitmsg = rtstate.collapsemsg
-            else:
-                commitmsg = 'Collapsed revision'
-                for rebased in rtstate.state:
-                    if rebased not in rtstate.skipped and\
-                       rtstate.state[rebased] > nullmerge:
-                        commitmsg += '\n* %s' % repo[rebased].description()
-                editopt = True
-            editor = cmdutil.getcommiteditor(edit=editopt, editform=editform)
-            revtoreuse = rtstate.sortedstate[-1]
-            newnode = concludenode(repo, revtoreuse, p1, rtstate.external,
-                                   commitmsg=commitmsg,
-                                   extrafn=rtstate.extrafn, editor=editor,
-                                   keepbranches=rtstate.keepbranchesf,
-                                   date=rtstate.date)
-            if newnode is None:
-                newrev = rtstate.target
-            else:
-                newrev = repo[newnode].rev()
-            for oldrev in rtstate.state.iterkeys():
-                if rtstate.state[oldrev] > nullmerge:
-                    rtstate.state[oldrev] = newrev
-
-        if 'qtip' in repo.tags():
-            updatemq(repo, rtstate.state, rtstate.skipped, **opts)
-
-        if rtstate.currentbookmarks:
-            # Nodeids are needed to reset bookmarks
-            nstate = {}
-            for k, v in rtstate.state.iteritems():
-                if v > nullmerge:
-                    nstate[repo[k].node()] = repo[v].node()
-            # XXX this is the same as dest.node() for the non-continue path --
-            # this should probably be cleaned up
-            targetnode = repo[rtstate.target].node()
-
-        # restore original working directory
-        # (we do this before stripping)
-        newwd = rtstate.state.get(rtstate.originalwd, rtstate.originalwd)
-        if newwd < 0:
-            # original directory is a parent of rebase set root or ignored
-            newwd = rtstate.originalwd
-        if newwd not in [c.rev() for c in repo[None].parents()]:
-            ui.note(_("update back to initial working directory parent\n"))
-            hg.updaterepo(repo, newwd, False)
-
-        if not rtstate.keepf:
-            collapsedas = None
-            if rtstate.collapsef:
-                collapsedas = newnode
-            clearrebased(ui, repo, rtstate.state, rtstate.skipped, collapsedas)
-
-        with repo.transaction('bookmark') as tr:
-            if rtstate.currentbookmarks:
-                updatebookmarks(repo, targetnode, nstate,
-                                rtstate.currentbookmarks, tr)
-                if rtstate.activebookmark not in repo._bookmarks:
-                    # active bookmark was divergent one and has been deleted
-                    rtstate.activebookmark = None
-        clearstatus(repo)
-        clearcollapsemsg(repo)
-
-        ui.note(_("rebase completed\n"))
-        util.unlinkpath(repo.sjoin('undo'), ignoremissing=True)
-        if rtstate.skipped:
-            skippedlen = len(rtstate.skipped)
-            ui.note(_("%d revisions have been skipped\n") % skippedlen)
-
-        if (rtstate.activebookmark and
-            repo['.'].node() == repo._bookmarks[rtstate.activebookmark]):
-                bookmarks.activate(repo, rtstate.activebookmark)
-
+        rtstate._finishrebase()
     finally:
         release(lock, wlock)
 


More information about the Mercurial-devel mailing list