Mercurial > public > mercurial-scm > hg-stable
comparison mercurial/revset.py @ 17886:d8905e2c1301 stable
revset: accept @ in unquoted symbols (issue3686)
author | Matt Mackall <mpm@selenic.com> |
---|---|
date | Tue, 30 Oct 2012 18:48:44 -0500 |
parents | c73f7a28953c |
children | 03e552aaae67 54cedee86e51 |
comparison
equal
deleted
inserted
replaced
17885:9a2cf955db84 | 17886:d8905e2c1301 |
---|---|
103 } | 103 } |
104 | 104 |
105 keywords = set(['and', 'or', 'not']) | 105 keywords = set(['and', 'or', 'not']) |
106 | 106 |
107 def tokenize(program): | 107 def tokenize(program): |
108 ''' | |
109 Parse a revset statement into a stream of tokens | |
110 | |
111 Check that @ is a valid unquoted token character (issue3686): | |
112 >>> list(tokenize("@::")) | |
113 [('symbol', '@', 0), ('::', None, 1), ('end', None, 3)] | |
114 | |
115 ''' | |
116 | |
108 pos, l = 0, len(program) | 117 pos, l = 0, len(program) |
109 while pos < l: | 118 while pos < l: |
110 c = program[pos] | 119 c = program[pos] |
111 if c.isspace(): # skip inter-token whitespace | 120 if c.isspace(): # skip inter-token whitespace |
112 pass | 121 pass |
138 break | 147 break |
139 pos += 1 | 148 pos += 1 |
140 else: | 149 else: |
141 raise error.ParseError(_("unterminated string"), s) | 150 raise error.ParseError(_("unterminated string"), s) |
142 # gather up a symbol/keyword | 151 # gather up a symbol/keyword |
143 elif c.isalnum() or c in '._' or ord(c) > 127: | 152 elif c.isalnum() or c in '._@' or ord(c) > 127: |
144 s = pos | 153 s = pos |
145 pos += 1 | 154 pos += 1 |
146 while pos < l: # find end of symbol | 155 while pos < l: # find end of symbol |
147 d = program[pos] | 156 d = program[pos] |
148 if not (d.isalnum() or d in "._/" or ord(d) > 127): | 157 if not (d.isalnum() or d in "._/@" or ord(d) > 127): |
149 break | 158 break |
150 if d == '.' and program[pos - 1] == '.': # special case for .. | 159 if d == '.' and program[pos - 1] == '.': # special case for .. |
151 pos -= 1 | 160 pos -= 1 |
152 break | 161 break |
153 pos += 1 | 162 pos += 1 |