583 """ |
583 """ |
584 return "'%s'" % stringutil.escapestr(pycompat.bytestr(s)) |
584 return "'%s'" % stringutil.escapestr(pycompat.bytestr(s)) |
585 |
585 |
586 def _formatargtype(c, arg): |
586 def _formatargtype(c, arg): |
587 if c == 'd': |
587 if c == 'd': |
588 return 'rev(%d)' % int(arg) |
588 return '_rev(%d)' % int(arg) |
589 elif c == 's': |
589 elif c == 's': |
590 return _quote(arg) |
590 return _quote(arg) |
591 elif c == 'r': |
591 elif c == 'r': |
592 if not isinstance(arg, bytes): |
592 if not isinstance(arg, bytes): |
593 raise TypeError |
593 raise TypeError |
661 and 'p' specifies a list of function parameters of that type. |
661 and 'p' specifies a list of function parameters of that type. |
662 |
662 |
663 >>> formatspec(b'%r:: and %lr', b'10 or 11', (b"this()", b"that()")) |
663 >>> formatspec(b'%r:: and %lr', b'10 or 11', (b"this()", b"that()")) |
664 '(10 or 11):: and ((this()) or (that()))' |
664 '(10 or 11):: and ((this()) or (that()))' |
665 >>> formatspec(b'%d:: and not %d::', 10, 20) |
665 >>> formatspec(b'%d:: and not %d::', 10, 20) |
666 'rev(10):: and not rev(20)::' |
666 '_rev(10):: and not _rev(20)::' |
667 >>> formatspec(b'%ld or %ld', [], [1]) |
667 >>> formatspec(b'%ld or %ld', [], [1]) |
668 "_list('') or rev(1)" |
668 "_list('') or _rev(1)" |
669 >>> formatspec(b'keyword(%s)', b'foo\\xe9') |
669 >>> formatspec(b'keyword(%s)', b'foo\\xe9') |
670 "keyword('foo\\\\xe9')" |
670 "keyword('foo\\\\xe9')" |
671 >>> b = lambda: b'default' |
671 >>> b = lambda: b'default' |
672 >>> b.branch = b |
672 >>> b.branch = b |
673 >>> formatspec(b'branch(%b)', b) |
673 >>> formatspec(b'branch(%b)', b) |