comparison mercurial/extensions.py @ 29763:ce6317dcb944

extensions: set attributes to wrappers so we can trace them back This patch adds two attributes about the original function and the unbound wrapper. It allows us to get a chain of wrappers. See the next patch.
author Jun Wu <quark@fb.com>
date Wed, 10 Aug 2016 15:21:42 +0100
parents 7d88fde2309f
children 8bf97c4c6c2a
comparison
equal deleted inserted replaced
29762:96bd27eb23f0 29763:ce6317dcb944
208 assert callable(func) 208 assert callable(func)
209 def closure(*a, **kw): 209 def closure(*a, **kw):
210 return func(*(args + a), **kw) 210 return func(*(args + a), **kw)
211 return closure 211 return closure
212 212
213 def _updatewrapper(wrap, origfn): 213 def _updatewrapper(wrap, origfn, unboundwrapper):
214 '''Copy attributes to wrapper function''' 214 '''Copy and add some useful attributes to wrapper'''
215 wrap.__module__ = getattr(origfn, '__module__') 215 wrap.__module__ = getattr(origfn, '__module__')
216 wrap.__doc__ = getattr(origfn, '__doc__') 216 wrap.__doc__ = getattr(origfn, '__doc__')
217 wrap.__dict__.update(getattr(origfn, '__dict__', {})) 217 wrap.__dict__.update(getattr(origfn, '__dict__', {}))
218 wrap._origfunc = origfn
219 wrap._unboundwrapper = unboundwrapper
218 220
219 def wrapcommand(table, command, wrapper, synopsis=None, docstring=None): 221 def wrapcommand(table, command, wrapper, synopsis=None, docstring=None):
220 '''Wrap the command named `command' in table 222 '''Wrap the command named `command' in table
221 223
222 Replace command in the command table with wrapper. The wrapped command will 224 Replace command in the command table with wrapper. The wrapped command will
252 key = alias 254 key = alias
253 break 255 break
254 256
255 origfn = entry[0] 257 origfn = entry[0]
256 wrap = bind(util.checksignature(wrapper), util.checksignature(origfn)) 258 wrap = bind(util.checksignature(wrapper), util.checksignature(origfn))
257 _updatewrapper(wrap, origfn) 259 _updatewrapper(wrap, origfn, wrapper)
258 if docstring is not None: 260 if docstring is not None:
259 wrap.__doc__ += docstring 261 wrap.__doc__ += docstring
260 262
261 newentry = list(entry) 263 newentry = list(entry)
262 newentry[0] = wrap 264 newentry[0] = wrap
301 assert callable(wrapper) 303 assert callable(wrapper)
302 304
303 origfn = getattr(container, funcname) 305 origfn = getattr(container, funcname)
304 assert callable(origfn) 306 assert callable(origfn)
305 wrap = bind(wrapper, origfn) 307 wrap = bind(wrapper, origfn)
306 _updatewrapper(wrap, origfn) 308 _updatewrapper(wrap, origfn, wrapper)
307 setattr(container, funcname, wrap) 309 setattr(container, funcname, wrap)
308 return origfn 310 return origfn
309 311
310 def _disabledpaths(strip_init=False): 312 def _disabledpaths(strip_init=False):
311 '''find paths of disabled extensions. returns a dict of {name: path} 313 '''find paths of disabled extensions. returns a dict of {name: path}