changeset 24204:d2de20e1451f

revset: extend fullreposet to make "null" revision magically appears in set As per fullreposet.__and__, it can omit the range check of rev. Therefore, "null" revision is accepted automagically. It seems this can fix many query results involving null symbol. Originally, the simplest "(null)" query did fail if there were hidden revisions. Tests are randomly chosen. fullreposet mimics the behavior of localrepo, where "null" revision is not listed but contained.
author Yuya Nishihara <yuya@tcha.org>
date Thu, 08 Jan 2015 23:05:45 +0900
parents 33c7a94d4dd0
children abcb1ee3b20a
files mercurial/revset.py tests/test-obsolete.t tests/test-revset.t
diffstat 3 files changed, 31 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/mercurial/revset.py	Sat Jan 10 18:09:25 2015 +0900
+++ b/mercurial/revset.py	Thu Jan 08 23:05:45 2015 +0900
@@ -323,8 +323,6 @@
 
 def stringset(repo, subset, x):
     x = repo[x].rev()
-    if x == -1 and len(subset) == len(repo):
-        return baseset([-1])
     if x in subset:
         return baseset([x])
     return baseset()
@@ -3312,16 +3310,17 @@
 class fullreposet(spanset):
     """a set containing all revisions in the repo
 
-    This class exists to host special optimization.
+    This class exists to host special optimization and magic to handle virtual
+    revisions such as "null".
     """
 
     def __init__(self, repo):
         super(fullreposet, self).__init__(repo)
 
     def __contains__(self, rev):
+        # assumes the given rev is valid
         hidden = self._hiddenrevs
-        return ((self._start <= rev < self._end)
-                and not (hidden and rev in hidden))
+        return not (hidden and rev in hidden)
 
     def __and__(self, other):
         """As self contains the whole repo, all of the other set should also be
--- a/tests/test-obsolete.t	Sat Jan 10 18:09:25 2015 +0900
+++ b/tests/test-obsolete.t	Thu Jan 08 23:05:45 2015 +0900
@@ -187,6 +187,8 @@
   [255]
   $ hg debugrevspec 'rev(6)'
   $ hg debugrevspec 'rev(4)'
+  $ hg debugrevspec 'null'
+  -1
 
 Check that public changeset are not accounted as obsolete:
 
--- a/tests/test-revset.t	Sat Jan 10 18:09:25 2015 +0900
+++ b/tests/test-revset.t	Thu Jan 08 23:05:45 2015 +0900
@@ -478,8 +478,33 @@
   [255]
 
 Test null revision
+  $ log '(null)'
+  -1
+  $ log '(null:0)'
+  -1
+  0
+  $ log '(0:null)'
+  0
+  -1
+  $ log 'null::0'
+  -1
+  0
+  $ log 'null:tip - 0:'
+  -1
+  $ log 'null: and null::' | head -1
+  -1
+  $ log 'null: or 0:' | head -2
+  -1
+  0
   $ log 'ancestors(null)'
   -1
+  $ log 'reverse(null:)' | tail -2
+  0
+  -1
+  $ log 'first(null:)'
+  -1
+  $ log 'min(null:)'
+  -1
   $ log 'tip:null and all()' | tail -2
   1
   0