Mercurial > hg
comparison tests/test-propertycache.py @ 19845:a1237a4b437d stable
repoview: make propertycache.setcache compatible with repoview
Propertycache used standard attribute assignment. In the repoview case, this
assignment was forwarded to the unfiltered repo. This result in:
(1) unfiltered repo got a potentially wrong cache value,
(2) repoview never reused the cached value.
This patch replaces the standard attribute assignment by an assignment to
`objc.__dict__` which will bypass the `repoview.__setattr__`. This will not
affects other `propertycache` users and it is actually closer to the semantic we
need.
The interaction of `propertycache` and `repoview` are now tested in a python
test file.
author | Pierre-Yves David <pierre-yves.david@ens-lyon.org> |
---|---|
date | Mon, 30 Sep 2013 14:36:11 +0200 |
parents | |
children | 9789670992d6 |
comparison
equal
deleted
inserted
replaced
19844:bbeee568a84d | 19845:a1237a4b437d |
---|---|
1 """test behavior of propertycache and unfiltered propertycache | |
2 | |
3 The repoview overlay is quite complexe. We test the behavior of | |
4 property cache of both localrepo and repoview to prevent | |
5 regression.""" | |
6 | |
7 import os, subprocess | |
8 import mercurial.localrepo | |
9 import mercurial.repoview | |
10 import mercurial.util | |
11 import mercurial.hg | |
12 import mercurial.ui as uimod | |
13 | |
14 | |
15 # create some special property cache that trace they call | |
16 | |
17 calllog = [] | |
18 @mercurial.util.propertycache | |
19 def testcachedfoobar(repo): | |
20 name = repo.filtername | |
21 if name is None: | |
22 name = '' | |
23 val = len(name) | |
24 calllog.append(val) | |
25 return val | |
26 | |
27 #plug them on repo | |
28 mercurial.localrepo.localrepository.testcachedfoobar = testcachedfoobar | |
29 | |
30 | |
31 # create an empty repo. and instanciate it. It is important to run | |
32 # those test on the real object to detect regression. | |
33 repopath = os.path.join(os.environ['TESTTMP'], 'repo') | |
34 subprocess.check_call(['hg', 'init', repopath]) | |
35 ui = uimod.ui() | |
36 repo = mercurial.hg.repository(ui, path=repopath).unfiltered() | |
37 | |
38 | |
39 print '' | |
40 print '=== property cache ===' | |
41 print '' | |
42 print 'calllog:', calllog | |
43 print 'cached value (unfiltered):', | |
44 print vars(repo).get('testcachedfoobar', 'NOCACHE') | |
45 | |
46 print '' | |
47 print '= first access on unfiltered, should do a call' | |
48 print 'access:', repo.testcachedfoobar | |
49 print 'calllog:', calllog | |
50 print 'cached value (unfiltered):', | |
51 print vars(repo).get('testcachedfoobar', 'NOCACHE') | |
52 | |
53 print '' | |
54 print '= second access on unfiltered, should not do call' | |
55 print 'access', repo.testcachedfoobar | |
56 print 'calllog:', calllog | |
57 print 'cached value (unfiltered):', | |
58 print vars(repo).get('testcachedfoobar', 'NOCACHE') | |
59 | |
60 print '' | |
61 print '= first access on "visible" view, should do a call' | |
62 visibleview = repo.filtered('visible') | |
63 print 'cached value ("visible" view):', | |
64 print vars(visibleview).get('testcachedfoobar', 'NOCACHE') | |
65 print 'access:', visibleview.testcachedfoobar | |
66 print 'calllog:', calllog | |
67 print 'cached value (unfiltered):', | |
68 print vars(repo).get('testcachedfoobar', 'NOCACHE') | |
69 print 'cached value ("visible" view):', | |
70 print vars(visibleview).get('testcachedfoobar', 'NOCACHE') | |
71 | |
72 print '' | |
73 print '= second access on "visible view", should not do call' | |
74 print 'access:', visibleview.testcachedfoobar | |
75 print 'calllog:', calllog | |
76 print 'cached value (unfiltered):', | |
77 print vars(repo).get('testcachedfoobar', 'NOCACHE') | |
78 print 'cached value ("visible" view):', | |
79 print vars(visibleview).get('testcachedfoobar', 'NOCACHE') | |
80 | |
81 print '' | |
82 print '= no effect on other view' | |
83 immutableview = repo.filtered('immutable') | |
84 print 'cached value ("immutable" view):', | |
85 print vars(immutableview).get('testcachedfoobar', 'NOCACHE') | |
86 print 'access:', immutableview.testcachedfoobar | |
87 print 'calllog:', calllog | |
88 print 'cached value (unfiltered):', | |
89 print vars(repo).get('testcachedfoobar', 'NOCACHE') | |
90 print 'cached value ("visible" view):', | |
91 print vars(visibleview).get('testcachedfoobar', 'NOCACHE') | |
92 print 'cached value ("immutable" view):', | |
93 print vars(immutableview).get('testcachedfoobar', 'NOCACHE') | |
94 |