--- a/mercurial/store.py Mon Nov 26 15:38:35 2018 +0300
+++ b/mercurial/store.py Fri Nov 23 18:58:16 2018 +0300
@@ -451,6 +451,8 @@
self.vfs = vfs
self.entries = None
self._dirty = False
+ # set of new additions to fncache
+ self.addls = set()
def _load(self):
'''fill the entries from the fncache file'''
@@ -479,17 +481,28 @@
fp.write(encodedir('\n'.join(self.entries) + '\n'))
fp.close()
self._dirty = False
+ if self.addls:
+ # if we have just new entries, let's append them to the fncache
+ tr.addbackup('fncache')
+ fp = self.vfs('fncache', mode='ab', atomictemp=True)
+ if self.addls:
+ fp.write(encodedir('\n'.join(self.addls) + '\n'))
+ fp.close()
+ self.entries = None
+ self.addls = set()
def add(self, fn):
if self.entries is None:
self._load()
if fn not in self.entries:
- self._dirty = True
- self.entries.add(fn)
+ self.addls.add(fn)
def remove(self, fn):
if self.entries is None:
self._load()
+ if fn in self.addls:
+ self.addls.remove(fn)
+ return
try:
self.entries.remove(fn)
self._dirty = True
@@ -497,6 +510,8 @@
pass
def __contains__(self, fn):
+ if fn in self.addls:
+ return True
if self.entries is None:
self._load()
return fn in self.entries
@@ -504,7 +519,7 @@
def __iter__(self):
if self.entries is None:
self._load()
- return iter(self.entries)
+ return iter(self.entries | self.addls)
class _fncachevfs(vfsmod.abstractvfs, vfsmod.proxyvfs):
def __init__(self, vfs, fnc, encode):
@@ -580,6 +595,7 @@
def invalidatecaches(self):
self.fncache.entries = None
+ self.fncache.addls = set()
def markremoved(self, fn):
self.fncache.remove(fn)