[PATCH] extensions: move wrapfilecache function from fsmonitor

Yuya Nishihara yuya at tcha.org
Fri Jun 9 13:02:42 UTC 2017


On Thu, 8 Jun 2017 23:49:27 +0100, Pierre-Yves David wrote:
> On 06/08/2017 05:47 PM, Augie Fackler wrote:
> >> On Jun 8, 2017, at 11:53, Yuya Nishihara <yuya at tcha.org> wrote:
> >> On Thu, 08 Jun 2017 10:51:38 -0400, Augie Fackler wrote:
> >>> # HG changeset patch
> >>> # User Augie Fackler <augie at google.com>
> >>> # Date 1496933093 14400
> >>> #      Thu Jun 08 10:44:53 2017 -0400
> >>> # Node ID ff739458783d32b8b0ce97a6771513caf280c09b
> >>> # Parent  04c19c8082410049465e2cdc510e24801530c94b
> >>> extensions: move wrapfilecache function from fsmonitor
> >>>
> >>> It makes more sense to put this in core, so other extensions can
> >>> trivially get access to it without having to rely on importing
> >>> fsmonitor.
> >>>
> >>> diff --git a/hgext/fsmonitor/__init__.py b/hgext/fsmonitor/__init__.py
> >>> --- a/hgext/fsmonitor/__init__.py
> >>> +++ b/hgext/fsmonitor/__init__.py
> >>> @@ -561,7 +561,8 @@ def wrapdirstate(orig, self):
> >>>     return ds
> >>>
> >>> def extsetup(ui):
> >>> -    wrapfilecache(localrepo.localrepository, 'dirstate', wrapdirstate)
> >>> +    extensions.wrapfilecache(
> >>> +        localrepo.localrepository, 'dirstate', wrapdirstate)
> >>>     if pycompat.sysplatform == 'darwin':
> >>>         # An assist for avoiding the dangling-symlink fsevents bug
> >>>         extensions.wrapfunction(os, 'symlink', wrapsymlink)
> >>> @@ -709,21 +710,3 @@ def reposetup(ui, repo):
> >>>                 return overridestatus(orig, self, *args, **kwargs)
> >>>
> >>>         repo.__class__ = fsmonitorrepo
> >>> -
> >>> -def wrapfilecache(cls, propname, wrapper):
> >>> -    """Wraps a filecache property. These can't be wrapped using the normal
> >>> -    wrapfunction. This should eventually go into upstream Mercurial.
> >>> -    """
> >>> -    assert callable(wrapper)
> >>> -    for currcls in cls.__mro__:
> >>> -        if propname in currcls.__dict__:
> >>> -            origfn = currcls.__dict__[propname].func
> >>> -            assert callable(origfn)
> >>> -            def wrap(*args, **kwargs):
> >>> -                return wrapper(origfn, *args, **kwargs)
> >>> -            currcls.__dict__[propname].func = wrap
> >>> -            break
> >>> -
> >>> -    if currcls is object:
> >>> -        raise AttributeError(
> >>> -            _("type '%s' has no property '%s'") % (cls, propname))
> >>
> >> IIRC, Jun had a bad time with this. Is this a good pattern to reliably
> >> wrap filecache?
> >
> > No idea - we need it for some stuff internal to Google (ugh), and it felt like we should move this in core and then improve it as needed to correct defects.
> 
> +1
> 
> This that is something needed in evolve from time to time too. +1 for 
> having something in core.
> 
> It seems sensible to move the fsmonitor version in core -as-is- and 
> improve it later (in core) if necessary. I assume fsmonitor will still 
> be happy if the patterns improves.

I think wrapfilecache() inherently conflicts with our class wrapping rule,
but anyway it would be better to not copy-paste wrapfilecache() hack around.

https://www.mercurial-scm.org/wiki/WritingExtensions#Wrapping_methods_on_the_ui_and_repo_classes



More information about the Mercurial-devel mailing list