[PATCH 13 of 16] rebase: move restorestestatus to be a method of rebase runtime object
Kostia Balytskyi
ikostia at fb.com
Sun May 29 18:38:44 EDT 2016
# HG changeset patch
# User Kostia Balytskyi <ikostia at fb.com>
# Date 1464556632 -3600
# Sun May 29 22:17:12 2016 +0100
# Node ID 3db4f209833e81cb044098330755787db4112157
# Parent 093516642f0fb8a86a1bb7788f2be4684a6c6f37
rebase: move restorestestatus to be a method of rebase runtime object
diff --git a/hgext/rebase.py b/hgext/rebase.py
--- a/hgext/rebase.py
+++ b/hgext/rebase.py
@@ -121,7 +121,10 @@
class RebaseRuntimeState(object):
"""This class is a container for rebase runtime state"""
- def __init__(self, repo, ui, opts):
+ def __init__(self, repo, ui, opts=None):
+ if opts is None:
+ opts = {}
+
self.repo = repo
self.ui = ui
self.opts = opts
@@ -191,6 +194,78 @@
if self.abortf and self.opts.get('tool', False):
ui.warn(_('tool option will be ignored\n'))
+ def restorestatus(self):
+ 'Restore a previously stored status'
+ repo = self.repo
+ keepbranches = None
+ target = None
+ collapse = False
+ external = nullrev
+ activebookmark = None
+ state = {}
+
+ try:
+ f = repo.vfs("rebasestate")
+ for i, l in enumerate(f.read().splitlines()):
+ if i == 0:
+ originalwd = repo[l].rev()
+ elif i == 1:
+ target = repo[l].rev()
+ elif i == 2:
+ external = repo[l].rev()
+ elif i == 3:
+ collapse = bool(int(l))
+ elif i == 4:
+ keep = bool(int(l))
+ elif i == 5:
+ keepbranches = bool(int(l))
+ elif i == 6 and not (len(l) == 81 and ':' in l):
+ # line 6 is a recent addition, so for backwards
+ # compatibility check that the line doesn't look like the
+ # oldrev:newrev lines
+ activebookmark = l
+ else:
+ oldrev, newrev = l.split(':')
+ if newrev in (str(nullmerge), str(revignored),
+ str(revprecursor), str(revpruned)):
+ state[repo[oldrev].rev()] = int(newrev)
+ elif newrev == nullid:
+ state[repo[oldrev].rev()] = revtodo
+ # Legacy compat special case
+ else:
+ state[repo[oldrev].rev()] = repo[newrev].rev()
+
+ except IOError as err:
+ if err.errno != errno.ENOENT:
+ raise
+ cmdutil.wrongtooltocontinue(repo, _('rebase'))
+
+ if keepbranches is None:
+ raise error.Abort(_('.hg/rebasestate is incomplete'))
+
+ skipped = set()
+ # recompute the set of skipped revs
+ if not collapse:
+ seen = set([target])
+ for old, new in sorted(state.items()):
+ if new != revtodo and new in seen:
+ skipped.add(old)
+ seen.add(new)
+ repo.ui.debug('computed skipped revs: %s\n' %
+ (' '.join(str(r) for r in sorted(skipped)) or None))
+ repo.ui.debug('rebase status resumed\n')
+ _setrebasesetvisibility(repo, state.keys())
+
+ self.originalwd = originalwd
+ self.target = target
+ self.state = state
+ self.skipped = skipped
+ self.collapsef = collapse
+ self.keepf = keep
+ self.keepbranchesf = keepbranches
+ self.external = external
+ self.activebookmark = activebookmark
+
@command('rebase',
[('s', 'source', '',
_('rebase the specified changeset and descendants'), _('REV')),
@@ -311,10 +386,7 @@
if rtstate.contf or rtstate.abortf:
try:
- (rtstate.originalwd, rtstate.target, rtstate.state,
- rtstate.skipped, rtstate.collapsef, rtstate.keepf,
- rtstate.keepbranchesf, rtstate.external,
- rtstate.activebookmark) = restorestatus(repo)
+ rtstate.restorestatus()
rtstate.collapsemsg = restorecollapsemsg(repo)
except error.RepoLookupError:
if rtstate.abortf:
@@ -1016,68 +1088,6 @@
_clearrebasesetvisibiliy(repo)
util.unlinkpath(repo.join("rebasestate"), ignoremissing=True)
-def restorestatus(repo):
- 'Restore a previously stored status'
- keepbranches = None
- target = None
- collapse = False
- external = nullrev
- activebookmark = None
- state = {}
-
- try:
- f = repo.vfs("rebasestate")
- for i, l in enumerate(f.read().splitlines()):
- if i == 0:
- originalwd = repo[l].rev()
- elif i == 1:
- target = repo[l].rev()
- elif i == 2:
- external = repo[l].rev()
- elif i == 3:
- collapse = bool(int(l))
- elif i == 4:
- keep = bool(int(l))
- elif i == 5:
- keepbranches = bool(int(l))
- elif i == 6 and not (len(l) == 81 and ':' in l):
- # line 6 is a recent addition, so for backwards compatibility
- # check that the line doesn't look like the oldrev:newrev lines
- activebookmark = l
- else:
- oldrev, newrev = l.split(':')
- if newrev in (str(nullmerge), str(revignored),
- str(revprecursor), str(revpruned)):
- state[repo[oldrev].rev()] = int(newrev)
- elif newrev == nullid:
- state[repo[oldrev].rev()] = revtodo
- # Legacy compat special case
- else:
- state[repo[oldrev].rev()] = repo[newrev].rev()
-
- except IOError as err:
- if err.errno != errno.ENOENT:
- raise
- cmdutil.wrongtooltocontinue(repo, _('rebase'))
-
- if keepbranches is None:
- raise error.Abort(_('.hg/rebasestate is incomplete'))
-
- skipped = set()
- # recompute the set of skipped revs
- if not collapse:
- seen = set([target])
- for old, new in sorted(state.items()):
- if new != revtodo and new in seen:
- skipped.add(old)
- seen.add(new)
- repo.ui.debug('computed skipped revs: %s\n' %
- (' '.join(str(r) for r in sorted(skipped)) or None))
- repo.ui.debug('rebase status resumed\n')
- _setrebasesetvisibility(repo, state.keys())
- return (originalwd, target, state, skipped,
- collapse, keep, keepbranches, external, activebookmark)
-
def needupdate(repo, state):
'''check whether we should `update --clean` away from a merge, or if
somehow the working dir got forcibly updated, e.g. by older hg'''
@@ -1400,7 +1410,9 @@
if not os.path.exists(repo.join('rebasestate')):
return
try:
- state = restorestatus(repo)[2]
+ rtstate = RebaseRuntimeState(repo, ui, {})
+ rtstate.restorestatus()
+ state = rtstate.state
except error.RepoLookupError:
# i18n: column positioning for "hg summary"
msg = _('rebase: (use "hg rebase --abort" to clear broken state)\n')
More information about the Mercurial-devel
mailing list