# HG changeset patch # User Sean Farley # Date 1462515113 25200 # Node ID c5b7fb8911c0a8cac462ce2b1096fd7287fdfcf7 # Parent 2f98d1e85c23a8485d9a843c98d92f0c595f1ad4 compathacks: copy _funcregistrarbase for older mercurial diff --git a/hgsubversion/compathacks.py b/hgsubversion/compathacks.py --- a/hgsubversion/compathacks.py +++ b/hgsubversion/compathacks.py @@ -3,6 +3,8 @@ import errno import sys +from mercurial import util + def branchset(repo): """Return the set of branches present in a repo. @@ -67,3 +69,83 @@ def filectxfn_deleted_reraise(memctx): return None # preserve traceback info raise exc_info[0], exc_info[1], exc_info[2] + +# copied from hg 3.8 +class _funcregistrarbase(object): + """Base of decorator to register a fuction for specific purpose + + This decorator stores decorated functions into own dict 'table'. + + The least derived class can be defined by overriding 'formatdoc', + for example:: + + class keyword(_funcregistrarbase): + _docformat = ":%s: %s" + + This should be used as below: + + keyword = registrar.keyword() + + @keyword('bar') + def barfunc(*args, **kwargs): + '''Explanation of bar keyword .... + ''' + pass + + In this case: + + - 'barfunc' is stored as 'bar' in '_table' of an instance 'keyword' above + - 'barfunc.__doc__' becomes ":bar: Explanation of bar keyword" + """ + def __init__(self, table=None): + if table is None: + self._table = {} + else: + self._table = table + + def __call__(self, decl, *args, **kwargs): + return lambda func: self._doregister(func, decl, *args, **kwargs) + + def _doregister(self, func, decl, *args, **kwargs): + name = self._getname(decl) + + if func.__doc__ and not util.safehasattr(func, '_origdoc'): + doc = func.__doc__.strip() + func._origdoc = doc + func.__doc__ = self._formatdoc(decl, doc) + + self._table[name] = func + self._extrasetup(name, func, *args, **kwargs) + + return func + + def _parsefuncdecl(self, decl): + """Parse function declaration and return the name of function in it + """ + i = decl.find('(') + if i >= 0: + return decl[:i] + else: + return decl + + def _getname(self, decl): + """Return the name of the registered function from decl + + Derived class should override this, if it allows more + descriptive 'decl' string than just a name. + """ + return decl + + _docformat = None + + def _formatdoc(self, decl, doc): + """Return formatted document of the registered function for help + + 'doc' is '__doc__.strip()' of the registered function. + """ + return self._docformat % (decl, doc) + + def _extrasetup(self, name, func): + """Execute exra setup for registered function, if needed + """ + pass