# HG changeset patch # User FUJIWARA Katsunori # Date 2017-07-10 14:09:51 # Node ID b107a7660f4ea4b6a55ae314b65e5a862754f493 # Parent 3bdbbadddecc2fa105cbdfdf28fa1f61073f41b0 localrepo: add isfilecached to check filecache-ed property is already cached isfilecached() encapsulates internal implementation of filecache-ed property. "name in repo.unfiltered().__dict__" or so can't be used for this purpose, because corresponded entry in __dict__ might be discarded by repo.invalidate(), repo.invalidatedirstate() or so (fsmonitor does so, for example). This patch makes isfilecached() return not only whether filecache-ed property is already cached, but also already cached value (or None), in order to avoid subsequent access to cached object via "repo.NAME", which prevents main Mercurial procedure after reposetup() from validating cache. diff --git a/mercurial/localrepo.py b/mercurial/localrepo.py --- a/mercurial/localrepo.py +++ b/mercurial/localrepo.py @@ -104,6 +104,16 @@ class storecache(_basefilecache): def join(self, obj, fname): return obj.sjoin(fname) +def isfilecached(repo, name): + """check if a repo has already cached "name" filecache-ed property + + This returns (cachedobj-or-None, iscached) tuple. + """ + cacheentry = repo.unfiltered()._filecache.get(name, None) + if not cacheentry: + return None, False + return cacheentry.obj, True + class unfilteredpropertycache(util.propertycache): """propertycache that apply to unfiltered repo only"""