comparison mercurial/revset.py @ 14901:a773119f30ba

revset: add formatspec convenience query builder
author Matt Mackall <mpm@selenic.com>
date Thu, 21 Jul 2011 14:05:45 -0500
parents fc3d6f300d7d
children d8501bcbb221
comparison
equal deleted inserted replaced
14900:fc3d6f300d7d 14901:a773119f30ba
4 # 4 #
5 # This software may be used and distributed according to the terms of the 5 # This software may be used and distributed according to the terms of the
6 # GNU General Public License version 2 or any later version. 6 # GNU General Public License version 2 or any later version.
7 7
8 import re 8 import re
9 import parser, util, error, discovery, hbisect 9 import parser, util, error, discovery, hbisect, node
10 import bookmarks as bookmarksmod 10 import bookmarks as bookmarksmod
11 import match as matchmod 11 import match as matchmod
12 from i18n import _ 12 from i18n import _
13 13
14 elements = { 14 elements = {
1024 weight, tree = optimize(tree, True) 1024 weight, tree = optimize(tree, True)
1025 def mfunc(repo, subset): 1025 def mfunc(repo, subset):
1026 return getset(repo, subset, tree) 1026 return getset(repo, subset, tree)
1027 return mfunc 1027 return mfunc
1028 1028
1029 def formatspec(expr, *args):
1030 '''
1031 This is a convenience function for using revsets internally, and
1032 escapes arguments appropriately. Aliases are intentionally ignored
1033 so that intended expression behavior isn't accidentally subverted.
1034
1035 Supported arguments:
1036
1037 %d = int(arg), no quoting
1038 %s = string(arg), escaped and single-quoted
1039 %b = arg.branch(), escaped and single-quoted
1040 %n = hex(arg), single-quoted
1041 %% = a literal '%'
1042
1043 >>> formatspec('%d:: and not %d::', 10, 20)
1044 '10:: and not 20::'
1045 >>> formatspec('keyword(%s)', 'foo\\xe9')
1046 "keyword('foo\\\\xe9')"
1047 >>> b = lambda: 'default'
1048 >>> b.branch = b
1049 >>> formatspec('branch(%b)', b)
1050 "branch('default')"
1051 '''
1052
1053 def quote(s):
1054 return repr(str(s))
1055
1056 ret = ''
1057 pos = 0
1058 arg = 0
1059 while pos < len(expr):
1060 c = expr[pos]
1061 if c == '%':
1062 pos += 1
1063 d = expr[pos]
1064 if d == '%':
1065 ret += d
1066 elif d == 'd':
1067 ret += str(int(args[arg]))
1068 arg += 1
1069 elif d == 's':
1070 ret += quote(args[arg])
1071 arg += 1
1072 elif d == 'n':
1073 ret += quote(node.hex(args[arg]))
1074 arg += 1
1075 elif d == 'b':
1076 ret += quote(args[arg].branch())
1077 arg += 1
1078 else:
1079 raise util.Abort('unexpected revspec format character %s' % d)
1080 else:
1081 ret += c
1082 pos += 1
1083
1084 return ret
1085
1029 # tell hggettext to extract docstrings from these functions: 1086 # tell hggettext to extract docstrings from these functions:
1030 i18nfunctions = symbols.values() 1087 i18nfunctions = symbols.values()