[PATCH 2 of 2] rebase: use unfiltered repo and remove complex unhiding code (issue5219)

Jun Wu quark at fb.com
Sat Mar 11 13:57:52 EST 2017


Excerpts from Martin von Zweigbergk's message of 2017-03-10 22:17:10 -0800:
> On Fri, Mar 10, 2017 at 6:06 PM, Jun Wu <quark at fb.com> wrote:
> > I like this change. It removes a dynamic blocker.
> >
> > I also did some manual tests and the logic seems good to me.
> >
> > Excerpts from Martin von Zweigbergk's message of 2017-03-10 17:15:52 -0800:
> >> # HG changeset patch
> >> # User Martin von Zweigbergk <martinvonz at google.com>
> >> # Date 1485968584 28800
> >> #      Wed Feb 01 09:03:04 2017 -0800
> >> # Node ID 0c89a4fb256390123fd543d73cbd5f01450e6da7
> >> # Parent  460068415dc97223cce156c70f7f8a6b659c4dd2
> >> rebase: use unfiltered repo and remove complex unhiding code (issue5219)
> >>
> >> Instead of dynamically unhiding commits, just work with the unfiltered
> >> repo. The deleted _setrebasesetvisibility() code seems very
> >> intentional, but I can't figure out what I'm breaking with this
> >> patch. Hopefully reviewers can tell me.
> 
> Pierre-Yves expressed unspecified concern that this patch might make
> some operations use the unfiltered repo that shouldn't be. So I looked
> a little closer and I think I found a case that confirms his
> suspicion. When allowunstable is not set, I think the revset
> "first(children(<rebaseset>) - rebaseset)" would report an obsolete
> child as unstable. I'll try to resend this series with a more narrowly
> scoped use of repo.unfiltered(), or maybe with an updated set of
> "dynamic blockers".

I wish we could kill the "allowunstable" feature eventually. That'll likely
simplify a lot of things. It's not that unrealistic since the "archived"
phase could be a thing, and will help people who want safe history rewriting
without using the obsstore.

Since some caches (branch, tags) depend on "dynamic blockers", making it
more complex may invalidate those caches. I think just checking
"allowunstable" and using "unfiltered" is better if we want better
performance and less complex code.

> >>
> >> diff -r 460068415dc9 -r 0c89a4fb2563 hgext/rebase.py
> >> --- a/hgext/rebase.py    Wed Feb 01 09:18:44 2017 -0800
> >> +++ b/hgext/rebase.py    Wed Feb 01 09:03:04 2017 -0800
> >> @@ -44,7 +44,6 @@
> >>      phases,
> >>      registrar,
> >>      repair,
> >> -    repoview,
> >>      revset,
> >>      scmutil,
> >>      smartset,
> >> @@ -128,7 +127,7 @@
> >>          if opts is None:
> >>              opts = {}
> >>
> >> -        self.repo = repo
> >> +        self.repo = repo.unfiltered()
> >>          self.ui = ui
> >>          self.opts = opts
> >>          self.originalwd = None
> >> @@ -250,7 +249,6 @@
> >>          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
> >> @@ -1119,7 +1117,6 @@
> >>
> >>  def clearstatus(repo):
> >>      'Remove the status files'
> >> -    _clearrebasesetvisibiliy(repo)
> >>      util.unlinkpath(repo.join("rebasestate"), ignoremissing=True)
> >>
> >>  def needupdate(repo, state):
> >> @@ -1203,7 +1200,6 @@
> >>      dest: context
> >>      rebaseset: set of rev
> >>      '''
> >> -    _setrebasesetvisibility(repo, rebaseset)
> >>
> >>      # This check isn't strictly necessary, since mq detects commits over an
> >>      # applied patch. But it prevents messing up the working directory when
> >> @@ -1383,31 +1379,6 @@
> >>
> >>      return ret
> >>
> >> -def _setrebasesetvisibility(repo, revs):
> >> -    """store the currently rebased set on the repo object
> >> -
> >> -    This is used by another function to prevent rebased revision to because
> >> -    hidden (see issue4504)"""
> >> -    repo = repo.unfiltered()
> >> -    revs = set(revs)
> >> -    repo._rebaseset = revs
> >> -    # invalidate cache if visibility changes
> >> -    hiddens = repo.filteredrevcache.get('visible', set())
> >> -    if revs & hiddens:
> >> -        repo.invalidatevolatilesets()
> >> -
> >> -def _clearrebasesetvisibiliy(repo):
> >> -    """remove rebaseset data from the repo"""
> >> -    repo = repo.unfiltered()
> >> -    if '_rebaseset' in vars(repo):
> >> -        del repo._rebaseset
> >> -
> >> -def _rebasedvisible(orig, repo):
> >> -    """ensure rebased revs stay visible (see issue4504)"""
> >> -    blockers = orig(repo)
> >> -    blockers.update(getattr(repo, '_rebaseset', ()))
> >> -    return blockers
> >> -
> >>  def _filterobsoleterevs(repo, revs):
> >>      """returns a set of the obsolete revisions in revs"""
> >>      return set(r for r in revs if repo[r].obsolete())
> >> @@ -1479,5 +1450,3 @@
> >>           _("use 'hg rebase --continue' or 'hg rebase --abort'")])
> >>      cmdutil.afterresolvedstates.append(
> >>          ['rebasestate', _('hg rebase --continue')])
> >> -    # ensure rebased rev are not hidden
> >> -    extensions.wrapfunction(repoview, '_getdynamicblockers', _rebasedvisible)
> >> diff -r 460068415dc9 -r 0c89a4fb2563 tests/test-rebase-obsolete.t
> >> --- a/tests/test-rebase-obsolete.t    Wed Feb 01 09:18:44 2017 -0800
> >> +++ b/tests/test-rebase-obsolete.t    Wed Feb 01 09:03:04 2017 -0800
> >> @@ -279,9 +279,27 @@
> >>    $ hg --hidden up -qr 'first(hidden())'
> >>    $ hg rebase --rev 13 --dest 15
> >>    rebasing 13:98f6af4ee953 "C"
> >> -  abort: hidden revision '1'!
> >> -  (use --hidden to access hidden revisions)
> >> -  [255]
> >> +  $ hg log -G
> >> +  o  16:294a2b93eb4d C
> >> +  |
> >> +  o  15:627d46148090 D
> >> +  |
> >> +  | o  12:462a34d07e59 B
> >> +  | |
> >> +  | o  11:4596109a6a43 D
> >> +  | |
> >> +  | o  7:02de42196ebe H
> >> +  | |
> >> +  +---o  6:eea13746799a G
> >> +  | |/
> >> +  | o  5:24b6387c8c8c F
> >> +  | |
> >> +  o |  4:9520eea781bc E
> >> +  |/
> >> +  | @  1:42ccdea3bb16 B
> >> +  |/
> >> +  o  0:cd010b8cd998 A
> >> +
> >>
> >>    $ cd ..
> >>


More information about the Mercurial-devel mailing list