comparison mercurial/revsetlang.py @ 35560:3a8810c1b9bc

revsetlang: use iterator to track current argument in formatspec()
author Yuya Nishihara <yuya@tcha.org>
date Sat, 01 Apr 2017 17:04:49 +0900
parents a480551bd1b4
children 4c3a4bb31c0e
comparison
equal deleted inserted replaced
35559:a480551bd1b4 35560:3a8810c1b9bc
618 618
619 m = l // 2 619 m = l // 2
620 return '(%s or %s)' % (listexp(s[:m], t), listexp(s[m:], t)) 620 return '(%s or %s)' % (listexp(s[:m], t), listexp(s[m:], t))
621 621
622 expr = pycompat.bytestr(expr) 622 expr = pycompat.bytestr(expr)
623 argiter = iter(args)
623 ret = [] 624 ret = []
624 pos = 0 625 pos = 0
625 arg = 0
626 while pos < len(expr): 626 while pos < len(expr):
627 q = expr.find('%', pos) 627 q = expr.find('%', pos)
628 if q < 0: 628 if q < 0:
629 ret.append(expr[pos:]) 629 ret.append(expr[pos:])
630 break 630 break
632 pos = q + 1 632 pos = q + 1
633 d = expr[pos] 633 d = expr[pos]
634 if d == '%': 634 if d == '%':
635 ret.append(d) 635 ret.append(d)
636 elif d in 'dsnbr': 636 elif d in 'dsnbr':
637 ret.append(argtype(d, args[arg])) 637 ret.append(argtype(d, next(argiter)))
638 arg += 1
639 elif d == 'l': 638 elif d == 'l':
640 # a list of some type 639 # a list of some type
641 pos += 1 640 pos += 1
642 d = expr[pos] 641 d = expr[pos]
643 ret.append(listexp(list(args[arg]), d)) 642 ret.append(listexp(list(next(argiter)), d))
644 arg += 1
645 else: 643 else:
646 raise error.Abort(_('unexpected revspec format character %s') % d) 644 raise error.Abort(_('unexpected revspec format character %s') % d)
647 pos += 1 645 pos += 1
648 646
649 return ''.join(ret) 647 return ''.join(ret)