##// END OF EJS Templates
hg: establish a cache for localrepository instances...
hg: establish a cache for localrepository instances hgweb contained code for determining whether a cached localrepository instance was up to date. This code was way too low-level to be in hgweb. This functionality has been moved to a new "cachedlocalrepo" class in hg.py. The code has been changed slightly to facilitate use inside a class. hgweb has been refactored to use the new API. As part of this refactor, hgweb.repo no longer exists! We're very close to using a distinct repo instance per thread. The new cache records state when it is created. This intelligence prevents an extra localrepository from being created on the first hgweb request. This is why some redundant output from test-extension.t has gone away.

File last commit:

r26098:ce26928c default
r26219:ae33fff1 default
Show More
test-filecache.py
184 lines | 4.2 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
Siddharth Agarwal
scmutil.filecache: support watching over multiple files
r20045 @filecache('x', 'y')
Idan Kamara
scmutil: introduce filecache...
r14928 def cached(self):
print 'creating'
Siddharth Agarwal
test-filecache.py: make setbeforeget test clearer...
r20040 return 'string from function'
Idan Kamara
scmutil: introduce filecache...
r14928
def invalidate(self):
for k in self._filecache:
try:
delattr(self, k)
except AttributeError:
pass
def basic(repo):
Siddharth Agarwal
scmutil.filecache: support watching over multiple files
r20045 print "* neither file exists"
Siddharth Agarwal
test-filecache.py: add markers to the output for each event...
r20041 # calls function
Idan Kamara
scmutil: introduce filecache...
r14928 repo.cached
repo.invalidate()
Siddharth Agarwal
scmutil.filecache: support watching over multiple files
r20045 print "* neither file still exists"
Siddharth Agarwal
test-filecache.py: add markers to the output for each event...
r20041 # uses cache
Idan Kamara
scmutil: introduce filecache...
r14928 repo.cached
# create empty file
f = open('x', 'w')
f.close()
repo.invalidate()
Siddharth Agarwal
test-filecache.py: add markers to the output for each event...
r20041 print "* empty file x created"
Idan Kamara
scmutil: introduce filecache...
r14928 # should recreate the object
repo.cached
f = open('x', 'w')
f.write('a')
f.close()
repo.invalidate()
Siddharth Agarwal
test-filecache.py: add markers to the output for each event...
r20041 print "* file x changed size"
Idan Kamara
scmutil: introduce filecache...
r14928 # should recreate the object
repo.cached
repo.invalidate()
Siddharth Agarwal
scmutil.filecache: support watching over multiple files
r20045 print "* nothing changed with either file"
Siddharth Agarwal
test-filecache.py: add markers to the output for each event...
r20041 # stats file again, reuses object
Idan Kamara
scmutil: introduce filecache...
r14928 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()
Siddharth Agarwal
test-filecache.py: add markers to the output for each event...
r20041 print "* file x changed inode"
Idan Kamara
scmutil: introduce filecache...
r14928 repo.cached
Siddharth Agarwal
scmutil.filecache: support watching over multiple files
r20045 # create empty file y
f = open('y', 'w')
f.close()
repo.invalidate()
print "* empty file y created"
# should recreate the object
repo.cached
f = open('y', 'w')
f.write('A')
f.close()
repo.invalidate()
print "* file y changed size"
# should recreate the object
repo.cached
f = scmutil.opener('.')('y', 'w', atomictemp=True)
f.write('B')
f.close()
repo.invalidate()
print "* file y changed inode"
repo.cached
f = scmutil.opener('.')('x', 'w', atomictemp=True)
f.write('c')
f.close()
f = scmutil.opener('.')('y', 'w', atomictemp=True)
f.write('C')
f.close()
repo.invalidate()
print "* both files changed inode"
repo.cached
Idan Kamara
scmutil: introduce filecache...
r14928 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
Siddharth Agarwal
scmutil.filecache: support watching over multiple files
r20045 for fn in ['x', 'y']:
try:
os.remove(fn)
except OSError:
pass
Idan Kamara
scmutil: introduce filecache...
r14928
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():
timeless@mozdev.org
spelling: behaviour -> behavior
r26098 # test old behavior that caused filecached properties to go out of sync
Idan Kamara
destroyed: keep the filecache in sync with __dict__ (issue3335) (issue3693) (issue3743)...
r18313 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
filecache: create an entry in _filecache when __set__ is called for a missing one...
r18316 def setbeforeget(repo):
os.remove('x')
Siddharth Agarwal
scmutil.filecache: support watching over multiple files
r20045 os.remove('y')
Siddharth Agarwal
test-filecache.py: make setbeforeget test clearer...
r20040 repo.cached = 'string set externally'
Idan Kamara
filecache: create an entry in _filecache when __set__ is called for a missing one...
r18316 repo.invalidate()
Siddharth Agarwal
scmutil.filecache: support watching over multiple files
r20045 print "* neither file exists"
Idan Kamara
filecache: create an entry in _filecache when __set__ is called for a missing one...
r18316 print repo.cached
repo.invalidate()
f = open('x', 'w')
f.write('a')
f.close()
Siddharth Agarwal
test-filecache.py: add markers to the output for each event...
r20041 print "* file x created"
Idan Kamara
filecache: create an entry in _filecache when __set__ is called for a missing one...
r18316 print repo.cached
Siddharth Agarwal
scmutil.filecache: support watching over multiple files
r20045 repo.cached = 'string 2 set externally'
repo.invalidate()
print "* string set externally again"
print repo.cached
repo.invalidate()
f = open('y', 'w')
f.write('b')
f.close()
print "* file y created"
print repo.cached
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()
Idan Kamara
filecache: create an entry in _filecache when __set__ is called for a missing one...
r18316 print
print 'setbeforeget:'
print
setbeforeget(fakerepo())