encoding: move case-related utils up
This will be useful for the next commit that needs this code earlier.
Differential Revision: https://phab.mercurial-scm.org/D11024
$ cat >> $HGRCPATH << EOF
> [command-templates]
> log="{rev}:{node|short} {desc} [{tags}]\n"
> EOF
$ hg init legacy-lookup
$ cd legacy-lookup
$ echo a > a
$ hg add a
$ hg commit -m 'first'
$ echo aa > a
$ hg commit -m 'second'
$ hg log -G
@ 1:43114e71eddd second [tip]
|
o 0:a87874c6ec31 first []
Create a tag that looks like a revset
$ hg tag 'rev(0)'
$ hg log -G
@ 2:fb616635b18f Added tag rev(0) for changeset 43114e71eddd [tip]
|
o 1:43114e71eddd second [rev(0)]
|
o 0:a87874c6ec31 first []
See how various things are resolved
-----------------------------------
Revision numbers
$ hg log -r '0'
0:a87874c6ec31 first []
$ hg log -r '1'
1:43114e71eddd second [rev(0)]
"rev(x)" form (the one conflicting with the tags)
(resolved as a label)
$ hg log -r 'rev(0)'
1:43114e71eddd second [rev(0)]
$ hg log -r 'rev(1)'
1:43114e71eddd second [rev(0)]
same within a simple revspec
(still resolved as the label)
$ hg log -r ':rev(0)'
0:a87874c6ec31 first []
1:43114e71eddd second [rev(0)]
$ hg log -r 'rev(0):'
1:43114e71eddd second [rev(0)]
2:fb616635b18f Added tag rev(0) for changeset 43114e71eddd [tip]
within a more advances revset
(still resolved as the label)
$ hg log -r 'rev(0) and branch(default)'
0:a87874c6ec31 first []
with explicit revset resolution
(still resolved as the label)
$ hg log -r 'revset(rev(0))'
0:a87874c6ec31 first []
some of the above with quote to force its resolution as a label
$ hg log -r ':"rev(0)"'
0:a87874c6ec31 first []
1:43114e71eddd second [rev(0)]
$ hg log -r '"rev(0)":'
1:43114e71eddd second [rev(0)]
2:fb616635b18f Added tag rev(0) for changeset 43114e71eddd [tip]
$ hg log -r '"rev(0)" and branch(default)'
1:43114e71eddd second [rev(0)]
confusing bits within parents
$ hg log -r '(rev(0))'
0:a87874c6ec31 first []
$ hg log -r '( rev(0))'
0:a87874c6ec31 first []
$ hg log -r '("rev(0)")'
1:43114e71eddd second [rev(0)]
Test label with quote in them.
$ hg tag '"foo"'
$ hg log -r '"foo"'
2:fb616635b18f Added tag rev(0) for changeset 43114e71eddd ["foo"]
$ hg log -r '("foo")'
abort: unknown revision 'foo'
[255]
$ hg log -r 'revset("foo")'
abort: unknown revision 'foo'
[255]
$ hg log -r '("\"foo\"")'
2:fb616635b18f Added tag rev(0) for changeset 43114e71eddd ["foo"]
$ hg log -r 'revset("\"foo\"")'
2:fb616635b18f Added tag rev(0) for changeset 43114e71eddd ["foo"]
Test label with dash in them.
$ hg tag 'foo-bar'
$ hg log -r 'foo-bar'
3:a50aae922707 Added tag "foo" for changeset fb616635b18f [foo-bar]
$ hg log -r '(foo-bar)'
3:a50aae922707 Added tag "foo" for changeset fb616635b18f [foo-bar]
$ hg log -r '"foo-bar"'
3:a50aae922707 Added tag "foo" for changeset fb616635b18f [foo-bar]
$ hg log -r '("foo-bar")'
3:a50aae922707 Added tag "foo" for changeset fb616635b18f [foo-bar]
Test label with + in them.
$ hg tag 'foo+bar'
$ hg log -r 'foo+bar'
4:bbf52b87b370 Added tag foo-bar for changeset a50aae922707 [foo+bar]
$ hg log -r '(foo+bar)'
abort: unknown revision 'foo'
[255]
$ hg log -r 'revset(foo+bar)'
abort: unknown revision 'foo'
[255]
$ hg log -r '"foo+bar"'
4:bbf52b87b370 Added tag foo-bar for changeset a50aae922707 [foo+bar]
$ hg log -r '("foo+bar")'
4:bbf52b87b370 Added tag foo-bar for changeset a50aae922707 [foo+bar]
Test tag with numeric version number.
$ hg tag '1.2'
$ hg log -r '1.2'
5:ff42fde8edbb Added tag foo+bar for changeset bbf52b87b370 [1.2]
$ hg log -r '(1.2)'
5:ff42fde8edbb Added tag foo+bar for changeset bbf52b87b370 [1.2]
$ hg log -r 'revset(1.2)'
5:ff42fde8edbb Added tag foo+bar for changeset bbf52b87b370 [1.2]
$ hg log -r '"1.2"'
5:ff42fde8edbb Added tag foo+bar for changeset bbf52b87b370 [1.2]
$ hg log -r '("1.2")'
5:ff42fde8edbb Added tag foo+bar for changeset bbf52b87b370 [1.2]
$ hg log -r '::"1.2"'
0:a87874c6ec31 first []
1:43114e71eddd second [rev(0)]
2:fb616635b18f Added tag rev(0) for changeset 43114e71eddd ["foo"]
3:a50aae922707 Added tag "foo" for changeset fb616635b18f [foo-bar]
4:bbf52b87b370 Added tag foo-bar for changeset a50aae922707 [foo+bar]
5:ff42fde8edbb Added tag foo+bar for changeset bbf52b87b370 [1.2]
$ hg log -r '::1.2'
0:a87874c6ec31 first []
1:43114e71eddd second [rev(0)]
2:fb616635b18f Added tag rev(0) for changeset 43114e71eddd ["foo"]
3:a50aae922707 Added tag "foo" for changeset fb616635b18f [foo-bar]
4:bbf52b87b370 Added tag foo-bar for changeset a50aae922707 [foo+bar]
5:ff42fde8edbb Added tag foo+bar for changeset bbf52b87b370 [1.2]
Test tag with parenthesis (but not a valid revset)
$ hg tag 'release_4.1(candidate1)'
$ hg log -r 'release_4.1(candidate1)'
6:db72e24fe069 Added tag 1.2 for changeset ff42fde8edbb [release_4.1(candidate1)]
$ hg log -r '(release_4.1(candidate1))'
hg: parse error: unknown identifier: release_4.1
[10]
$ hg log -r 'revset(release_4.1(candidate1))'
hg: parse error: unknown identifier: release_4.1
[10]
$ hg log -r '"release_4.1(candidate1)"'
6:db72e24fe069 Added tag 1.2 for changeset ff42fde8edbb [release_4.1(candidate1)]
$ hg log -r '("release_4.1(candidate1)")'
6:db72e24fe069 Added tag 1.2 for changeset ff42fde8edbb [release_4.1(candidate1)]
$ hg log -r '::"release_4.1(candidate1)"'
0:a87874c6ec31 first []
1:43114e71eddd second [rev(0)]
2:fb616635b18f Added tag rev(0) for changeset 43114e71eddd ["foo"]
3:a50aae922707 Added tag "foo" for changeset fb616635b18f [foo-bar]
4:bbf52b87b370 Added tag foo-bar for changeset a50aae922707 [foo+bar]
5:ff42fde8edbb Added tag foo+bar for changeset bbf52b87b370 [1.2]
6:db72e24fe069 Added tag 1.2 for changeset ff42fde8edbb [release_4.1(candidate1)]
$ hg log -r '::release_4.1(candidate1)'
hg: parse error: unknown identifier: release_4.1
[10]
Test tag with parenthesis and other function like char
$ hg tag 'release_4.1(arch=x86,arm)'
$ hg log -r 'release_4.1(arch=x86,arm)'
7:b29b25d7d687 Added tag release_4.1(candidate1) for changeset db72e24fe069 [release_4.1(arch=x86,arm)]
$ hg log -r '(release_4.1(arch=x86,arm))'
hg: parse error: unknown identifier: release_4.1
[10]
$ hg log -r 'revset(release_4.1(arch=x86,arm))'
hg: parse error: unknown identifier: release_4.1
[10]
$ hg log -r '"release_4.1(arch=x86,arm)"'
7:b29b25d7d687 Added tag release_4.1(candidate1) for changeset db72e24fe069 [release_4.1(arch=x86,arm)]
$ hg log -r '("release_4.1(arch=x86,arm)")'
7:b29b25d7d687 Added tag release_4.1(candidate1) for changeset db72e24fe069 [release_4.1(arch=x86,arm)]
$ hg log -r '::"release_4.1(arch=x86,arm)"'
0:a87874c6ec31 first []
1:43114e71eddd second [rev(0)]
2:fb616635b18f Added tag rev(0) for changeset 43114e71eddd ["foo"]
3:a50aae922707 Added tag "foo" for changeset fb616635b18f [foo-bar]
4:bbf52b87b370 Added tag foo-bar for changeset a50aae922707 [foo+bar]
5:ff42fde8edbb Added tag foo+bar for changeset bbf52b87b370 [1.2]
6:db72e24fe069 Added tag 1.2 for changeset ff42fde8edbb [release_4.1(candidate1)]
7:b29b25d7d687 Added tag release_4.1(candidate1) for changeset db72e24fe069 [release_4.1(arch=x86,arm)]
$ hg log -r '::release_4.1(arch=x86,arm)'
hg: parse error: unknown identifier: release_4.1
[10]
Test tag conflicting with revset function
$ hg tag 'secret(team=foo,project=bar)'
$ hg log -r 'secret(team=foo,project=bar)'
8:6b2e2d4ea455 Added tag release_4.1(arch=x86,arm) for changeset b29b25d7d687 [secret(team=foo,project=bar)]
$ hg log -r '(secret(team=foo,project=bar))'
hg: parse error: secret takes no arguments
[10]
$ hg log -r 'revset(secret(team=foo,project=bar))'
hg: parse error: secret takes no arguments
[10]
$ hg log -r '"secret(team=foo,project=bar)"'
8:6b2e2d4ea455 Added tag release_4.1(arch=x86,arm) for changeset b29b25d7d687 [secret(team=foo,project=bar)]
$ hg log -r '("secret(team=foo,project=bar)")'
8:6b2e2d4ea455 Added tag release_4.1(arch=x86,arm) for changeset b29b25d7d687 [secret(team=foo,project=bar)]
$ hg log -r '::"secret(team=foo,project=bar)"'
0:a87874c6ec31 first []
1:43114e71eddd second [rev(0)]
2:fb616635b18f Added tag rev(0) for changeset 43114e71eddd ["foo"]
3:a50aae922707 Added tag "foo" for changeset fb616635b18f [foo-bar]
4:bbf52b87b370 Added tag foo-bar for changeset a50aae922707 [foo+bar]
5:ff42fde8edbb Added tag foo+bar for changeset bbf52b87b370 [1.2]
6:db72e24fe069 Added tag 1.2 for changeset ff42fde8edbb [release_4.1(candidate1)]
7:b29b25d7d687 Added tag release_4.1(candidate1) for changeset db72e24fe069 [release_4.1(arch=x86,arm)]
8:6b2e2d4ea455 Added tag release_4.1(arch=x86,arm) for changeset b29b25d7d687 [secret(team=foo,project=bar)]
$ hg log -r '::secret(team=foo,project=bar)'
hg: parse error: secret takes no arguments
[10]
Test tag with space
$ hg tag 'my little version'
$ hg log -r 'my little version'
9:269192bf8fc3 Added tag secret(team=foo,project=bar) for changeset 6b2e2d4ea455 [my little version]
$ hg log -r '(my little version)'
hg: parse error at 4: unexpected token: symbol
((my little version)
^ here)
[10]
$ hg log -r 'revset(my little version)'
hg: parse error at 10: unexpected token: symbol
(revset(my little version)
^ here)
[10]
$ hg log -r '"my little version"'
9:269192bf8fc3 Added tag secret(team=foo,project=bar) for changeset 6b2e2d4ea455 [my little version]
$ hg log -r '("my little version")'
9:269192bf8fc3 Added tag secret(team=foo,project=bar) for changeset 6b2e2d4ea455 [my little version]
$ hg log -r '::"my little version"'
0:a87874c6ec31 first []
1:43114e71eddd second [rev(0)]
2:fb616635b18f Added tag rev(0) for changeset 43114e71eddd ["foo"]
3:a50aae922707 Added tag "foo" for changeset fb616635b18f [foo-bar]
4:bbf52b87b370 Added tag foo-bar for changeset a50aae922707 [foo+bar]
5:ff42fde8edbb Added tag foo+bar for changeset bbf52b87b370 [1.2]
6:db72e24fe069 Added tag 1.2 for changeset ff42fde8edbb [release_4.1(candidate1)]
7:b29b25d7d687 Added tag release_4.1(candidate1) for changeset db72e24fe069 [release_4.1(arch=x86,arm)]
8:6b2e2d4ea455 Added tag release_4.1(arch=x86,arm) for changeset b29b25d7d687 [secret(team=foo,project=bar)]
9:269192bf8fc3 Added tag secret(team=foo,project=bar) for changeset 6b2e2d4ea455 [my little version]
$ hg log -r '::my little version'
hg: parse error at 5: invalid token
(::my little version
^ here)
[10]