# HG changeset patch # User Yuya Nishihara # Date 2015-08-09 07:06:36 # Node ID 4f703dcc626f4118bf6643e5ea4d1c23d476d69f # Parent 23c4589fc678a319253938d8dad6cf8eae9fc644 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. diff --git a/mercurial/revset.py b/mercurial/revset.py --- a/mercurial/revset.py +++ b/mercurial/revset.py @@ -2245,8 +2245,10 @@ def optimize(x, small): # (::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') diff --git a/tests/test-revset.t b/tests/test-revset.t --- a/tests/test-revset.t +++ b/tests/test-revset.t @@ -1230,6 +1230,23 @@ check that conversion to only works 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..*")'