Mercurial > hg-stable
changeset 33866:3ddbab49efcf
rebase: remove revignored and nullmerge states
They are no longer necessary to make rebase behavior correct. Therefore
remove them to make the code cleaner and easier to reason about.
Differential Revision: https://phab.mercurial-scm.org/D26
author | Jun Wu <quark@fb.com> |
---|---|
date | Mon, 10 Jul 2017 12:18:32 -0700 |
parents | 437e317d7913 |
children | 3b04a6ff625c |
files | hgext/rebase.py |
diffstat | 1 files changed, 4 insertions(+), 66 deletions(-) [+] |
line wrap: on
line diff
--- a/hgext/rebase.py Sat Jul 08 20:38:34 2017 -0700 +++ b/hgext/rebase.py Mon Jul 10 12:18:32 2017 -0700 @@ -60,12 +60,10 @@ # Indicates that a revision needs to be rebased revtodo = -1 -nullmerge = -2 -revignored = -3 # legacy revstates no longer needed in current code -# -4: revprecursor, -5: revpruned -legacystates = {'-4', '-5'} +# -2: nullmerge, -3: revignored, -4: revprecursor, -5: revpruned +legacystates = {'-2', '-3', '-4', '-5'} cmdtable = {} command = registrar.command(cmdtable) @@ -233,8 +231,6 @@ oldrev, newrev = l.split(':') if newrev in legacystates: continue - if newrev in (str(nullmerge), str(revignored)): - state[repo[oldrev].rev()] = int(newrev) elif newrev == nullid: state[repo[oldrev].rev()] = revtodo # Legacy compat special case @@ -439,10 +435,6 @@ self.skipped.add(rev) self.state[rev] = p1 ui.debug('next revision set to %s\n' % p1) - elif self.state[rev] == nullmerge: - pass - elif self.state[rev] == revignored: - pass else: ui.status(_('already rebased %s as %s\n') % (desc, repo[self.state[rev]])) @@ -463,7 +455,7 @@ commitmsg = 'Collapsed revision' for rebased in sorted(self.state): if rebased not in self.skipped and\ - self.state[rebased] > nullmerge: + self.state[rebased] >= revtodo: commitmsg += '\n* %s' % repo[rebased].description() editopt = True editor = cmdutil.getcommiteditor(edit=editopt, editform=editform) @@ -484,7 +476,7 @@ else: newrev = repo[newnode].rev() for oldrev in self.state.iterkeys(): - if self.state[oldrev] > nullmerge: + if self.state[oldrev] >= revtodo: self.state[oldrev] = newrev if 'qtip' in repo.tags(): @@ -1318,7 +1310,6 @@ raise error.Abort(_('no matching revisions')) roots.sort() state = dict.fromkeys(rebaseset, revtodo) - detachset = set() emptyrebase = True for root in roots: commonbase = root.ancestor(dest) @@ -1340,47 +1331,6 @@ emptyrebase = False repo.ui.debug('rebase onto %s starting from %s\n' % (dest, root)) - # Rebase tries to turn <dest> into a parent of <root> while - # preserving the number of parents of rebased changesets: - # - # - A changeset with a single parent will always be rebased as a - # changeset with a single parent. - # - # - A merge will be rebased as merge unless its parents are both - # ancestors of <dest> or are themselves in the rebased set and - # pruned while rebased. - # - # If one parent of <root> is an ancestor of <dest>, the rebased - # version of this parent will be <dest>. This is always true with - # --base option. - # - # Otherwise, we need to *replace* the original parents with - # <dest>. This "detaches" the rebased set from its former location - # and rebases it onto <dest>. Changes introduced by ancestors of - # <root> not common with <dest> (the detachset, marked as - # nullmerge) are "removed" from the rebased changesets. - # - # - If <root> has a single parent, set it to <dest>. - # - # - If <root> is a merge, we cannot decide which parent to - # replace, the rebase operation is not clearly defined. - # - # The table below sums up this behavior: - # - # +------------------+----------------------+-------------------------+ - # | | one parent | merge | - # +------------------+----------------------+-------------------------+ - # | parent in | new parent is <dest> | parents in ::<dest> are | - # | ::<dest> | | remapped to <dest> | - # +------------------+----------------------+-------------------------+ - # | unrelated source | new parent is <dest> | ambiguous, abort | - # +------------------+----------------------+-------------------------+ - # - # The actual abort is handled by `defineparents` - if len(root.parents()) <= 1: - # ancestors of <root> not ancestors of <dest> - detachset.update(repo.changelog.findmissingrevs([commonbase.rev()], - [root.rev()])) if emptyrebase: return None for rev in sorted(state): @@ -1388,18 +1338,6 @@ # if all parents of this revision are done, then so is this revision if parents and all((state.get(p) == p for p in parents)): state[rev] = rev - for r in detachset: - if r not in state: - state[r] = nullmerge - if len(roots) > 1: - # If we have multiple roots, we may have "hole" in the rebase set. - # Rebase roots that descend from those "hole" should not be detached as - # other root are. We use the special `revignored` to inform rebase that - # the revision should be ignored but that `defineparents` should search - # a rebase destination that make sense regarding rebased topology. - rebasedomain = set(repo.revs('%ld::%ld', rebaseset, rebaseset)) - for ignored in set(rebasedomain) - set(rebaseset): - state[ignored] = revignored unfi = repo.unfiltered() for r in obsoletenotrebased: desc = _ctxdesc(unfi[r])