diff -r cb2e2b095dc9 -r 9c1fd975e9ac mercurial/phases.py --- a/mercurial/phases.py Wed Dec 25 14:53:45 2019 +0100 +++ b/mercurial/phases.py Thu Dec 19 00:32:42 2019 -0800 @@ -112,6 +112,7 @@ nullid, nullrev, short, + wdirrev, ) from .pycompat import ( getattr, @@ -242,6 +243,7 @@ """return a smartset for the given phases""" self.loadphaserevs(repo) # ensure phase's sets are loaded phases = set(phases) + if public not in phases: # fast path: _phasesets contains the interesting sets, # might only need a union and post-filtering. @@ -252,21 +254,39 @@ revs = set.union(*[self._phasesets[p] for p in phases]) if repo.changelog.filteredrevs: revs = revs - repo.changelog.filteredrevs + if subset is None: return smartset.baseset(revs) else: + if wdirrev in subset and repo[None].phase() in phases: + # The working dir would never be in the cache, but it was + # in the subset being filtered for its phase, so add it to + # the output. + revs.add(wdirrev) + return subset & smartset.baseset(revs) else: + # phases keeps all the *other* phases. phases = set(allphases).difference(phases) if not phases: return smartset.fullreposet(repo) + + # revs has the revisions in all *other* phases. if len(phases) == 1: [p] = phases revs = self._phasesets[p] else: revs = set.union(*[self._phasesets[p] for p in phases]) + if subset is None: subset = smartset.fullreposet(repo) + + if wdirrev in subset and repo[None].phase() in phases: + # The working dir is in the subset being filtered, and its + # phase is in the phases *not* being returned, so add it to the + # set of revisions to filter out. + revs.add(wdirrev) + if not revs: return subset return subset.filter(lambda r: r not in revs)