##// END OF EJS Templates
destroyed: keep the filecache in sync with __dict__ (issue3335) (issue3693) (issue3743)...
destroyed: keep the filecache in sync with __dict__ (issue3335) (issue3693) (issue3743) We need to make sure that if X is in the filecache then it's also in the filecache owner's __dict__, otherwise it will go out of sync: repo.X # first access to X, records stat info in # filecache and updates __dict__ repo._filecache.clear() # removes X from _filecache but it's still in __dict__ repo.invalidate() # iterates over _filecache and removes entries # from __dict__, but X isn't in _filecache, so # it's kept in __dict__ repo.X # X is fetched from __dict__, bypassing the filecache

File last commit:

r18313:3e4a944c default
r18313:3e4a944c default
Show More
test-filecache.py
111 lines | 2.6 KiB | text/x-python | PythonLexer
/ tests / test-filecache.py
Idan Kamara
scmutil: introduce filecache...
r14928 import sys, os, subprocess
Brodie Rao
cleanup: eradicate long lines
r16683 if subprocess.call(['python', '%s/hghave' % os.environ['TESTDIR'],
'cacheable']):
Idan Kamara
scmutil: introduce filecache...
r14928 sys.exit(80)
Idan Kamara
destroyed: keep the filecache in sync with __dict__ (issue3335) (issue3693) (issue3743)...
r18313 from mercurial import util, scmutil, extensions, hg, ui
Idan Kamara
scmutil: introduce filecache...
r14928
filecache = scmutil.filecache
class fakerepo(object):
def __init__(self):
self._filecache = {}
def join(self, p):
return p
def sjoin(self, p):
return p
@filecache('x')
def cached(self):
print 'creating'
def invalidate(self):
for k in self._filecache:
try:
delattr(self, k)
except AttributeError:
pass
def basic(repo):
# file doesn't exist, calls function
repo.cached
repo.invalidate()
# file still doesn't exist, uses cache
repo.cached
# create empty file
f = open('x', 'w')
f.close()
repo.invalidate()
# should recreate the object
repo.cached
f = open('x', 'w')
f.write('a')
f.close()
repo.invalidate()
# should recreate the object
repo.cached
repo.invalidate()
# stats file again, nothing changed, reuses object
repo.cached
# atomic replace file, size doesn't change
# hopefully st_mtime doesn't change as well so this doesn't use the cache
# because of inode change
f = scmutil.opener('.')('x', 'w', atomictemp=True)
f.write('b')
Greg Ward
atomictempfile: make close() consistent with other file-like objects....
r15057 f.close()
Idan Kamara
scmutil: introduce filecache...
r14928
repo.invalidate()
repo.cached
def fakeuncacheable():
def wrapcacheable(orig, *args, **kwargs):
return False
def wrapinit(orig, *args, **kwargs):
pass
originit = extensions.wrapfunction(util.cachestat, '__init__', wrapinit)
Matt Mackall
filecache: fix check-code complaint
r14937 origcacheable = extensions.wrapfunction(util.cachestat, 'cacheable',
wrapcacheable)
Idan Kamara
scmutil: introduce filecache...
r14928
try:
os.remove('x')
Brodie Rao
cleanup: replace naked excepts with more specific ones
r16688 except OSError:
Idan Kamara
scmutil: introduce filecache...
r14928 pass
basic(fakerepo())
util.cachestat.cacheable = origcacheable
util.cachestat.__init__ = originit
Idan Kamara
destroyed: keep the filecache in sync with __dict__ (issue3335) (issue3693) (issue3743)...
r18313 def test_filecache_synced():
# test old behaviour that caused filecached properties to go out of sync
os.system('hg init && echo a >> a && hg ci -qAm.')
repo = hg.repository(ui.ui())
# first rollback clears the filecache, but changelog to stays in __dict__
repo.rollback()
repo.commit('.')
# second rollback comes along and touches the changelog externally
# (file is moved)
repo.rollback()
# but since changelog isn't under the filecache control anymore, we don't
# see that it changed, and return the old changelog without reconstructing
# it
repo.commit('.')
Idan Kamara
scmutil: introduce filecache...
r14928 print 'basic:'
print
basic(fakerepo())
print
print 'fakeuncacheable:'
print
fakeuncacheable()
Idan Kamara
destroyed: keep the filecache in sync with __dict__ (issue3335) (issue3693) (issue3743)...
r18313 test_filecache_synced()