diff -r 57875cf423c9 -r 2372284d9457 hgext/fastannotate/support.py --- a/hgext/fastannotate/support.py Sat Oct 05 10:29:34 2019 -0400 +++ b/hgext/fastannotate/support.py Sun Oct 06 09:45:02 2019 -0400 @@ -21,6 +21,7 @@ revmap, ) + class _lazyfctx(object): """delegates to fctx but do not construct fctx when unnecessary""" @@ -42,6 +43,7 @@ def __getattr__(self, name): return getattr(self._fctx, name) + def _convertoutputs(repo, annotated, contents): """convert fastannotate outputs to vanilla annotate format""" # fastannotate returns: [(nodeid, linenum, path)], [linecontent] @@ -59,10 +61,12 @@ results.append(annotateline(fctx=fctx, lineno=lineno, text=line)) return results + def _getmaster(fctx): """(fctx) -> str""" return fctx._repo.ui.config('fastannotate', 'mainbranch') or 'default' + def _doannotate(fctx, follow=True, diffopts=None): """like the vanilla fctx.annotate, but do it via fastannotate, and make the output format compatible with the vanilla fctx.annotate. @@ -73,49 +77,61 @@ with context.fctxannotatecontext(fctx, follow, diffopts) as ac: try: - annotated, contents = ac.annotate(fctx.rev(), master=master, - showpath=True, showlines=True) + annotated, contents = ac.annotate( + fctx.rev(), master=master, showpath=True, showlines=True + ) except Exception: - ac.rebuild() # try rebuild once - fctx._repo.ui.debug('fastannotate: %s: rebuilding broken cache\n' - % fctx._path) + ac.rebuild() # try rebuild once + fctx._repo.ui.debug( + 'fastannotate: %s: rebuilding broken cache\n' % fctx._path + ) try: - annotated, contents = ac.annotate(fctx.rev(), master=master, - showpath=True, showlines=True) + annotated, contents = ac.annotate( + fctx.rev(), master=master, showpath=True, showlines=True + ) except Exception: raise assert annotated and contents return _convertoutputs(fctx._repo, annotated, contents) + def _hgwebannotate(orig, fctx, ui): - diffopts = patch.difffeatureopts(ui, untrusted=True, - section='annotate', whitespace=True) + diffopts = patch.difffeatureopts( + ui, untrusted=True, section='annotate', whitespace=True + ) return _doannotate(fctx, diffopts=diffopts) -def _fctxannotate(orig, self, follow=False, linenumber=False, skiprevs=None, - diffopts=None): + +def _fctxannotate( + orig, self, follow=False, linenumber=False, skiprevs=None, diffopts=None +): if skiprevs: # skiprevs is not supported yet - return orig(self, follow, linenumber, skiprevs=skiprevs, - diffopts=diffopts) + return orig( + self, follow, linenumber, skiprevs=skiprevs, diffopts=diffopts + ) try: return _doannotate(self, follow, diffopts) except Exception as ex: - self._repo.ui.debug('fastannotate: falling back to the vanilla ' - 'annotate: %r\n' % ex) - return orig(self, follow=follow, skiprevs=skiprevs, - diffopts=diffopts) + self._repo.ui.debug( + 'fastannotate: falling back to the vanilla ' 'annotate: %r\n' % ex + ) + return orig(self, follow=follow, skiprevs=skiprevs, diffopts=diffopts) + def _remotefctxannotate(orig, self, follow=False, skiprevs=None, diffopts=None): # skipset: a set-like used to test if a fctx needs to be downloaded with context.fctxannotatecontext(self, follow, diffopts) as ac: skipset = revmap.revmap(ac.revmappath) - return orig(self, follow, skiprevs=skiprevs, diffopts=diffopts, - prefetchskip=skipset) + return orig( + self, follow, skiprevs=skiprevs, diffopts=diffopts, prefetchskip=skipset + ) + def replacehgwebannotate(): extensions.wrapfunction(hgweb.webutil, 'annotate', _hgwebannotate) + def replacefctxannotate(): extensions.wrapfunction(hgcontext.basefilectx, 'annotate', _fctxannotate)