diff --git a/mercurial/phases.py b/mercurial/phases.py --- a/mercurial/phases.py +++ b/mercurial/phases.py @@ -112,6 +112,7 @@ nullid, nullrev, short, + wdirrev, ) from .pycompat import ( getattr, @@ -252,25 +253,43 @@ 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 draft in phases: + # The working dir would never be in the cache, but it should + # be considered a draft - if it's in the subset being + # filtered for drafts, 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 not revs: return subset + if wdirrev in subset and draft in phases: + # The working dir is in the subset being filtered, and draft is + # in the phases *not* being returned, so add it to the set of + # revisions to filter out. + revs.add(wdirrev) + return subset.filter(lambda r: r not in revs) + def copy(self): # Shallow copy meant to ensure isolation in # advance/retractboundary(), nothing more. diff --git a/tests/test-phases.t b/tests/test-phases.t --- a/tests/test-phases.t +++ b/tests/test-phases.t @@ -48,6 +48,15 @@ 1 1 B 0 1 A +Working directory is a draft. + + $ hg log -r 'wdir()' -T '{phase}\n' + draft + $ hg log -r 'wdir() and public()' -T '{phase}\n' + $ hg log -r 'wdir() and draft()' -T '{phase}\n' + draft + $ hg log -r 'wdir() and secret()' -T '{phase}\n' + Draft commit are properly created over public one: $ hg phase --public .