##// END OF EJS Templates
revsetlang: check arguments passed to ancestors() before optimizing to only()...
Yuya Nishihara -
r32913:3292c0df default
parent child Browse files
Show More
@@ -240,6 +240,11 b' def _isnamedfunc(x, funcname):'
240 240 """Check if given tree matches named function"""
241 241 return x and x[0] == 'func' and getsymbol(x[1]) == funcname
242 242
243 def _isposargs(x, n):
244 """Check if given tree is n-length list of positional arguments"""
245 l = getlist(x)
246 return len(l) == n and all(y and y[0] != 'keyvalue' for y in l)
247
243 248 def _matchnamedfunc(x, funcname):
244 249 """Return args tree if given tree matches named function; otherwise None
245 250
@@ -302,7 +307,7 b' def _matchonly(revs, bases):'
302 307 """
303 308 ta = _matchnamedfunc(revs, 'ancestors')
304 309 tb = bases and bases[0] == 'not' and _matchnamedfunc(bases[1], 'ancestors')
305 if ta and tb:
310 if _isposargs(ta, 1) and _isposargs(tb, 1):
306 311 return ('list', ta, tb)
307 312
308 313 def _fixops(x):
@@ -2980,6 +2980,65 b' no crash by empty group "()" while optim'
2980 2980 hg: parse error: missing argument
2981 2981 [255]
2982 2982
2983 optimization to only() works only if ancestors() takes only one argument
2984
2985 $ hg debugrevspec -p optimized 'ancestors(6) - ancestors(4, 1)'
2986 * optimized:
2987 (difference
2988 (func
2989 ('symbol', 'ancestors')
2990 ('symbol', '6')
2991 define)
2992 (func
2993 ('symbol', 'ancestors')
2994 (list
2995 ('symbol', '4')
2996 ('symbol', '1'))
2997 any)
2998 define)
2999 hg: parse error: can't use a list in this context
3000 (see hg help "revsets.x or y")
3001 [255]
3002 $ hg debugrevspec -p optimized 'ancestors(6, 1) - ancestors(4)'
3003 * optimized:
3004 (difference
3005 (func
3006 ('symbol', 'ancestors')
3007 (list
3008 ('symbol', '6')
3009 ('symbol', '1'))
3010 define)
3011 (func
3012 ('symbol', 'ancestors')
3013 ('symbol', '4')
3014 any)
3015 define)
3016 hg: parse error: can't use a list in this context
3017 (see hg help "revsets.x or y")
3018 [255]
3019
3020 optimization disabled if keyword arguments passed (because we're too lazy
3021 to support it)
3022
3023 $ hg debugrevspec -p optimized 'ancestors(set=6) - ancestors(set=4)'
3024 * optimized:
3025 (difference
3026 (func
3027 ('symbol', 'ancestors')
3028 (keyvalue
3029 ('symbol', 'set')
3030 ('symbol', '6'))
3031 define)
3032 (func
3033 ('symbol', 'ancestors')
3034 (keyvalue
3035 ('symbol', 'set')
3036 ('symbol', '4'))
3037 any)
3038 define)
3039 hg: parse error: can't use a key-value pair in this context
3040 [255]
3041
2983 3042 invalid function call should not be optimized to only()
2984 3043
2985 3044 $ log '"ancestors"(6) and not ancestors(4)'
General Comments 0
You need to be logged in to leave comments. Login now