This should be retitled to "remove nullmerge and revignored states".
(it seems Phabricator could be helpful in this situation - the title could be changed without a resend) Excerpts from Jun Wu's message of 2017-07-09 12:14:53 -0700: > # HG changeset patch > # User Jun Wu <qu...@fb.com> > # Date 1499571514 25200 > # Sat Jul 08 20:38:34 2017 -0700 > # Node ID 22d54f1e4c09d8fb68ea897afcdd0b705db94b5a > # Parent 49d1672e7567f2a16c5ce9afa64babe08891718f > # Available At https://bitbucket.org/quark-zju/hg-draft > # hg pull https://bitbucket.org/quark-zju/hg-draft -r > 22d54f1e4c09 > rebase: remove revprecursor and revpruned states > > They are no longer necessary to make rebase behavior correct. Therefore > remove them to make the code cleaner and easier to reason about. > > diff --git a/hgext/rebase.py b/hgext/rebase.py > --- a/hgext/rebase.py > +++ b/hgext/rebase.py > @@ -61,10 +61,8 @@ templateopts = cmdutil.templateopts > # 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 = {} > @@ -234,6 +232,4 @@ class rebaseruntime(object): > 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 > @@ -440,8 +436,4 @@ class rebaseruntime(object): > 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') % > @@ -464,5 +456,5 @@ class rebaseruntime(object): > for rebased in 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 > @@ -480,5 +472,5 @@ class rebaseruntime(object): > newrev = repo[newnode].rev() > for oldrev in self.state.iterkeys(): > - if self.state[oldrev] > nullmerge: > + if self.state[oldrev] >= revtodo: > self.state[oldrev] = newrev > > @@ -1231,5 +1223,4 @@ def buildstate(repo, dest, rebaseset, co > roots.sort() > state = dict.fromkeys(rebaseset, revtodo) > - detachset = set() > emptyrebase = True > for root in roots: > @@ -1253,45 +1244,4 @@ def buildstate(repo, dest, rebaseset, co > 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 > @@ -1301,16 +1251,4 @@ def buildstate(repo, dest, rebaseset, co > 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: _______________________________________________ Mercurial-devel mailing list Mercurial-devel@mercurial-scm.org https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel