##// END OF EJS Templates
revset: add extra data to filteredset for better inspection...
Yuya Nishihara -
r28423:0d79d91b default
parent child Browse files
Show More
@@ -2730,6 +2730,29 b' def funcsused(tree):'
2730 funcs.add(tree[1][1])
2730 funcs.add(tree[1][1])
2731 return funcs
2731 return funcs
2732
2732
2733 def _formatsetrepr(r):
2734 """Format an optional printable representation of a set
2735
2736 ======== =================================
2737 type(r) example
2738 ======== =================================
2739 tuple ('<not %r>', other)
2740 str '<branch closed>'
2741 callable lambda: '<branch %r>' % sorted(b)
2742 object other
2743 ======== =================================
2744 """
2745 if r is None:
2746 return ''
2747 elif isinstance(r, tuple):
2748 return r[0] % r[1:]
2749 elif isinstance(r, str):
2750 return r
2751 elif callable(r):
2752 return r()
2753 else:
2754 return repr(r)
2755
2733 class abstractsmartset(object):
2756 class abstractsmartset(object):
2734
2757
2735 def __nonzero__(self):
2758 def __nonzero__(self):
@@ -2810,7 +2833,7 b' class abstractsmartset(object):'
2810 This is part of the mandatory API for smartset."""
2833 This is part of the mandatory API for smartset."""
2811 if isinstance(other, fullreposet):
2834 if isinstance(other, fullreposet):
2812 return self
2835 return self
2813 return self.filter(other.__contains__, cache=False)
2836 return self.filter(other.__contains__, condrepr=other, cache=False)
2814
2837
2815 def __add__(self, other):
2838 def __add__(self, other):
2816 """Returns a new object with the union of the two collections.
2839 """Returns a new object with the union of the two collections.
@@ -2823,19 +2846,21 b' class abstractsmartset(object):'
2823
2846
2824 This is part of the mandatory API for smartset."""
2847 This is part of the mandatory API for smartset."""
2825 c = other.__contains__
2848 c = other.__contains__
2826 return self.filter(lambda r: not c(r), cache=False)
2849 return self.filter(lambda r: not c(r), condrepr=('<not %r>', other),
2827
2850 cache=False)
2828 def filter(self, condition, cache=True):
2851
2852 def filter(self, condition, condrepr=None, cache=True):
2829 """Returns this smartset filtered by condition as a new smartset.
2853 """Returns this smartset filtered by condition as a new smartset.
2830
2854
2831 `condition` is a callable which takes a revision number and returns a
2855 `condition` is a callable which takes a revision number and returns a
2832 boolean.
2856 boolean. Optional `condrepr` provides a printable representation of
2857 the given `condition`.
2833
2858
2834 This is part of the mandatory API for smartset."""
2859 This is part of the mandatory API for smartset."""
2835 # builtin cannot be cached. but do not needs to
2860 # builtin cannot be cached. but do not needs to
2836 if cache and util.safehasattr(condition, 'func_code'):
2861 if cache and util.safehasattr(condition, 'func_code'):
2837 condition = util.cachefunc(condition)
2862 condition = util.cachefunc(condition)
2838 return filteredset(self, condition)
2863 return filteredset(self, condition, condrepr)
2839
2864
2840 class baseset(abstractsmartset):
2865 class baseset(abstractsmartset):
2841 """Basic data structure that represents a revset and contains the basic
2866 """Basic data structure that represents a revset and contains the basic
@@ -2939,13 +2964,16 b' class filteredset(abstractsmartset):'
2939 the subset and contains a function which tests for membership in the
2964 the subset and contains a function which tests for membership in the
2940 revset
2965 revset
2941 """
2966 """
2942 def __init__(self, subset, condition=lambda x: True):
2967 def __init__(self, subset, condition=lambda x: True, condrepr=None):
2943 """
2968 """
2944 condition: a function that decide whether a revision in the subset
2969 condition: a function that decide whether a revision in the subset
2945 belongs to the revset or not.
2970 belongs to the revset or not.
2971 condrepr: a tuple of (format, obj, ...), a function or an object that
2972 provides a printable representation of the given condition.
2946 """
2973 """
2947 self._subset = subset
2974 self._subset = subset
2948 self._condition = condition
2975 self._condition = condition
2976 self._condrepr = condrepr
2949
2977
2950 def __contains__(self, x):
2978 def __contains__(self, x):
2951 return x in self._subset and self._condition(x)
2979 return x in self._subset and self._condition(x)
@@ -3025,7 +3053,11 b' class filteredset(abstractsmartset):'
3025 return x
3053 return x
3026
3054
3027 def __repr__(self):
3055 def __repr__(self):
3028 return '<%s %r>' % (type(self).__name__, self._subset)
3056 xs = [repr(self._subset)]
3057 s = _formatsetrepr(self._condrepr)
3058 if s:
3059 xs.append(s)
3060 return '<%s %s>' % (type(self).__name__, ', '.join(xs))
3029
3061
3030 def _iterordered(ascending, iter1, iter2):
3062 def _iterordered(ascending, iter1, iter2):
3031 """produce an ordered iteration from two iterators with the same order
3063 """produce an ordered iteration from two iterators with the same order
@@ -169,7 +169,9 b' names that should work without quoting'
169 ('symbol', 'a'))
169 ('symbol', 'a'))
170 * set:
170 * set:
171 <filteredset
171 <filteredset
172 <baseset [1]>>
172 <baseset [1]>,
173 <not
174 <baseset [0]>>>
173 1
175 1
174 $ try _a_b_c_
176 $ try _a_b_c_
175 ('symbol', '_a_b_c_')
177 ('symbol', '_a_b_c_')
@@ -182,7 +184,9 b' names that should work without quoting'
182 ('symbol', 'a'))
184 ('symbol', 'a'))
183 * set:
185 * set:
184 <filteredset
186 <filteredset
185 <baseset [6]>>
187 <baseset [6]>,
188 <not
189 <baseset [0]>>>
186 6
190 6
187 $ try .a.b.c.
191 $ try .a.b.c.
188 ('symbol', '.a.b.c.')
192 ('symbol', '.a.b.c.')
@@ -195,7 +199,9 b' names that should work without quoting'
195 ('symbol', 'a'))
199 ('symbol', 'a'))
196 * set:
200 * set:
197 <filteredset
201 <filteredset
198 <baseset [7]>>
202 <baseset [7]>,
203 <not
204 <baseset [0]>>>
199 7
205 7
200
206
201 names that should be caught by fallback mechanism
207 names that should be caught by fallback mechanism
@@ -278,7 +284,9 b' quoting needed'
278 ('symbol', 'a'))
284 ('symbol', 'a'))
279 * set:
285 * set:
280 <filteredset
286 <filteredset
281 <baseset [4]>>
287 <baseset [4]>,
288 <not
289 <baseset [0]>>>
282 4
290 4
283
291
284 $ log '1 or 2'
292 $ log '1 or 2'
General Comments 0
You need to be logged in to leave comments. Login now