##// END OF EJS Templates
revset: add helper function for matching strings to patterns
Simon King -
r16819:5260a9e9 default
parent child Browse files
Show More
@@ -1119,6 +1119,46 b' def sort(repo, subset, x):'
1119 l.sort()
1119 l.sort()
1120 return [e[-1] for e in l]
1120 return [e[-1] for e in l]
1121
1121
1122 def _stringmatcher(pattern):
1123 """
1124 accepts a string, possibly starting with 're:' or 'literal:' prefix.
1125 returns the matcher name, pattern, and matcher function.
1126 missing or unknown prefixes are treated as literal matches.
1127
1128 helper for tests:
1129 >>> def test(pattern, *tests):
1130 ... kind, pattern, matcher = _stringmatcher(pattern)
1131 ... return (kind, pattern, [bool(matcher(t)) for t in tests])
1132
1133 exact matching (no prefix):
1134 >>> test('abcdefg', 'abc', 'def', 'abcdefg')
1135 ('literal', 'abcdefg', [False, False, True])
1136
1137 regex matching ('re:' prefix)
1138 >>> test('re:a.+b', 'nomatch', 'fooadef', 'fooadefbar')
1139 ('re', 'a.+b', [False, False, True])
1140
1141 force exact matches ('literal:' prefix)
1142 >>> test('literal:re:foobar', 'foobar', 're:foobar')
1143 ('literal', 're:foobar', [False, True])
1144
1145 unknown prefixes are ignored and treated as literals
1146 >>> test('foo:bar', 'foo', 'bar', 'foo:bar')
1147 ('literal', 'foo:bar', [False, False, True])
1148 """
1149 if pattern.startswith('re:'):
1150 pattern = pattern[3:]
1151 try:
1152 regex = re.compile(pattern)
1153 except re.error, e:
1154 raise error.ParseError(_('invalid regular expression: %s')
1155 % e)
1156 return 're', pattern, regex.search
1157 elif pattern.startswith('literal:'):
1158 pattern = pattern[8:]
1159 return 'literal', pattern, pattern.__eq__
1160
1161
1122 def tag(repo, subset, x):
1162 def tag(repo, subset, x):
1123 """``tag([name])``
1163 """``tag([name])``
1124 The specified tag by name, or all tagged revisions if no name is given.
1164 The specified tag by name, or all tagged revisions if no name is given.
General Comments 0
You need to be logged in to leave comments. Login now