Mercurial > public > mercurial-scm > hg-stable
comparison mercurial/revset.py @ 29939:e34cd85dc5b1
revset: fix order of nested '_(|int|hex)list' expression (BC)
This fixes the order of 'x & (y + z)' where 'y' and 'z' are trivial, and the
other uses of _list()-family functions. The original functions are renamed to
'_ordered(|int|hex)list' to say clearly that they do not follow the subset
ordering.
author | Yuya Nishihara <yuya@tcha.org> |
---|---|
date | Sun, 26 Jun 2016 18:41:28 +0900 |
parents | 2c6a05b938d8 |
children | 80c86b9bb40b |
comparison
equal
deleted
inserted
replaced
29938:2c6a05b938d8 | 29939:e34cd85dc5b1 |
---|---|
2251 getargs(x, 0, 0, _("wdir takes no arguments")) | 2251 getargs(x, 0, 0, _("wdir takes no arguments")) |
2252 if node.wdirrev in subset or isinstance(subset, fullreposet): | 2252 if node.wdirrev in subset or isinstance(subset, fullreposet): |
2253 return baseset([node.wdirrev]) | 2253 return baseset([node.wdirrev]) |
2254 return baseset() | 2254 return baseset() |
2255 | 2255 |
2256 # for internal use | 2256 def _orderedlist(repo, subset, x): |
2257 @predicate('_list', safe=True) | |
2258 def _list(repo, subset, x): | |
2259 s = getstring(x, "internal error") | 2257 s = getstring(x, "internal error") |
2260 if not s: | 2258 if not s: |
2261 return baseset() | 2259 return baseset() |
2262 # remove duplicates here. it's difficult for caller to deduplicate sets | 2260 # remove duplicates here. it's difficult for caller to deduplicate sets |
2263 # because different symbols can point to the same rev. | 2261 # because different symbols can point to the same rev. |
2282 ls.append(r) | 2280 ls.append(r) |
2283 seen.add(r) | 2281 seen.add(r) |
2284 return baseset(ls) | 2282 return baseset(ls) |
2285 | 2283 |
2286 # for internal use | 2284 # for internal use |
2287 @predicate('_intlist', safe=True) | 2285 @predicate('_list', safe=True, takeorder=True) |
2288 def _intlist(repo, subset, x): | 2286 def _list(repo, subset, x, order): |
2287 if order == followorder: | |
2288 # slow path to take the subset order | |
2289 return subset & _orderedlist(repo, fullreposet(repo), x) | |
2290 else: | |
2291 return _orderedlist(repo, subset, x) | |
2292 | |
2293 def _orderedintlist(repo, subset, x): | |
2289 s = getstring(x, "internal error") | 2294 s = getstring(x, "internal error") |
2290 if not s: | 2295 if not s: |
2291 return baseset() | 2296 return baseset() |
2292 ls = [int(r) for r in s.split('\0')] | 2297 ls = [int(r) for r in s.split('\0')] |
2293 s = subset | 2298 s = subset |
2294 return baseset([r for r in ls if r in s]) | 2299 return baseset([r for r in ls if r in s]) |
2295 | 2300 |
2296 # for internal use | 2301 # for internal use |
2297 @predicate('_hexlist', safe=True) | 2302 @predicate('_intlist', safe=True, takeorder=True) |
2298 def _hexlist(repo, subset, x): | 2303 def _intlist(repo, subset, x, order): |
2304 if order == followorder: | |
2305 # slow path to take the subset order | |
2306 return subset & _orderedintlist(repo, fullreposet(repo), x) | |
2307 else: | |
2308 return _orderedintlist(repo, subset, x) | |
2309 | |
2310 def _orderedhexlist(repo, subset, x): | |
2299 s = getstring(x, "internal error") | 2311 s = getstring(x, "internal error") |
2300 if not s: | 2312 if not s: |
2301 return baseset() | 2313 return baseset() |
2302 cl = repo.changelog | 2314 cl = repo.changelog |
2303 ls = [cl.rev(node.bin(r)) for r in s.split('\0')] | 2315 ls = [cl.rev(node.bin(r)) for r in s.split('\0')] |
2304 s = subset | 2316 s = subset |
2305 return baseset([r for r in ls if r in s]) | 2317 return baseset([r for r in ls if r in s]) |
2318 | |
2319 # for internal use | |
2320 @predicate('_hexlist', safe=True, takeorder=True) | |
2321 def _hexlist(repo, subset, x, order): | |
2322 if order == followorder: | |
2323 # slow path to take the subset order | |
2324 return subset & _orderedhexlist(repo, fullreposet(repo), x) | |
2325 else: | |
2326 return _orderedhexlist(repo, subset, x) | |
2306 | 2327 |
2307 methods = { | 2328 methods = { |
2308 "range": rangeset, | 2329 "range": rangeset, |
2309 "dagrange": dagrange, | 2330 "dagrange": dagrange, |
2310 "string": stringset, | 2331 "string": stringset, |