comparison mercurial/revset.py @ 11278:7df88cdf47fd

revset: add support for prefix and suffix versions of : and ::
author Matt Mackall <mpm@selenic.com>
date Wed, 02 Jun 2010 14:07:46 -0500
parents c9ce8ecd6ca1
children 62ccf4cd6e7f
comparison
equal deleted inserted replaced
11277:2698a95f3f1b 11278:7df88cdf47fd
10 import match as _match 10 import match as _match
11 11
12 elements = { 12 elements = {
13 "(": (20, ("group", 1, ")"), ("func", 1, ")")), 13 "(": (20, ("group", 1, ")"), ("func", 1, ")")),
14 "-": (19, ("negate", 19), ("minus", 19)), 14 "-": (19, ("negate", 19), ("minus", 19)),
15 "..": (17, None, ("dagrange", 17)), 15 "::": (17, ("dagrangepre", 17), ("dagrange", 17),
16 ":": (15, None, ("range", 15)), 16 ("dagrangepost", 17)),
17 "..": (17, ("dagrangepre", 17), ("dagrange", 17),
18 ("dagrangepost", 17)),
19 ":": (15, ("rangepre", 15), ("range", 15), ("rangepost", 15)),
17 "not": (10, ("not", 10)), 20 "not": (10, ("not", 10)),
18 "!": (10, ("not", 10)), 21 "!": (10, ("not", 10)),
19 "and": (5, None, ("and", 5)), 22 "and": (5, None, ("and", 5)),
20 "&": (5, None, ("and", 5)), 23 "&": (5, None, ("and", 5)),
21 "or": (4, None, ("or", 4)), 24 "or": (4, None, ("or", 4)),
34 pos, l = 0, len(program) 37 pos, l = 0, len(program)
35 while pos < l: 38 while pos < l:
36 c = program[pos] 39 c = program[pos]
37 if c.isspace(): # skip inter-token whitespace 40 if c.isspace(): # skip inter-token whitespace
38 pass 41 pass
39 elif c in "():,-|&+!": # handle simple operators 42 elif c == ':' and program[pos:pos + 2] == '::': # look ahead carefully
40 yield (c, None) 43 yield ('::', None)
44 pos += 1 # skip ahead
41 elif c == '.' and program[pos:pos + 2] == '..': # look ahead carefully 45 elif c == '.' and program[pos:pos + 2] == '..': # look ahead carefully
42 yield ('..', None) 46 yield ('..', None)
43 pos += 1 # skip ahead 47 pos += 1 # skip ahead
48 elif c in "():,-|&+!": # handle simple operators
49 yield (c, None)
44 elif c in '"\'': # handle quoted strings 50 elif c in '"\'': # handle quoted strings
45 pos += 1 51 pos += 1
46 s = pos 52 s = pos
47 while pos < l: # find closing quote 53 while pos < l: # find closing quote
48 d = program[pos] 54 d = program[pos]
124 n = getset(repo, subset, y)[-1] 130 n = getset(repo, subset, y)[-1]
125 if m < n: 131 if m < n:
126 return range(m, n + 1) 132 return range(m, n + 1)
127 return range(m, n - 1, -1) 133 return range(m, n - 1, -1)
128 134
135 def rangepreset(repo, subset, x):
136 return range(0, getset(repo, subset, x)[-1] + 1)
137
138 def rangepostset(repo, subset, x):
139 return range(getset(repo, subset, x)[0], len(repo))
140
129 def dagrangeset(repo, subset, x, y): 141 def dagrangeset(repo, subset, x, y):
130 return andset(repo, subset, 142 return andset(repo, subset,
131 ('func', ('symbol', 'descendants'), x), 143 ('func', ('symbol', 'descendants'), x),
132 ('func', ('symbol', 'ancestors'), y)) 144 ('func', ('symbol', 'ancestors'), y))
133 145
467 479
468 methods = { 480 methods = {
469 "negate": negate, 481 "negate": negate,
470 "minus": minusset, 482 "minus": minusset,
471 "range": rangeset, 483 "range": rangeset,
484 "rangepre": rangepreset,
485 "rangepost": rangepostset,
472 "dagrange": dagrangeset, 486 "dagrange": dagrangeset,
487 "dagrangepre": ancestors,
488 "dagrangepost": descendants,
473 "string": stringset, 489 "string": stringset,
474 "symbol": symbolset, 490 "symbol": symbolset,
475 "and": andset, 491 "and": andset,
476 "or": orset, 492 "or": orset,
477 "not": notset, 493 "not": notset,