changeset 29478:007da66960a8

rebase: move rebase finish logic to be a method of the RR class Rebase finish logic includes collapsing working directorystate 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.
author Kostia Balytskyi <ikostia@fb.com>
date Fri, 01 Jul 2016 14:09:53 +0200
parents becc4c6eca42
children 5d16ebe7b14f
files hgext/rebase.py
diffstat 1 files changed, 88 insertions(+), 86 deletions(-) [+]
line wrap: on
line diff
--- a/hgext/rebase.py	Fri Jul 01 14:09:53 2016 +0200
+++ b/hgext/rebase.py	Fri Jul 01 14:09:53 2016 +0200
@@ -423,6 +423,93 @@
         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()
+                elif v == revprecursor:
+                    succ = self.obsoletenotrebased[k]
+                    nstate[repo[k].node()] = repo[succ].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 == revprecursor:
+            newwd = self.obsoletenotrebased[self.originalwd]
+        elif 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')),
@@ -588,92 +675,7 @@
                 return retcode
 
         rbsrt._performrebase()
-
-        if rbsrt.collapsef and not rbsrt.keepopen:
-            p1, p2, _base = defineparents(repo, min(rbsrt.state),
-                                          rbsrt.target, rbsrt.state,
-                                          rbsrt.targetancestors,
-                                          rbsrt.obsoletenotrebased)
-            editopt = opts.get('edit')
-            editform = 'rebase.collapse'
-            if rbsrt.collapsemsg:
-                commitmsg = rbsrt.collapsemsg
-            else:
-                commitmsg = 'Collapsed revision'
-                for rebased in rbsrt.state:
-                    if rebased not in rbsrt.skipped and\
-                       rbsrt.state[rebased] > nullmerge:
-                        commitmsg += '\n* %s' % repo[rebased].description()
-                editopt = True
-            editor = cmdutil.getcommiteditor(edit=editopt, editform=editform)
-            revtoreuse = rbsrt.sortedstate[-1]
-            newnode = concludenode(repo, revtoreuse, p1, rbsrt.external,
-                                   commitmsg=commitmsg,
-                                   extrafn=rbsrt.extrafn, editor=editor,
-                                   keepbranches=rbsrt.keepbranchesf,
-                                   date=rbsrt.date)
-            if newnode is None:
-                newrev = rbsrt.target
-            else:
-                newrev = repo[newnode].rev()
-            for oldrev in rbsrt.state.iterkeys():
-                if rbsrt.state[oldrev] > nullmerge:
-                    rbsrt.state[oldrev] = newrev
-
-        if 'qtip' in repo.tags():
-            updatemq(repo, rbsrt.state, rbsrt.skipped, **opts)
-
-        if rbsrt.currentbookmarks:
-            # Nodeids are needed to reset bookmarks
-            nstate = {}
-            for k, v in rbsrt.state.iteritems():
-                if v > nullmerge:
-                    nstate[repo[k].node()] = repo[v].node()
-                elif v == revprecursor:
-                    succ = rbsrt.obsoletenotrebased[k]
-                    nstate[repo[k].node()] = repo[succ].node()
-            # XXX this is the same as dest.node() for the non-continue path --
-            # this should probably be cleaned up
-            targetnode = repo[rbsrt.target].node()
-
-        # restore original working directory
-        # (we do this before stripping)
-        newwd = rbsrt.state.get(rbsrt.originalwd, rbsrt.originalwd)
-        if newwd == revprecursor:
-            newwd = rbsrt.obsoletenotrebased[rbsrt.originalwd]
-        elif newwd < 0:
-            # original directory is a parent of rebase set root or ignored
-            newwd = rbsrt.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 rbsrt.keepf:
-            collapsedas = None
-            if rbsrt.collapsef:
-                collapsedas = newnode
-            clearrebased(ui, repo, rbsrt.state, rbsrt.skipped, collapsedas)
-
-        with repo.transaction('bookmark') as tr:
-            if rbsrt.currentbookmarks:
-                updatebookmarks(repo, targetnode, nstate,
-                                rbsrt.currentbookmarks, tr)
-                if rbsrt.activebookmark not in repo._bookmarks:
-                    # active bookmark was divergent one and has been deleted
-                    rbsrt.activebookmark = None
-        clearstatus(repo)
-        clearcollapsemsg(repo)
-
-        ui.note(_("rebase completed\n"))
-        util.unlinkpath(repo.sjoin('undo'), ignoremissing=True)
-        if rbsrt.skipped:
-            skippedlen = len(rbsrt.skipped)
-            ui.note(_("%d revisions have been skipped\n") % skippedlen)
-
-        if (rbsrt.activebookmark and
-            repo['.'].node() == repo._bookmarks[rbsrt.activebookmark]):
-                bookmarks.activate(repo, rbsrt.activebookmark)
-
+        rbsrt._finishrebase()
     finally:
         release(lock, wlock)