obsolete: avoid using revset language to compute the obsolete revset
authorJun Wu <quark@fb.com>
Sat, 18 Feb 2017 00:55:20 -0800
changeset 31038 cb5888c00410
parent 31037 17b5cda5a84a
child 31039 74f77f1c2215
obsolete: avoid using revset language to compute the obsolete revset This is part of a refactoring that moves some phase query optimization from revset.py to phases.py. See previous patches for the motivation. Now we have APIs in phasecache to get the non-public set efficiently, let's use it directly instead of going through the "not public()" revset language in "obsolete()" computation. This patch was meaured using: for i in 'public()' 'not public()' 'draft()' 'not draft()'; do hg perfrevset "$i"; hg perfrevset "$i" --hidden; done and no noticeable (> 1%) performance difference was observed.
mercurial/obsolete.py
--- a/mercurial/obsolete.py	Sat Feb 18 00:39:31 2017 -0800
+++ b/mercurial/obsolete.py	Sat Feb 18 00:55:20 2017 -0800
@@ -1120,7 +1120,7 @@
     """the set of obsolete revisions"""
     obs = set()
     getnode = repo.changelog.node
-    notpublic = repo.revs("not public()")
+    notpublic = repo._phasecache.getrevset(repo, (phases.draft, phases.secret))
     for r in notpublic:
         if getnode(r) in repo.obsstore.successors:
             obs.add(r)