changeset 25995:4f703dcc626f stable

revset: prevent crash caused by empty group expression while optimizing "and" An empty group expression "()" generates None in AST, so the optimizer have to test it before destructuring a tuple. The error message, "missing argument", is somewhat obscure, but it should be better than crash.
author Yuya Nishihara <yuya@tcha.org>
date Sun, 09 Aug 2015 16:06:36 +0900
parents 23c4589fc678
children b12e00a05d57
files mercurial/revset.py tests/test-revset.t
diffstat 2 files changed, 20 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/mercurial/revset.py	Sat Aug 08 14:42:27 2015 +0800
+++ b/mercurial/revset.py	Sun Aug 09 16:06:36 2015 +0900
@@ -2245,8 +2245,10 @@
         # (::x and not ::y)/(not ::y and ::x) have a fast path
         def isonly(revs, bases):
             return (
-                revs[0] == 'func'
+                revs is not None
+                and revs[0] == 'func'
                 and getstring(revs[1], _('not a symbol')) == 'ancestors'
+                and bases is not None
                 and bases[0] == 'not'
                 and bases[1][0] == 'func'
                 and getstring(bases[1][1], _('not a symbol')) == 'ancestors')
--- a/tests/test-revset.t	Sat Aug 08 14:42:27 2015 +0800
+++ b/tests/test-revset.t	Sun Aug 09 16:06:36 2015 +0900
@@ -1230,6 +1230,23 @@
   5
   6
 
+no crash by empty group "()" while optimizing to "only()"
+
+  $ try --optimize '::1 and ()'
+  (and
+    (dagrangepre
+      ('symbol', '1'))
+    (group
+      None))
+  * optimized:
+  (and
+    None
+    (func
+      ('symbol', 'ancestors')
+      ('symbol', '1')))
+  hg: parse error: missing argument
+  [255]
+
 we can use patterns when searching for tags
 
   $ log 'tag("1..*")'