[PATCH 1 of 7 v5] rebase: introduce a RebaseRuntimeState (RRS) class

Kostia Balytskyi ikostia at fb.com
Mon Jun 13 17:32:46 EDT 2016


Oh shoot. I forgot to edit the commit messages to correspond to the new class name. Please disregard this series, I will send a new one. Sorry for the noise.

On 6/13/16, 10:27 PM, "Mercurial-devel on behalf of Kostia Balytskyi" <mercurial-devel-bounces at mercurial-scm.org on behalf of ikostia at fb.com> wrote:

># HG changeset patch
># User Kostia Balytskyi <ikostia at fb.com>
># Date 1465832343 -3600
>#      Mon Jun 13 16:39:03 2016 +0100
># Node ID c5a9f006e3059ba89851b0fb912a831d627d17e8
># Parent  9ac309946df9e69bb73ded75f2fc5b84a4e785c2
>rebase: introduce a RebaseRuntimeState (RRS) class
>
>RebaseRuntimeState is a class that will in future contain all of the state
>necessary to perform rebase operation and have pieces of rebase logic as
>its methods.
>
>This commit introduces the class and moves the following local variables to
>be its fields:
>- originalwd
>- external
>- state
>- activebookmark
>
>
>As per marmoute's request, I am resending the prefix of the "refactor rebase"
>series, containint only 7 patches. 6 of those have to do with refactoring
>itself, while the last one is about removing the logic to abort the rebase
>operation if all changesets have equivalents in the destination. Whoever
>will review/accept this, please remove this paragraph in flight.
>
>diff --git a/hgext/rebase.py b/hgext/rebase.py
>--- a/hgext/rebase.py
>+++ b/hgext/rebase.py
>@@ -119,6 +119,17 @@ def _revsetdestrebase(repo, subset, x):
>         sourceset = revset.getset(repo, revset.fullreposet(repo), x)
>     return subset & revset.baseset([_destrebase(repo, sourceset)])
> 
>+class rebaseruntime(object):
>+    """This class is a container for rebase runtime state"""
>+    def __init__(self):
>+        self.originalwd = None
>+        self.external = nullrev
>+        # Mapping between the old revision id and either what is the new rebased
>+        # revision or what needs to be done with the old revision. The state
>+        # dict will be what contains most of the rebase progress state.
>+        self.state = {}
>+        self.activebookmark = None
>+
> @command('rebase',
>     [('s', 'source', '',
>      _('rebase the specified changeset and descendants'), _('REV')),
>@@ -229,13 +240,8 @@ def rebase(ui, repo, **opts):
>     unresolved conflicts.
> 
>     """
>-    originalwd = target = None
>-    activebookmark = None
>-    external = nullrev
>-    # Mapping between the old revision id and either what is the new rebased
>-    # revision or what needs to be done with the old revision. The state dict
>-    # will be what contains most of the rebase progress state.
>-    state = {}
>+    rbsrt = rebaseruntime()
>+    target = None
>     skipped = set()
>     targetancestors = set()
> 
>@@ -296,8 +302,9 @@ def rebase(ui, repo, **opts):
>                 ui.warn(_('tool option will be ignored\n'))
> 
>             try:
>-                (originalwd, target, state, skipped, collapsef, keepf,
>-                 keepbranchesf, external, activebookmark) = restorestatus(repo)
>+                (rbsrt.originalwd, target, rbsrt.state, skipped,
>+                 collapsef, keepf, keepbranchesf, rbsrt.external,
>+                 rbsrt.activebookmark) = restorestatus(repo)
>                 collapsemsg = restorecollapsemsg(repo)
>             except error.RepoLookupError:
>                 if abortf:
>@@ -311,18 +318,17 @@ def rebase(ui, repo, **opts):
>                     hint = _('use "hg rebase --abort" to clear broken state')
>                     raise error.Abort(msg, hint=hint)
>             if abortf:
>-                return abort(repo, originalwd, target, state,
>-                             activebookmark=activebookmark)
>+                return abort(repo, rbsrt.originalwd, target, rbsrt.state,
>+                             activebookmark=rbsrt.activebookmark)
> 
>             obsoletenotrebased = {}
>             if ui.configbool('experimental', 'rebaseskipobsolete',
>                              default=True):
>-                rebaseobsrevs = set([r for r, status in state.items()
>-                                     if status == revprecursor])
>-                rebasesetrevs = set(state.keys())
>+                rebaseobsrevs = set([r for r, st in rbsrt.state.items()
>+                                     if st == revprecursor])
>+                rebasesetrevs = set(rbsrt.state.keys())
>                 obsoletenotrebased = _computeobsoletenotrebased(repo,
>-                                                                rebaseobsrevs,
>-                                                                target)
>+                                        rebaseobsrevs, target)
>                 rebaseobsskipped = set(obsoletenotrebased)
>                 _checkobsrebase(repo, ui, rebaseobsrevs, rebasesetrevs,
>                                 rebaseobsskipped)
>@@ -368,11 +374,12 @@ def rebase(ui, repo, **opts):
>                                  % repo[root],
>                                  hint=_('see "hg help phases" for details'))
> 
>-            originalwd, target, state = result
>+            (rbsrt.originalwd, target, rbsrt.state) = result
>             if collapsef:
>                 targetancestors = repo.changelog.ancestors([target],
>                                                            inclusive=True)
>-                external = externalparent(repo, state, targetancestors)
>+                rbsrt.external = externalparent(repo, rbsrt.state,
>+                                                       targetancestors)
> 
>             if dest.closesbranch() and not keepbranchesf:
>                 ui.status(_('reopening closed branch head %s\n') % dest)
>@@ -384,7 +391,7 @@ def rebase(ui, repo, **opts):
>             extrafns.insert(0, _savebranch)
>             if collapsef:
>                 branches = set()
>-                for rev in state:
>+                for rev in rbsrt.state:
>                     branches.add(repo[rev].branch())
>                     if len(branches) > 1:
>                         raise error.Abort(_('cannot collapse multiple named '
>@@ -396,13 +403,13 @@ def rebase(ui, repo, **opts):
> 
>         # Keep track of the current bookmarks in order to reset them later
>         currentbookmarks = repo._bookmarks.copy()
>-        activebookmark = activebookmark or repo._activebookmark
>-        if activebookmark:
>+        rbsrt.activebookmark = rbsrt.activebookmark or repo._activebookmark
>+        if rbsrt.activebookmark:
>             bookmarks.deactivate(repo)
> 
>         extrafn = _makeextrafn(extrafns)
> 
>-        sortedstate = sorted(state)
>+        sortedstate = sorted(rbsrt.state)
>         total = len(sortedstate)
>         pos = 0
>         for rev in sortedstate:
>@@ -413,15 +420,16 @@ def rebase(ui, repo, **opts):
>             if names:
>                 desc += ' (%s)' % ' '.join(names)
>             pos += 1
>-            if state[rev] == revtodo:
>+            if rbsrt.state[rev] == revtodo:
>                 ui.status(_('rebasing %s\n') % desc)
>                 ui.progress(_("rebasing"), pos, ("%d:%s" % (rev, ctx)),
>                             _('changesets'), total)
>-                p1, p2, base = defineparents(repo, rev, target, state,
>+                p1, p2, base = defineparents(repo, rev, target, rbsrt.state,
>                                              targetancestors,
>                                              obsoletenotrebased)
>-                storestatus(repo, originalwd, target, state, collapsef, keepf,
>-                            keepbranchesf, external, activebookmark)
>+                storestatus(repo, rbsrt.originalwd, target, rbsrt.state,
>+                            collapsef, keepf, keepbranchesf,
>+                            rbsrt.external, rbsrt.activebookmark)
>                 storecollapsemsg(repo, collapsemsg)
>                 if len(repo[None].parents()) == 2:
>                     repo.ui.debug('resuming interrupted rebase\n')
>@@ -429,7 +437,7 @@ def rebase(ui, repo, **opts):
>                     try:
>                         ui.setconfig('ui', 'forcemerge', opts.get('tool', ''),
>                                      'rebase')
>-                        stats = rebasenode(repo, rev, p1, base, state,
>+                        stats = rebasenode(repo, rev, p1, base, rbsrt.state,
>                                            collapsef, target)
>                         if stats and stats[3] > 0:
>                             raise error.InterventionRequired(
>@@ -453,38 +461,38 @@ def rebase(ui, repo, **opts):
>                     newnode = None
>                 # Update the state
>                 if newnode is not None:
>-                    state[rev] = repo[newnode].rev()
>+                    rbsrt.state[rev] = repo[newnode].rev()
>                     ui.debug('rebased as %s\n' % short(newnode))
>                 else:
>                     if not collapsef:
>                         ui.warn(_('note: rebase of %d:%s created no changes '
>                                   'to commit\n') % (rev, ctx))
>                         skipped.add(rev)
>-                    state[rev] = p1
>+                    rbsrt.state[rev] = p1
>                     ui.debug('next revision set to %s\n' % p1)
>-            elif state[rev] == nullmerge:
>+            elif rbsrt.state[rev] == nullmerge:
>                 ui.debug('ignoring null merge rebase of %s\n' % rev)
>-            elif state[rev] == revignored:
>+            elif rbsrt.state[rev] == revignored:
>                 ui.status(_('not rebasing ignored %s\n') % desc)
>-            elif state[rev] == revprecursor:
>+            elif rbsrt.state[rev] == revprecursor:
>                 targetctx = repo[obsoletenotrebased[rev]]
>                 desctarget = '%d:%s "%s"' % (targetctx.rev(), targetctx,
>                              targetctx.description().split('\n', 1)[0])
>                 msg = _('note: not rebasing %s, already in destination as %s\n')
>                 ui.status(msg % (desc, desctarget))
>-            elif state[rev] == revpruned:
>+            elif rbsrt.state[rev] == revpruned:
>                 msg = _('note: not rebasing %s, it has no successor\n')
>                 ui.status(msg % desc)
>             else:
>                 ui.status(_('already rebased %s as %s\n') %
>-                          (desc, repo[state[rev]]))
>+                          (desc, repo[rbsrt.state[rev]]))
> 
>         ui.progress(_('rebasing'), None)
>         ui.note(_('rebase merging completed\n'))
> 
>         if collapsef and not keepopen:
>-            p1, p2, _base = defineparents(repo, min(state), target,
>-                                          state, targetancestors,
>+            p1, p2, _base = defineparents(repo, min(rbsrt.state), target,
>+                                          rbsrt.state, targetancestors,
>                                           obsoletenotrebased)
>             editopt = opts.get('edit')
>             editform = 'rebase.collapse'
>@@ -492,12 +500,14 @@ def rebase(ui, repo, **opts):
>                 commitmsg = collapsemsg
>             else:
>                 commitmsg = 'Collapsed revision'
>-                for rebased in state:
>-                    if rebased not in skipped and state[rebased] > nullmerge:
>+                for rebased in rbsrt.state:
>+                    if rebased not in skipped and\
>+                       rbsrt.state[rebased] > nullmerge:
>                         commitmsg += '\n* %s' % repo[rebased].description()
>                 editopt = True
>             editor = cmdutil.getcommiteditor(edit=editopt, editform=editform)
>-            newnode = concludenode(repo, rev, p1, external, commitmsg=commitmsg,
>+            newnode = concludenode(repo, rev, p1, rbsrt.external,
>+                                   commitmsg=commitmsg,
>                                    extrafn=extrafn, editor=editor,
>                                    keepbranches=keepbranchesf,
>                                    date=date)
>@@ -505,17 +515,17 @@ def rebase(ui, repo, **opts):
>                 newrev = target
>             else:
>                 newrev = repo[newnode].rev()
>-            for oldrev in state.iterkeys():
>-                if state[oldrev] > nullmerge:
>-                    state[oldrev] = newrev
>+            for oldrev in rbsrt.state.iterkeys():
>+                if rbsrt.state[oldrev] > nullmerge:
>+                    rbsrt.state[oldrev] = newrev
> 
>         if 'qtip' in repo.tags():
>-            updatemq(repo, state, skipped, **opts)
>+            updatemq(repo, rbsrt.state, skipped, **opts)
> 
>         if currentbookmarks:
>             # Nodeids are needed to reset bookmarks
>             nstate = {}
>-            for k, v in state.iteritems():
>+            for k, v in rbsrt.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 --
>@@ -524,10 +534,10 @@ def rebase(ui, repo, **opts):
> 
>         # restore original working directory
>         # (we do this before stripping)
>-        newwd = state.get(originalwd, originalwd)
>+        newwd = rbsrt.state.get(rbsrt.originalwd, rbsrt.originalwd)
>         if newwd < 0:
>             # original directory is a parent of rebase set root or ignored
>-            newwd = originalwd
>+            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)
>@@ -536,14 +546,14 @@ def rebase(ui, repo, **opts):
>             collapsedas = None
>             if collapsef:
>                 collapsedas = newnode
>-            clearrebased(ui, repo, state, skipped, collapsedas)
>+            clearrebased(ui, repo, rbsrt.state, skipped, collapsedas)
> 
>         with repo.transaction('bookmark') as tr:
>             if currentbookmarks:
>                 updatebookmarks(repo, targetnode, nstate, currentbookmarks, tr)
>-                if activebookmark not in repo._bookmarks:
>+                if rbsrt.activebookmark not in repo._bookmarks:
>                     # active bookmark was divergent one and has been deleted
>-                    activebookmark = None
>+                    rbsrt.activebookmark = None
>         clearstatus(repo)
>         clearcollapsemsg(repo)
> 
>@@ -552,9 +562,9 @@ def rebase(ui, repo, **opts):
>         if skipped:
>             ui.note(_("%d revisions have been skipped\n") % len(skipped))
> 
>-        if (activebookmark and
>-            repo['.'].node() == repo._bookmarks[activebookmark]):
>-                bookmarks.activate(repo, activebookmark)
>+        if (rbsrt.activebookmark and
>+            repo['.'].node() == repo._bookmarks[rbsrt.activebookmark]):
>+                bookmarks.activate(repo, rbsrt.activebookmark)
> 
>     finally:
>         release(lock, wlock)
>_______________________________________________
>Mercurial-devel mailing list
>Mercurial-devel at mercurial-scm.org
>https://urldefense.proofpoint.com/v2/url?u=https-3A__www.mercurial-2Dscm.org_mailman_listinfo_mercurial-2Ddevel&d=CwIGaQ&c=5VD0RTtNlTh3ycd41b3MUw&r=Pp-gQYFgs4tKlSFPF5kfCw&m=d-wOzyS3w7nTWSgCwJ0LKxm5hqhrT9cL_ghznMQW1tE&s=q--YTSlDbR0OLvFiUqEKAa61LNjOeHes3Q1JXvrXnsk&e= 



More information about the Mercurial-devel mailing list