##// END OF EJS Templates
extensions: register functions always at loading extension (issue5601)...
extensions: register functions always at loading extension (issue5601) Before this patch, functions defined in extensions are registered via extra loaders only in _dispatch(). Therefore, loading extensions in other code paths like below omits registration of functions. - WSGI service - operation across repositories (e.g. subrepo) - test-duplicateoptions.py, using extensions.loadall() directly To register functions always at loading new extension, this patch moves implementation for extra loading from dispatch._dispatch() to extensions.loadall(). AFAIK, only commands module causes cyclic dependency between extensions module, but this patch imports all related modules just before extra loading in loadall(), in order to centralize them. This patch makes extensions.py depend on many other modules, even though extensions.py itself doesn't. It should be avoided if possible, but I don't have any better idea. Some other places like below aren't reasonable for extra loading, IMHO. - specific function in newly added module: existing callers of extensions.loadall() should invoke it, too - hg.repository() or so: no-repo commands aren't covered by this. BTW, this patch removes _loaded.add(name) on relocation, because dispatch._loaded is used only for extraloaders (for similar reason, "exts" variable is removed, too).

File last commit:

r31284:74cbbd54 default
r33052:45b0e9d0 default
Show More
test-filecache.py
253 lines | 6.3 KiB | text/x-python | PythonLexer
/ tests / test-filecache.py
Robert Stanca
py3: use print_function in test-filecache.py
r28742 from __future__ import absolute_import, print_function
Robert Stanca
py3: use absolute_import in test-filecache.py
r28741 import os
import subprocess
import sys
Idan Kamara
scmutil: introduce filecache...
r14928
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)
Yuya Nishihara
test-filecache: sort import lines
r28802 from mercurial import (
extensions,
hg,
Pierre-Yves David
filecache: explicitly test 'repofilecache'...
r31284 localrepo,
Yuya Nishihara
test-filecache: alias ui as uimod
r28803 ui as uimod,
Yuya Nishihara
test-filecache: sort import lines
r28802 util,
Pierre-Yves David
vfs: use 'vfs' module directly in 'test-filecache'...
r31251 vfs as vfsmod,
Yuya Nishihara
test-filecache: sort import lines
r28802 )
Idan Kamara
scmutil: introduce filecache...
r14928
class fakerepo(object):
def __init__(self):
self._filecache = {}
Pierre-Yves David
filecache: explicitly test 'repofilecache'...
r31284 class fakevfs(object):
def join(self, p):
return p
vfs = fakevfs()
def unfiltered(self):
return self
Idan Kamara
scmutil: introduce filecache...
r14928
def sjoin(self, p):
return p
Pierre-Yves David
filecache: explicitly test 'repofilecache'...
r31284 @localrepo.repofilecache('x', 'y')
Idan Kamara
scmutil: introduce filecache...
r14928 def cached(self):
Robert Stanca
py3: use print_function in test-filecache.py
r28742 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):
Robert Stanca
py3: use print_function in test-filecache.py
r28742 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()
Robert Stanca
py3: use print_function in test-filecache.py
r28742 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()
Robert Stanca
py3: use print_function in test-filecache.py
r28742 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()
Robert Stanca
py3: use print_function in test-filecache.py
r28742 print("* file x changed size")
Idan Kamara
scmutil: introduce filecache...
r14928 # should recreate the object
repo.cached
repo.invalidate()
Robert Stanca
py3: use print_function in test-filecache.py
r28742 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
Pierre-Yves David
vfs: use 'vfs' module directly in 'test-filecache'...
r31251 f = vfsmod.vfs('.')('x', 'w', atomictemp=True)
Idan Kamara
scmutil: introduce filecache...
r14928 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()
Robert Stanca
py3: use print_function in test-filecache.py
r28742 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()
Robert Stanca
py3: use print_function in test-filecache.py
r28742 print("* empty file y created")
Siddharth Agarwal
scmutil.filecache: support watching over multiple files
r20045 # should recreate the object
repo.cached
f = open('y', 'w')
f.write('A')
f.close()
repo.invalidate()
Robert Stanca
py3: use print_function in test-filecache.py
r28742 print("* file y changed size")
Siddharth Agarwal
scmutil.filecache: support watching over multiple files
r20045 # should recreate the object
repo.cached
Pierre-Yves David
vfs: use 'vfs' module directly in 'test-filecache'...
r31251 f = vfsmod.vfs('.')('y', 'w', atomictemp=True)
Siddharth Agarwal
scmutil.filecache: support watching over multiple files
r20045 f.write('B')
f.close()
repo.invalidate()
Robert Stanca
py3: use print_function in test-filecache.py
r28742 print("* file y changed inode")
Siddharth Agarwal
scmutil.filecache: support watching over multiple files
r20045 repo.cached
Pierre-Yves David
vfs: use 'vfs' module directly in 'test-filecache'...
r31251 f = vfsmod.vfs('.')('x', 'w', atomictemp=True)
Siddharth Agarwal
scmutil.filecache: support watching over multiple files
r20045 f.write('c')
f.close()
Pierre-Yves David
vfs: use 'vfs' module directly in 'test-filecache'...
r31251 f = vfsmod.vfs('.')('y', 'w', atomictemp=True)
Siddharth Agarwal
scmutil.filecache: support watching over multiple files
r20045 f.write('C')
f.close()
repo.invalidate()
Robert Stanca
py3: use print_function in test-filecache.py
r28742 print("* both files changed inode")
Siddharth Agarwal
scmutil.filecache: support watching over multiple files
r20045 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.')
Yuya Nishihara
ui: factor out ui.load() to create a ui without loading configs (API)...
r30559 repo = hg.repository(uimod.ui.load())
Idan Kamara
destroyed: keep the filecache in sync with __dict__ (issue3335) (issue3693) (issue3743)...
r18313 # 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()
Robert Stanca
py3: use print_function in test-filecache.py
r28742 print("* neither file exists")
print(repo.cached)
Idan Kamara
filecache: create an entry in _filecache when __set__ is called for a missing one...
r18316 repo.invalidate()
f = open('x', 'w')
f.write('a')
f.close()
Robert Stanca
py3: use print_function in test-filecache.py
r28742 print("* file x created")
print(repo.cached)
Idan Kamara
filecache: create an entry in _filecache when __set__ is called for a missing one...
r18316
Siddharth Agarwal
scmutil.filecache: support watching over multiple files
r20045 repo.cached = 'string 2 set externally'
repo.invalidate()
Robert Stanca
py3: use print_function in test-filecache.py
r28742 print("* string set externally again")
print(repo.cached)
Siddharth Agarwal
scmutil.filecache: support watching over multiple files
r20045
repo.invalidate()
f = open('y', 'w')
f.write('b')
f.close()
Robert Stanca
py3: use print_function in test-filecache.py
r28742 print("* file y created")
print(repo.cached)
Siddharth Agarwal
scmutil.filecache: support watching over multiple files
r20045
FUJIWARA Katsunori
scmutil: add file object wrapper class to check ambiguity at closing...
r29995 def antiambiguity():
filename = 'ambigcheck'
# try some times, because reproduction of ambiguity depends on
# "filesystem time"
for i in xrange(5):
fp = open(filename, 'w')
fp.write('FOO')
fp.close()
oldstat = os.stat(filename)
if oldstat.st_ctime != oldstat.st_mtime:
# subsequent changing never causes ambiguity
continue
repetition = 3
# repeat changing via checkambigatclosing, to examine whether
Mads Kiilerich
spelling: fixes of non-dictionary words
r30332 # st_mtime is advanced multiple times as expected
FUJIWARA Katsunori
scmutil: add file object wrapper class to check ambiguity at closing...
r29995 for i in xrange(repetition):
# explicit closing
Pierre-Yves David
vfs: use 'vfs' module directly in 'test-filecache'...
r31251 fp = vfsmod.checkambigatclosing(open(filename, 'a'))
FUJIWARA Katsunori
scmutil: add file object wrapper class to check ambiguity at closing...
r29995 fp.write('FOO')
fp.close()
# implicit closing by "with" statement
Pierre-Yves David
vfs: use 'vfs' module directly in 'test-filecache'...
r31251 with vfsmod.checkambigatclosing(open(filename, 'a')) as fp:
FUJIWARA Katsunori
scmutil: add file object wrapper class to check ambiguity at closing...
r29995 fp.write('BAR')
newstat = os.stat(filename)
if oldstat.st_ctime != newstat.st_ctime:
# timestamp ambiguity was naturally avoided while repetition
continue
# st_mtime should be advanced "repetition * 2" times, because
Mads Kiilerich
spelling: fixes of non-dictionary words
r30332 # all changes occurred at same time (in sec)
FUJIWARA Katsunori
scmutil: add file object wrapper class to check ambiguity at closing...
r29995 expected = (oldstat.st_mtime + repetition * 2) & 0x7fffffff
if newstat.st_mtime != expected:
print("'newstat.st_mtime %s is not %s (as %s + %s * 2)" %
(newstat.st_mtime, expected, oldstat.st_mtime, repetition))
# no more examination is needed regardless of result
break
else:
# This platform seems too slow to examine anti-ambiguity
# of file timestamp (or test happened to be executed at
# bad timing). Exit silently in this case, because running
# on other faster platforms can detect problems
pass
Robert Stanca
py3: use print_function in test-filecache.py
r28742 print('basic:')
print()
Idan Kamara
scmutil: introduce filecache...
r14928 basic(fakerepo())
Robert Stanca
py3: use print_function in test-filecache.py
r28742 print()
print('fakeuncacheable:')
print()
Idan Kamara
scmutil: introduce filecache...
r14928 fakeuncacheable()
Idan Kamara
destroyed: keep the filecache in sync with __dict__ (issue3335) (issue3693) (issue3743)...
r18313 test_filecache_synced()
Robert Stanca
py3: use print_function in test-filecache.py
r28742 print()
print('setbeforeget:')
print()
Idan Kamara
filecache: create an entry in _filecache when __set__ is called for a missing one...
r18316 setbeforeget(fakerepo())
FUJIWARA Katsunori
scmutil: add file object wrapper class to check ambiguity at closing...
r29995 print()
print('antiambiguity:')
print()
antiambiguity()