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,