revset: explicitely tag alias arguments for expansion
The current revset alias expansion code works like:
1- Get the replacement tree
2- Substitute the variables in the replacement tree
3- Expand the replacement tree
It makes it easy to substitute alias arguments because the placeholders
are always replaced before the updated replacement tree is expanded
again. Unfortunately, to fix other alias expansion issues, we need to
reorder the sequence and delay the argument substitution. To solve this,
a new "virtual" construct called _aliasarg() is introduced and injected
when parsing the aliases definitions. Only _aliasarg() will be
substituted in the argument expansion phase instead of all regular
matching string. We also check user inputs do not contain unexpected
_aliasarg() instances to avoid argument injections.
$ hg init a
$ cd a
$ echo a > a
$ hg ci -Am0
adding a
$ echo b > b
$ hg ci -Am1
adding b
$ hg tag -r0 default
warning: tag default conflicts with existing branch name
$ hg log
changeset: 2:30a83d1e4a1e
tag: tip
user: test
date: Thu Jan 01 00:00:00 1970 +0000
summary: Added tag default for changeset f7b1eb17ad24
changeset: 1:925d80f479bb
user: test
date: Thu Jan 01 00:00:00 1970 +0000
summary: 1
changeset: 0:f7b1eb17ad24
tag: default
user: test
date: Thu Jan 01 00:00:00 1970 +0000
summary: 0
$ hg update 'tag(default)'
0 files updated, 0 files merged, 2 files removed, 0 files unresolved
$ hg parents
changeset: 0:f7b1eb17ad24
tag: default
user: test
date: Thu Jan 01 00:00:00 1970 +0000
summary: 0
$ hg update 'branch(default)'
2 files updated, 0 files merged, 0 files removed, 0 files unresolved
$ hg parents
changeset: 2:30a83d1e4a1e
tag: tip
user: test
date: Thu Jan 01 00:00:00 1970 +0000
summary: Added tag default for changeset f7b1eb17ad24