Mercurial > hg
changeset 39994:6962ebc8f817
localrepo: capture repo interface factory functions as lambas
Previously, the list would hold a reference to the original function
and attempting to wrap the module function via extension wouldn't
result in the wrapped function being called, completely undermining
the expected behavior.
Differential Revision: https://phab.mercurial-scm.org/D4821
author | Gregory Szorc <gregory.szorc@gmail.com> |
---|---|
date | Mon, 01 Oct 2018 09:05:40 -0700 |
parents | cd5f2e615262 |
children | 582676acaf6d |
files | mercurial/localrepo.py |
diffstat | 1 files changed, 6 insertions(+), 4 deletions(-) [+] |
line wrap: on
line diff
--- a/mercurial/localrepo.py Mon May 14 00:43:07 2018 +0200 +++ b/mercurial/localrepo.py Mon Oct 01 09:05:40 2018 -0700 @@ -534,7 +534,7 @@ for iface, fn in REPO_INTERFACES: # We pass all potentially useful state to give extensions tons of # flexibility. - typ = fn(ui=ui, + typ = fn()(ui=ui, intents=intents, requirements=requirements, features=features, @@ -803,10 +803,12 @@ # List of repository interfaces and factory functions for them. Each # will be called in order during ``makelocalrepository()`` to iteratively -# derive the final type for a local repository instance. +# derive the final type for a local repository instance. We capture the +# function as a lambda so we don't hold a reference and the module-level +# functions can be wrapped. REPO_INTERFACES = [ - (repository.ilocalrepositorymain, makemain), - (repository.ilocalrepositoryfilestorage, makefilestorage), + (repository.ilocalrepositorymain, lambda: makemain), + (repository.ilocalrepositoryfilestorage, lambda: makefilestorage), ] @interfaceutil.implementer(repository.ilocalrepositorymain)