diff --git a/mercurial/revset.py b/mercurial/revset.py --- a/mercurial/revset.py +++ b/mercurial/revset.py @@ -1377,16 +1377,15 @@ def _expandaliases(aliases, tree, expand raise error.ParseError(_('infinite expansion of revset alias "%s" ' 'detected') % alias.name) expanding.append(alias) - result = alias.replacement + result = _expandaliases(aliases, alias.replacement, expanding) + expanding.pop() if alias.args is not None: l = getlist(tree[2]) if len(l) != len(alias.args): raise error.ParseError( _('invalid number of arguments: %s') % len(l)) + l = [_expandaliases(aliases, a, []) for a in l] result = _expandargs(result, dict(zip(alias.args, l))) - # Recurse in place, the base expression may have been rewritten - result = _expandaliases(aliases, result, expanding) - expanding.pop() else: result = tuple(_expandaliases(aliases, t, expanding) for t in tree) diff --git a/tests/test-revset.t b/tests/test-revset.t --- a/tests/test-revset.t +++ b/tests/test-revset.t @@ -520,6 +520,27 @@ test infinite recursion hg: parse error: infinite expansion of revset alias "recurse1" detected [255] + $ echo 'level1($1, $2) = $1 or $2' >> .hg/hgrc + $ echo 'level2($1, $2) = level1($2, $1)' >> .hg/hgrc + $ try "level2(level1(1, 2), 3)" + (func + ('symbol', 'level2') + (list + (func + ('symbol', 'level1') + (list + ('symbol', '1') + ('symbol', '2'))) + ('symbol', '3'))) + (or + ('symbol', '3') + (or + ('symbol', '1') + ('symbol', '2'))) + 3 + 1 + 2 + test nesting and variable passing $ echo 'nested($1) = nested2($1)' >> .hg/hgrc