# HG changeset patch # User Idan Kamara # Date 1330616398 -7200 # Node ID fa8488565afde5375feac30b7df4f9352932d2aa # Parent 8ae7626d8bf1c41998bc62dbb929ae032c6ab6ff filecache: refactor path join logic to a function New users of filecache use different names for the function used to compute the runtime path of the cached file. Users should subclass filecache and provide their own version of this function to call the appropriate join function on 'obj' (an instance of the class that its member function was decorated). diff -r 8ae7626d8bf1 -r fa8488565afd mercurial/localrepo.py --- a/mercurial/localrepo.py Wed Feb 29 14:24:57 2012 +0100 +++ b/mercurial/localrepo.py Thu Mar 01 17:39:58 2012 +0200 @@ -19,6 +19,11 @@ propertycache = util.propertycache filecache = scmutil.filecache +class storecache(filecache): + """filecache for files in the store""" + def join(self, obj, fname): + return obj.sjoin(fname) + class localrepository(repo.repository): capabilities = set(('lookup', 'changegroupsubset', 'branchmap', 'pushkey', 'known', 'getbundle')) @@ -176,7 +181,7 @@ def _writebookmarks(self, marks): bookmarks.write(self) - @filecache('phaseroots', True) + @storecache('phaseroots') def _phaseroots(self): self._dirtyphases = False phaseroots = phases.readroots(self) @@ -195,7 +200,7 @@ cache[rev] = phase return cache - @filecache('00changelog.i', True) + @storecache('00changelog.i') def changelog(self): c = changelog.changelog(self.sopener) if 'HG_PENDING' in os.environ: @@ -204,7 +209,7 @@ c.readpending('00changelog.i.a') return c - @filecache('00manifest.i', True) + @storecache('00manifest.i') def manifest(self): return manifest.manifest(self.sopener) diff -r 8ae7626d8bf1 -r fa8488565afd mercurial/scmutil.py --- a/mercurial/scmutil.py Wed Feb 29 14:24:57 2012 +0100 +++ b/mercurial/scmutil.py Thu Mar 01 17:39:58 2012 +0200 @@ -793,9 +793,17 @@ to tell us if a file has been replaced. If it can't, we fallback to recreating the object on every call (essentially the same behaviour as propertycache).''' - def __init__(self, path, instore=False): + def __init__(self, path): self.path = path - self.instore = instore + + def join(self, obj, fname): + """Used to compute the runtime path of the cached file. + + Users should subclass filecache and provide their own version of this + function to call the appropriate join function on 'obj' (an instance + of the class that its member function was decorated). + """ + return obj.join(fname) def __call__(self, func): self.func = func @@ -813,7 +821,7 @@ if entry.changed(): entry.obj = self.func(obj) else: - path = self.instore and obj.sjoin(self.path) or obj.join(self.path) + path = self.join(obj, self.path) # We stat -before- creating the object so our cache doesn't lie if # a writer modified between the time we read and stat