##// END OF EJS Templates
revsetlang: unnest inner functions from formatspec()
Yuya Nishihara -
r35614:a57acea3 default
parent child Browse files
Show More
@@ -555,6 +555,44 b' def _quote(s):'
555 555 """
556 556 return "'%s'" % util.escapestr(pycompat.bytestr(s))
557 557
558 def _formatargtype(c, arg):
559 if c == 'd':
560 return '%d' % int(arg)
561 elif c == 's':
562 return _quote(arg)
563 elif c == 'r':
564 parse(arg) # make sure syntax errors are confined
565 return '(%s)' % arg
566 elif c == 'n':
567 return _quote(node.hex(arg))
568 elif c == 'b':
569 try:
570 return _quote(arg.branch())
571 except AttributeError:
572 raise TypeError
573 raise error.ParseError(_('unexpected revspec format character %s') % c)
574
575 def _formatlistexp(s, t):
576 l = len(s)
577 if l == 0:
578 return "_list('')"
579 elif l == 1:
580 return _formatargtype(t, s[0])
581 elif t == 'd':
582 return "_intlist('%s')" % "\0".join('%d' % int(a) for a in s)
583 elif t == 's':
584 return "_list(%s)" % _quote("\0".join(s))
585 elif t == 'n':
586 return "_hexlist('%s')" % "\0".join(node.hex(a) for a in s)
587 elif t == 'b':
588 try:
589 return "_list('%s')" % "\0".join(a.branch() for a in s)
590 except AttributeError:
591 raise TypeError
592
593 m = l // 2
594 return '(%s or %s)' % (_formatlistexp(s[:m], t), _formatlistexp(s[m:], t))
595
558 596 def formatspec(expr, *args):
559 597 '''
560 598 This is a convenience function for using revsets internally, and
@@ -589,45 +627,6 b' def formatspec(expr, *args):'
589 627 >>> formatspec('%ls', ['a', "'"])
590 628 "_list('a\\\\x00\\\\'')"
591 629 '''
592
593 def argtype(c, arg):
594 if c == 'd':
595 return '%d' % int(arg)
596 elif c == 's':
597 return _quote(arg)
598 elif c == 'r':
599 parse(arg) # make sure syntax errors are confined
600 return '(%s)' % arg
601 elif c == 'n':
602 return _quote(node.hex(arg))
603 elif c == 'b':
604 try:
605 return _quote(arg.branch())
606 except AttributeError:
607 raise TypeError
608 raise error.ParseError(_('unexpected revspec format character %s') % c)
609
610 def listexp(s, t):
611 l = len(s)
612 if l == 0:
613 return "_list('')"
614 elif l == 1:
615 return argtype(t, s[0])
616 elif t == 'd':
617 return "_intlist('%s')" % "\0".join('%d' % int(a) for a in s)
618 elif t == 's':
619 return "_list(%s)" % _quote("\0".join(s))
620 elif t == 'n':
621 return "_hexlist('%s')" % "\0".join(node.hex(a) for a in s)
622 elif t == 'b':
623 try:
624 return "_list('%s')" % "\0".join(a.branch() for a in s)
625 except AttributeError:
626 raise TypeError
627
628 m = l // 2
629 return '(%s or %s)' % (listexp(s[:m], t), listexp(s[m:], t))
630
631 630 expr = pycompat.bytestr(expr)
632 631 argiter = iter(args)
633 632 ret = []
@@ -660,12 +659,12 b' def formatspec(expr, *args):'
660 659 except IndexError:
661 660 raise error.ParseError(_('incomplete revspec format character'))
662 661 try:
663 ret.append(listexp(list(arg), d))
662 ret.append(_formatlistexp(list(arg), d))
664 663 except (TypeError, ValueError):
665 664 raise error.ParseError(_('invalid argument for revspec'))
666 665 else:
667 666 try:
668 ret.append(argtype(d, arg))
667 ret.append(_formatargtype(d, arg))
669 668 except (TypeError, ValueError):
670 669 raise error.ParseError(_('invalid argument for revspec'))
671 670 pos += 1
General Comments 0
You need to be logged in to leave comments. Login now