261 r = re.compile(getstring(x, _("grep requires a pattern"))) |
261 r = re.compile(getstring(x, _("grep requires a pattern"))) |
262 except re.error, e: |
262 except re.error, e: |
263 raise error.ParseError(_('invalid match pattern: %s') % e) |
263 raise error.ParseError(_('invalid match pattern: %s') % e) |
264 return [f for f in mctx.existing() if r.search(mctx.ctx[f].data())] |
264 return [f for f in mctx.existing() if r.search(mctx.ctx[f].data())] |
265 |
265 |
266 _units = dict(k=2**10, K=2**10, kB=2**10, KB=2**10, |
|
267 M=2**20, MB=2**20, G=2**30, GB=2**30) |
|
268 |
|
269 def _sizetoint(s): |
|
270 try: |
|
271 s = s.strip() |
|
272 for k, v in _units.items(): |
|
273 if s.endswith(k): |
|
274 return int(float(s[:-len(k)]) * v) |
|
275 return int(s) |
|
276 except ValueError: |
|
277 raise error.ParseError(_("couldn't parse size: %s") % s) |
|
278 |
|
279 def _sizetomax(s): |
266 def _sizetomax(s): |
280 try: |
267 try: |
281 s = s.strip() |
268 s = s.strip() |
282 for k, v in _units.items(): |
269 for k, v in util._sizeunits: |
283 if s.endswith(k): |
270 if s.endswith(k): |
284 # max(4k) = 5k - 1, max(4.5k) = 4.6k - 1 |
271 # max(4k) = 5k - 1, max(4.5k) = 4.6k - 1 |
285 n = s[:-len(k)] |
272 n = s[:-len(k)] |
286 inc = 1.0 |
273 inc = 1.0 |
287 if "." in n: |
274 if "." in n: |
304 |
291 |
305 # i18n: "size" is a keyword |
292 # i18n: "size" is a keyword |
306 expr = getstring(x, _("size requires an expression")).strip() |
293 expr = getstring(x, _("size requires an expression")).strip() |
307 if '-' in expr: # do we have a range? |
294 if '-' in expr: # do we have a range? |
308 a, b = expr.split('-', 1) |
295 a, b = expr.split('-', 1) |
309 a = _sizetoint(a) |
296 a = util.sizetoint(a) |
310 b = _sizetoint(b) |
297 b = util.sizetoint(b) |
311 m = lambda x: x >= a and x <= b |
298 m = lambda x: x >= a and x <= b |
312 elif expr.startswith("<="): |
299 elif expr.startswith("<="): |
313 a = _sizetoint(expr[2:]) |
300 a = util.sizetoint(expr[2:]) |
314 m = lambda x: x <= a |
301 m = lambda x: x <= a |
315 elif expr.startswith("<"): |
302 elif expr.startswith("<"): |
316 a = _sizetoint(expr[1:]) |
303 a = util.sizetoint(expr[1:]) |
317 m = lambda x: x < a |
304 m = lambda x: x < a |
318 elif expr.startswith(">="): |
305 elif expr.startswith(">="): |
319 a = _sizetoint(expr[2:]) |
306 a = util.sizetoint(expr[2:]) |
320 m = lambda x: x >= a |
307 m = lambda x: x >= a |
321 elif expr.startswith(">"): |
308 elif expr.startswith(">"): |
322 a = _sizetoint(expr[1:]) |
309 a = util.sizetoint(expr[1:]) |
323 m = lambda x: x > a |
310 m = lambda x: x > a |
324 elif expr[0].isdigit or expr[0] == '.': |
311 elif expr[0].isdigit or expr[0] == '.': |
325 a = _sizetoint(expr) |
312 a = util.sizetoint(expr) |
326 b = _sizetomax(expr) |
313 b = _sizetomax(expr) |
327 m = lambda x: x >= a and x <= b |
314 m = lambda x: x >= a and x <= b |
328 else: |
315 else: |
329 raise error.ParseError(_("couldn't parse size: %s") % expr) |
316 raise error.ParseError(_("couldn't parse size: %s") % expr) |
330 |
317 |