[PATCH 6 of 6 V2] fsmonitor: execute setup procedures only if dirstate is already instantiated

Jun Wu quark at fb.com
Tue Jul 11 19:14:06 EDT 2017


I just double checked. The cleanup and fix is neat. Thanks!

Excerpts from FUJIWARA Katsunori's message of 2017-07-10 23:18:19 +0900:
> # HG changeset patch
> # User FUJIWARA Katsunori <foozy at lares.dti.ne.jp>
> # Date 1499695792 -32400
> #      Mon Jul 10 23:09:52 2017 +0900
> # Node ID f0f0d10b0692825a8d996d73180d58843391da63
> # Parent  e7c8ebd3c341070ec069f0e5cc03cd0641f125c9
> fsmonitor: execute setup procedures only if dirstate is already instantiated
> 
> Before this patch, reposetup() of fsmonitor executes setup procedures
> for dirstate, even if it isn't yet instantiated at that time.
> 
> On the other hand, dirstate might be already instantiated before
> reposetup() intentionally (prefilling by chg, for example, see
> bf3af0eced44 for detail). If so, just discarding already instantiated
> one in reposetup() causes issue.
> 
> To resolve both issues above, this patch executes setup procedures,
> only if dirstate is already instantiated.
> 
> BTW, this patch removes "del repo.unfiltered().__dict__['dirstate']",
> because it is responsibility of the code path, which causes
> instantiation of dirstate before reposetup(). After this patch, using
> localrepo.isfilecached() should avoid creating the corresponded entry
> in repo.unfiltered().__dict__.
> 
> diff --git a/hgext/fsmonitor/__init__.py b/hgext/fsmonitor/__init__.py
> --- a/hgext/fsmonitor/__init__.py
> +++ b/hgext/fsmonitor/__init__.py
> @@ -698,15 +698,11 @@ def reposetup(ui, repo):
>          repo._fsmonitorstate = fsmonitorstate
>          repo._watchmanclient = client
>  
> -        # at this point since fsmonitorstate wasn't present, repo.dirstate is
> -        # not a fsmonitordirstate
> -        dirstate = repo.dirstate
> -        makedirstate(repo, dirstate)
> -
> -        # invalidate property cache, but keep filecache which contains the
> -        # wrapped dirstate object
> -        del repo.unfiltered().__dict__['dirstate']
> -        assert dirstate is repo._filecache['dirstate'].obj
> +        dirstate, cached = localrepo.isfilecached(repo, 'dirstate')
> +        if cached:
> +            # at this point since fsmonitorstate wasn't present,
> +            # repo.dirstate is not a fsmonitordirstate
> +            makedirstate(repo, dirstate)
>  
>          class fsmonitorrepo(repo.__class__):
>              def status(self, *args, **kwargs):


More information about the Mercurial-devel mailing list