changeset 23062:ba89f7b542c9 stable

revset: have rev() drop out-of-range or filtered rev explicitly (issue4396) The recent optimization of "and" operation relies on the assumption that the rhs set does not contain invalid revisions. So rev() has to remove invalid revisions. This is still faster than using `.filter(lambda r: r == l)`. revset #0: rev(25) 0) wall 0.026341 comb 0.020000 user 0.020000 sys 0.000000 (best of 113) 1) wall 0.000038 comb 0.000000 user 0.000000 sys 0.000000 (best of 66567) 2) wall 0.000062 comb 0.000000 user 0.000000 sys 0.000000 (best of 43699) (0: bbf4f3dfd700^, 1: 3.2-rc, 2: this patch)
author Yuya Nishihara <yuya@tcha.org>
date Sun, 19 Oct 2014 16:48:33 +0900
parents f2aeff8a87b6
children cd86a6707159
files mercurial/revset.py tests/test-obsolete.t tests/test-revset.t
diffstat 3 files changed, 16 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/mercurial/revset.py	Wed Oct 22 15:47:27 2014 -0500
+++ b/mercurial/revset.py	Sun Oct 19 16:48:33 2014 +0900
@@ -1351,6 +1351,8 @@
     except (TypeError, ValueError):
         # i18n: "rev" is a keyword
         raise error.ParseError(_("rev expects a number"))
+    if l not in repo.changelog:
+        return baseset()
     return subset & baseset([l])
 
 def matching(repo, subset, x):
--- a/tests/test-obsolete.t	Wed Oct 22 15:47:27 2014 -0500
+++ b/tests/test-obsolete.t	Sun Oct 19 16:48:33 2014 +0900
@@ -185,6 +185,8 @@
   abort: hidden revision '4'!
   (use --hidden to access hidden revisions)
   [255]
+  $ hg debugrevspec 'rev(6)'
+  $ hg debugrevspec 'rev(4)'
 
 Check that public changeset are not accounted as obsolete:
 
--- a/tests/test-revset.t	Wed Oct 22 15:47:27 2014 -0500
+++ b/tests/test-revset.t	Sun Oct 19 16:48:33 2014 +0900
@@ -437,6 +437,18 @@
   4
   8
   9
+
+Test explicit numeric revision
+  $ log 'rev(-1)'
+  $ log 'rev(0)'
+  0
+  $ log 'rev(9)'
+  9
+  $ log 'rev(10)'
+  $ log 'rev(tip)'
+  hg: parse error: rev expects a number
+  [255]
+
   $ log 'outgoing()'
   8
   9