Mercurial > public > mercurial-scm > hg
comparison mercurial/revset.py @ 28015:a036e1ae1fbe
merge with stable
author | Matt Mackall <mpm@selenic.com> |
---|---|
date | Sun, 07 Feb 2016 00:49:31 -0600 |
parents | 86c4cbdaffee b19d8d5d6b51 |
children | 5476a7a039c0 |
comparison
equal
deleted
inserted
replaced
28014:83fc0c055664 | 28015:a036e1ae1fbe |
---|---|
317 | 317 |
318 def getlist(x): | 318 def getlist(x): |
319 if not x: | 319 if not x: |
320 return [] | 320 return [] |
321 if x[0] == 'list': | 321 if x[0] == 'list': |
322 return getlist(x[1]) + [x[2]] | 322 return list(x[1:]) |
323 return [x] | 323 return [x] |
324 | 324 |
325 def getargs(x, min, max, err): | 325 def getargs(x, min, max, err): |
326 l = getlist(x) | 326 l = getlist(x) |
327 if len(l) < min or (max >= 0 and len(l) > max): | 327 if len(l) < min or (max >= 0 and len(l) > max): |
446 return a + b | 446 return a + b |
447 | 447 |
448 def notset(repo, subset, x): | 448 def notset(repo, subset, x): |
449 return subset - getset(repo, subset, x) | 449 return subset - getset(repo, subset, x) |
450 | 450 |
451 def listset(repo, subset, a, b): | 451 def listset(repo, subset, *xs): |
452 raise error.ParseError(_("can't use a list in this context"), | 452 raise error.ParseError(_("can't use a list in this context"), |
453 hint=_('see hg help "revsets.x or y"')) | 453 hint=_('see hg help "revsets.x or y"')) |
454 | 454 |
455 def keyvaluepair(repo, subset, k, v): | 455 def keyvaluepair(repo, subset, k, v): |
456 raise error.ParseError(_("can't use a key-value pair in this context")) | 456 raise error.ParseError(_("can't use a key-value pair in this context")) |
2251 elif op == 'parentpost': | 2251 elif op == 'parentpost': |
2252 o = optimize(x[1], small) | 2252 o = optimize(x[1], small) |
2253 return o[0], (op, o[1]) | 2253 return o[0], (op, o[1]) |
2254 elif op == 'group': | 2254 elif op == 'group': |
2255 return optimize(x[1], small) | 2255 return optimize(x[1], small) |
2256 elif op in 'dagrange range list parent ancestorspec': | 2256 elif op in 'dagrange range parent ancestorspec': |
2257 if op == 'parent': | 2257 if op == 'parent': |
2258 # x^:y means (x^) : y, not x ^ (:y) | 2258 # x^:y means (x^) : y, not x ^ (:y) |
2259 post = ('parentpost', x[1]) | 2259 post = ('parentpost', x[1]) |
2260 if x[2][0] == 'dagrangepre': | 2260 if x[2][0] == 'dagrangepre': |
2261 return optimize(('dagrange', post, x[2][1]), small) | 2261 return optimize(('dagrange', post, x[2][1]), small) |
2263 return optimize(('range', post, x[2][1]), small) | 2263 return optimize(('range', post, x[2][1]), small) |
2264 | 2264 |
2265 wa, ta = optimize(x[1], small) | 2265 wa, ta = optimize(x[1], small) |
2266 wb, tb = optimize(x[2], small) | 2266 wb, tb = optimize(x[2], small) |
2267 return wa + wb, (op, ta, tb) | 2267 return wa + wb, (op, ta, tb) |
2268 elif op == 'list': | |
2269 ws, ts = zip(*(optimize(y, small) for y in x[1:])) | |
2270 return sum(ws), (op,) + ts | |
2268 elif op == 'func': | 2271 elif op == 'func': |
2269 f = getstring(x[1], _("not a symbol")) | 2272 f = getstring(x[1], _("not a symbol")) |
2270 wa, ta = optimize(x[2], small) | 2273 wa, ta = optimize(x[2], small) |
2271 if f in ("author branch closed date desc file grep keyword " | 2274 if f in ("author branch closed date desc file grep keyword " |
2272 "outgoing user"): | 2275 "outgoing user"): |
2364 p = parser.parser(elements) | 2367 p = parser.parser(elements) |
2365 try: | 2368 try: |
2366 tree, pos = p.parse(_tokenizealias(decl)) | 2369 tree, pos = p.parse(_tokenizealias(decl)) |
2367 if (pos != len(decl)): | 2370 if (pos != len(decl)): |
2368 raise error.ParseError(_('invalid token'), pos) | 2371 raise error.ParseError(_('invalid token'), pos) |
2372 tree = parser.simplifyinfixops(tree, ('list',)) | |
2369 | 2373 |
2370 if isvalidsymbol(tree): | 2374 if isvalidsymbol(tree): |
2371 # "name = ...." style | 2375 # "name = ...." style |
2372 name = getsymbol(tree) | 2376 name = getsymbol(tree) |
2373 if name.startswith('$'): | 2377 if name.startswith('$'): |
2454 | 2458 |
2455 p = parser.parser(elements) | 2459 p = parser.parser(elements) |
2456 tree, pos = p.parse(tokenizedefn(defn)) | 2460 tree, pos = p.parse(tokenizedefn(defn)) |
2457 if pos != len(defn): | 2461 if pos != len(defn): |
2458 raise error.ParseError(_('invalid token'), pos) | 2462 raise error.ParseError(_('invalid token'), pos) |
2459 return parser.simplifyinfixops(tree, ('or',)) | 2463 return parser.simplifyinfixops(tree, ('list', 'or')) |
2460 | 2464 |
2461 class revsetalias(object): | 2465 class revsetalias(object): |
2462 # whether own `error` information is already shown or not. | 2466 # whether own `error` information is already shown or not. |
2463 # this avoids showing same warning multiple times at each `findaliases`. | 2467 # this avoids showing same warning multiple times at each `findaliases`. |
2464 warned = False | 2468 warned = False |
2585 def parse(spec, lookup=None): | 2589 def parse(spec, lookup=None): |
2586 p = parser.parser(elements) | 2590 p = parser.parser(elements) |
2587 tree, pos = p.parse(tokenize(spec, lookup=lookup)) | 2591 tree, pos = p.parse(tokenize(spec, lookup=lookup)) |
2588 if pos != len(spec): | 2592 if pos != len(spec): |
2589 raise error.ParseError(_("invalid token"), pos) | 2593 raise error.ParseError(_("invalid token"), pos) |
2590 return parser.simplifyinfixops(tree, ('or',)) | 2594 return parser.simplifyinfixops(tree, ('list', 'or')) |
2591 | 2595 |
2592 def posttreebuilthook(tree, repo): | 2596 def posttreebuilthook(tree, repo): |
2593 # hook for extensions to execute code on the optimized tree | 2597 # hook for extensions to execute code on the optimized tree |
2594 pass | 2598 pass |
2595 | 2599 |