comparison tests/test-revset-legacy-lookup.t @ 37760:29eb4cafeeb8

revset: skip legacy lookup for revspec wrapped in 'revset(...)' Currently, multiple labels can take forms that can be confused with revset (eg: "rev(0)" is a valid tag). Since we look up for tags before evaluating revset, this means a tag can shadow a valid revset at any time. We now enforce the strict revset parsing when wrapped with 'revset(...)'. For now, This only work on a whole revspec (but can be used within the revset without effect). This might change in the future if we improve the implementation. The feature is undocumented for now, keeping it in the experimental namespace. In case a better approach to achieve the same goal is found. The syntax looks like a revset but is not implemented as such for now. Since the goal is to avoid some preprocessing that happens before revset parsing, we cannot simply implement it as a revset predicate. There was other approaches discussed over the mailing-list but they were less convincing. Having a configuration flag to disable legacy lookup have been considered but discarded. There are too many common uses of ambiguous identifier (eg: '+', '-' or '..') to have the legacy lookup mechanism turned off. In addition, the approach can control the parsing of each revset, making it more flexible. For example, a revset used as the value of an existing configuration option (eg: pushrev) could enforce its resolution as a revset (by using the prefix) while user inputs would still use the legacy lookup. In addition of offering a way to unambiguously input a revset, this prefix allow skipping the name lookup providing a significant speedup in some case.
author Boris Feld <boris.feld@octobus.net>
date Tue, 10 Apr 2018 16:06:52 +0200
parents aa3f63e02c3c
children ed84a4d48910
comparison
equal deleted inserted replaced
37759:aa3f63e02c3c 37760:29eb4cafeeb8
60 (still resolved as the label) 60 (still resolved as the label)
61 61
62 $ hg log -r 'rev(0) and branch(default)' 62 $ hg log -r 'rev(0) and branch(default)'
63 0:a87874c6ec31 first [] 63 0:a87874c6ec31 first []
64 64
65 with explicit revset resolution
66 (still resolved as the label)
67
68 $ hg log -r 'revset(rev(0))'
69 0:a87874c6ec31 first []
70
65 some of the above with quote to force its resolution as a label 71 some of the above with quote to force its resolution as a label
66 72
67 $ hg log -r ':"rev(0)"' 73 $ hg log -r ':"rev(0)"'
68 0:a87874c6ec31 first [] 74 0:a87874c6ec31 first []
69 1:43114e71eddd second [rev(0)] 75 1:43114e71eddd second [rev(0)]
89 $ hg log -r '"foo"' 95 $ hg log -r '"foo"'
90 2:fb616635b18f Added tag rev(0) for changeset 43114e71eddd ["foo"] 96 2:fb616635b18f Added tag rev(0) for changeset 43114e71eddd ["foo"]
91 $ hg log -r '("foo")' 97 $ hg log -r '("foo")'
92 abort: unknown revision 'foo'! 98 abort: unknown revision 'foo'!
93 [255] 99 [255]
100 $ hg log -r 'revset("foo")'
101 abort: unknown revision 'foo'!
102 [255]
94 $ hg log -r '("\"foo\"")' 103 $ hg log -r '("\"foo\"")'
95 2:fb616635b18f Added tag rev(0) for changeset 43114e71eddd ["foo"] 104 2:fb616635b18f Added tag rev(0) for changeset 43114e71eddd ["foo"]
105 $ hg log -r 'revset("\"foo\"")'
106 2:fb616635b18f Added tag rev(0) for changeset 43114e71eddd ["foo"]
96 107
97 Test label with dash in them. 108 Test label with dash in them.
98 109
99 $ hg tag 'foo-bar' 110 $ hg tag 'foo-bar'
100 111
114 $ hg log -r 'foo+bar' 125 $ hg log -r 'foo+bar'
115 4:bbf52b87b370 Added tag foo-bar for changeset a50aae922707 [foo+bar] 126 4:bbf52b87b370 Added tag foo-bar for changeset a50aae922707 [foo+bar]
116 $ hg log -r '(foo+bar)' 127 $ hg log -r '(foo+bar)'
117 abort: unknown revision 'foo'! 128 abort: unknown revision 'foo'!
118 [255] 129 [255]
130 $ hg log -r 'revset(foo+bar)'
131 abort: unknown revision 'foo'!
132 [255]
119 $ hg log -r '"foo+bar"' 133 $ hg log -r '"foo+bar"'
120 4:bbf52b87b370 Added tag foo-bar for changeset a50aae922707 [foo+bar] 134 4:bbf52b87b370 Added tag foo-bar for changeset a50aae922707 [foo+bar]
121 $ hg log -r '("foo+bar")' 135 $ hg log -r '("foo+bar")'
122 4:bbf52b87b370 Added tag foo-bar for changeset a50aae922707 [foo+bar] 136 4:bbf52b87b370 Added tag foo-bar for changeset a50aae922707 [foo+bar]
123 137
127 141
128 $ hg log -r '1.2' 142 $ hg log -r '1.2'
129 5:ff42fde8edbb Added tag foo+bar for changeset bbf52b87b370 [1.2] 143 5:ff42fde8edbb Added tag foo+bar for changeset bbf52b87b370 [1.2]
130 $ hg log -r '(1.2)' 144 $ hg log -r '(1.2)'
131 5:ff42fde8edbb Added tag foo+bar for changeset bbf52b87b370 [1.2] 145 5:ff42fde8edbb Added tag foo+bar for changeset bbf52b87b370 [1.2]
146 $ hg log -r 'revset(1.2)'
147 5:ff42fde8edbb Added tag foo+bar for changeset bbf52b87b370 [1.2]
132 $ hg log -r '"1.2"' 148 $ hg log -r '"1.2"'
133 5:ff42fde8edbb Added tag foo+bar for changeset bbf52b87b370 [1.2] 149 5:ff42fde8edbb Added tag foo+bar for changeset bbf52b87b370 [1.2]
134 $ hg log -r '("1.2")' 150 $ hg log -r '("1.2")'
135 5:ff42fde8edbb Added tag foo+bar for changeset bbf52b87b370 [1.2] 151 5:ff42fde8edbb Added tag foo+bar for changeset bbf52b87b370 [1.2]
136 $ hg log -r '::"1.2"' 152 $ hg log -r '::"1.2"'
155 $ hg log -r 'release_4.1(candidate1)' 171 $ hg log -r 'release_4.1(candidate1)'
156 6:db72e24fe069 Added tag 1.2 for changeset ff42fde8edbb [release_4.1(candidate1)] 172 6:db72e24fe069 Added tag 1.2 for changeset ff42fde8edbb [release_4.1(candidate1)]
157 $ hg log -r '(release_4.1(candidate1))' 173 $ hg log -r '(release_4.1(candidate1))'
158 hg: parse error: unknown identifier: release_4.1 174 hg: parse error: unknown identifier: release_4.1
159 [255] 175 [255]
176 $ hg log -r 'revset(release_4.1(candidate1))'
177 hg: parse error: unknown identifier: release_4.1
178 [255]
160 $ hg log -r '"release_4.1(candidate1)"' 179 $ hg log -r '"release_4.1(candidate1)"'
161 6:db72e24fe069 Added tag 1.2 for changeset ff42fde8edbb [release_4.1(candidate1)] 180 6:db72e24fe069 Added tag 1.2 for changeset ff42fde8edbb [release_4.1(candidate1)]
162 $ hg log -r '("release_4.1(candidate1)")' 181 $ hg log -r '("release_4.1(candidate1)")'
163 6:db72e24fe069 Added tag 1.2 for changeset ff42fde8edbb [release_4.1(candidate1)] 182 6:db72e24fe069 Added tag 1.2 for changeset ff42fde8edbb [release_4.1(candidate1)]
164 $ hg log -r '::"release_4.1(candidate1)"' 183 $ hg log -r '::"release_4.1(candidate1)"'
180 $ hg log -r 'release_4.1(arch=x86,arm)' 199 $ hg log -r 'release_4.1(arch=x86,arm)'
181 7:b29b25d7d687 Added tag release_4.1(candidate1) for changeset db72e24fe069 [release_4.1(arch=x86,arm)] 200 7:b29b25d7d687 Added tag release_4.1(candidate1) for changeset db72e24fe069 [release_4.1(arch=x86,arm)]
182 $ hg log -r '(release_4.1(arch=x86,arm))' 201 $ hg log -r '(release_4.1(arch=x86,arm))'
183 hg: parse error: unknown identifier: release_4.1 202 hg: parse error: unknown identifier: release_4.1
184 [255] 203 [255]
204 $ hg log -r 'revset(release_4.1(arch=x86,arm))'
205 hg: parse error: unknown identifier: release_4.1
206 [255]
185 $ hg log -r '"release_4.1(arch=x86,arm)"' 207 $ hg log -r '"release_4.1(arch=x86,arm)"'
186 7:b29b25d7d687 Added tag release_4.1(candidate1) for changeset db72e24fe069 [release_4.1(arch=x86,arm)] 208 7:b29b25d7d687 Added tag release_4.1(candidate1) for changeset db72e24fe069 [release_4.1(arch=x86,arm)]
187 $ hg log -r '("release_4.1(arch=x86,arm)")' 209 $ hg log -r '("release_4.1(arch=x86,arm)")'
188 7:b29b25d7d687 Added tag release_4.1(candidate1) for changeset db72e24fe069 [release_4.1(arch=x86,arm)] 210 7:b29b25d7d687 Added tag release_4.1(candidate1) for changeset db72e24fe069 [release_4.1(arch=x86,arm)]
189 $ hg log -r '::"release_4.1(arch=x86,arm)"' 211 $ hg log -r '::"release_4.1(arch=x86,arm)"'
204 $ hg tag 'secret(team=foo,project=bar)' 226 $ hg tag 'secret(team=foo,project=bar)'
205 227
206 $ hg log -r 'secret(team=foo,project=bar)' 228 $ hg log -r 'secret(team=foo,project=bar)'
207 8:6b2e2d4ea455 Added tag release_4.1(arch=x86,arm) for changeset b29b25d7d687 [secret(team=foo,project=bar)] 229 8:6b2e2d4ea455 Added tag release_4.1(arch=x86,arm) for changeset b29b25d7d687 [secret(team=foo,project=bar)]
208 $ hg log -r '(secret(team=foo,project=bar))' 230 $ hg log -r '(secret(team=foo,project=bar))'
231 hg: parse error: secret takes no arguments
232 [255]
233 $ hg log -r 'revset(secret(team=foo,project=bar))'
209 hg: parse error: secret takes no arguments 234 hg: parse error: secret takes no arguments
210 [255] 235 [255]
211 $ hg log -r '"secret(team=foo,project=bar)"' 236 $ hg log -r '"secret(team=foo,project=bar)"'
212 8:6b2e2d4ea455 Added tag release_4.1(arch=x86,arm) for changeset b29b25d7d687 [secret(team=foo,project=bar)] 237 8:6b2e2d4ea455 Added tag release_4.1(arch=x86,arm) for changeset b29b25d7d687 [secret(team=foo,project=bar)]
213 $ hg log -r '("secret(team=foo,project=bar)")' 238 $ hg log -r '("secret(team=foo,project=bar)")'
235 $ hg log -r '(my little version)' 260 $ hg log -r '(my little version)'
236 hg: parse error at 4: unexpected token: symbol 261 hg: parse error at 4: unexpected token: symbol
237 ((my little version) 262 ((my little version)
238 ^ here) 263 ^ here)
239 [255] 264 [255]
265 $ hg log -r 'revset(my little version)'
266 hg: parse error at 10: unexpected token: symbol
267 (revset(my little version)
268 ^ here)
269 [255]
240 $ hg log -r '"my little version"' 270 $ hg log -r '"my little version"'
241 9:269192bf8fc3 Added tag secret(team=foo,project=bar) for changeset 6b2e2d4ea455 [my little version] 271 9:269192bf8fc3 Added tag secret(team=foo,project=bar) for changeset 6b2e2d4ea455 [my little version]
242 $ hg log -r '("my little version")' 272 $ hg log -r '("my little version")'
243 9:269192bf8fc3 Added tag secret(team=foo,project=bar) for changeset 6b2e2d4ea455 [my little version] 273 9:269192bf8fc3 Added tag secret(team=foo,project=bar) for changeset 6b2e2d4ea455 [my little version]
244 $ hg log -r '::"my little version"' 274 $ hg log -r '::"my little version"'