[PATCH] revset: use a baseset in _notpublic()

Pierre-Yves David pierre-yves.david at ens-lyon.org
Thu Jun 18 12:04:55 CDT 2015


# HG changeset patch
# User Pierre-Yves David <pierre-yves.david at fb.com>
# Date 1433991507 25200
#      Wed Jun 10 19:58:27 2015 -0700
# Node ID 32d7dee9420183af58bd5ce150908425e708de77
# Parent  e0d29cae67f9ad7324fc4818bed2248aeef0af83
revset: use a baseset in _notpublic()

The '_notpublic()' internal revset was "returning" a set. That was wrong. We now
return a 'baseset' as appropriate. This has no effect on performance in most case,
because we do the exact same operation than what the combination with a
'fullreposet' was doing. This as a small effect on some operation when combined
with other set, because we now apply the filtering in all cases. I think the
correctness is worth the impact on some corner cases. The optimizer should take
care of these corner cases anyway.

revset #0: not public()
   plain         min           max           first         last          reverse
0) 0.000465      0.000491      0.000495      0.000500      0.000494      0.000479
1) 0.000484      0.000503      0.000498      0.000505      0.000504      0.000491

revset #1: (tip~1000::) - public()
   plain         min           max           first         last          reverse
0) 0.002765      0.001742      0.002767      0.001730      0.002761      0.002782
1) 0.002847      0.001777      0.002776      0.001741      0.002764      0.002858

revset #2: not public() and branch("default")
   plain         min           max           first         last          reverse
0) 0.012104      0.011138      0.011189      0.011138      0.011166      0.011578
1) 0.011387  94% 0.011738 105% 0.014220 127% 0.011223      0.011184      0.012077

revset #3: (not public() - obsolete())
   plain         min           max           first         last          reverse
0) 0.000583      0.000556      0.000552      0.000555      0.000552      0.000610
1) 0.000613 105% 0.000559      0.000557      0.000573      0.000558      0.000613

revset #4: head() - public()
   plain         min           max           first         last          reverse
0) 0.010869      0.010800      0.011547      0.010843      0.010891      0.010891
1) 0.011031      0.011497 106% 0.011087      0.011100      0.011100      0.011085

diff --git a/mercurial/revset.py b/mercurial/revset.py
--- a/mercurial/revset.py
+++ b/mercurial/revset.py
@@ -1536,12 +1536,12 @@ def _notpublic(repo, subset, x):
     repo._phasecache.loadphaserevs(repo) # ensure phase's sets are loaded
     if repo._phasecache._phasesets:
         s = set()
         for u in repo._phasecache._phasesets[1:]:
             s.update(u)
-        # XXX we should turn this into a baseset instead of a set, smartset may
-        # do some optimisations from the fact this is a baseset.
+        s = baseset(s - repo.changelog.filteredrevs)
+        s.sort()
         return subset & s
     else:
         phase = repo._phasecache.phase
         target = phases.public
         condition = lambda r: phase(repo, r) != target


More information about the Mercurial-devel mailing list