16 import tags as tagsmod |
16 import tags as tagsmod |
17 from lock import release |
17 from lock import release |
18 import weakref, errno, os, time, inspect |
18 import weakref, errno, os, time, inspect |
19 propertycache = util.propertycache |
19 propertycache = util.propertycache |
20 filecache = scmutil.filecache |
20 filecache = scmutil.filecache |
|
21 |
|
22 class storecache(filecache): |
|
23 """filecache for files in the store""" |
|
24 def join(self, obj, fname): |
|
25 return obj.sjoin(fname) |
21 |
26 |
22 class localrepository(repo.repository): |
27 class localrepository(repo.repository): |
23 capabilities = set(('lookup', 'changegroupsubset', 'branchmap', 'pushkey', |
28 capabilities = set(('lookup', 'changegroupsubset', 'branchmap', 'pushkey', |
24 'known', 'getbundle')) |
29 'known', 'getbundle')) |
25 supportedformats = set(('revlogv1', 'generaldelta')) |
30 supportedformats = set(('revlogv1', 'generaldelta')) |
174 return bookmarks.readcurrent(self) |
179 return bookmarks.readcurrent(self) |
175 |
180 |
176 def _writebookmarks(self, marks): |
181 def _writebookmarks(self, marks): |
177 bookmarks.write(self) |
182 bookmarks.write(self) |
178 |
183 |
179 @filecache('phaseroots', True) |
184 @storecache('phaseroots') |
180 def _phaseroots(self): |
185 def _phaseroots(self): |
181 self._dirtyphases = False |
186 self._dirtyphases = False |
182 phaseroots = phases.readroots(self) |
187 phaseroots = phases.readroots(self) |
183 phases.filterunknown(self, phaseroots) |
188 phases.filterunknown(self, phaseroots) |
184 return phaseroots |
189 return phaseroots |
193 cache[rev] = phase |
198 cache[rev] = phase |
194 for rev in self.changelog.descendants(*roots): |
199 for rev in self.changelog.descendants(*roots): |
195 cache[rev] = phase |
200 cache[rev] = phase |
196 return cache |
201 return cache |
197 |
202 |
198 @filecache('00changelog.i', True) |
203 @storecache('00changelog.i') |
199 def changelog(self): |
204 def changelog(self): |
200 c = changelog.changelog(self.sopener) |
205 c = changelog.changelog(self.sopener) |
201 if 'HG_PENDING' in os.environ: |
206 if 'HG_PENDING' in os.environ: |
202 p = os.environ['HG_PENDING'] |
207 p = os.environ['HG_PENDING'] |
203 if p.startswith(self.root): |
208 if p.startswith(self.root): |
204 c.readpending('00changelog.i.a') |
209 c.readpending('00changelog.i.a') |
205 return c |
210 return c |
206 |
211 |
207 @filecache('00manifest.i', True) |
212 @storecache('00manifest.i') |
208 def manifest(self): |
213 def manifest(self): |
209 return manifest.manifest(self.sopener) |
214 return manifest.manifest(self.sopener) |
210 |
215 |
211 @filecache('dirstate') |
216 @filecache('dirstate') |
212 def dirstate(self): |
217 def dirstate(self): |
894 |
899 |
895 This is different to dirstate.invalidate() that it doesn't always |
900 This is different to dirstate.invalidate() that it doesn't always |
896 rereads the dirstate. Use dirstate.invalidate() if you want to |
901 rereads the dirstate. Use dirstate.invalidate() if you want to |
897 explicitly read the dirstate again (i.e. restoring it to a previous |
902 explicitly read the dirstate again (i.e. restoring it to a previous |
898 known good state).''' |
903 known good state).''' |
899 try: |
904 if 'dirstate' in self.__dict__: |
|
905 for k in self.dirstate._filecache: |
|
906 try: |
|
907 delattr(self.dirstate, k) |
|
908 except AttributeError: |
|
909 pass |
900 delattr(self, 'dirstate') |
910 delattr(self, 'dirstate') |
901 except AttributeError: |
|
902 pass |
|
903 |
911 |
904 def invalidate(self): |
912 def invalidate(self): |
905 for k in self._filecache: |
913 for k in self._filecache: |
906 # dirstate is invalidated separately in invalidatedirstate() |
914 # dirstate is invalidated separately in invalidatedirstate() |
907 if k == 'dirstate': |
915 if k == 'dirstate': |