##// END OF EJS Templates
wireprotov2: define and implement "manifestdata" command...
wireprotov2: define and implement "manifestdata" command The added command can be used for obtaining manifest data. Given a manifest path and set of manifest nodes, data about manifests can be retrieved. Unlike changeset data, we wish to emit deltas to describe manifest revisions. So the command uses the relatively new API for building delta requests and emitting them. The code calls into deltaparent(), which I'm not very keen of. There's still work to be done in delta generation land so implementation details of storage (e.g. exactly one delta is stored/available) don't creep into higher levels. But we can worry about this later (there is already a TODO on imanifestorage tracking this). On the subject of parent deltas, the server assumes parent revisions exist on the receiving end. This is obviously wrong for shallow clone. I've added TODOs to add a mechanism to the command to allow clients to specify desired behavior. This shouldn't be too difficult to implement. Another big change is that the client must explicitly request manifest nodes to retrieve. This is a major departure from "getbundle," where the server derives relevant manifests as it iterates changesets and sends them automatically. As implemented, the client must transmit each requested node to the server. At 20 bytes per node, we're looking at 2 MB per 100,000 nodes. Plus wire encoding overhead. This isn't ideal for clients with limited upload bandwidth. I plan to address this in the future by allowing alternate mechanisms for defining the revisions to retrieve. One idea is to define a range of changeset revisions whose manifest revisions to retrieve (similar to how "changesetdata" works). We almost certainly want an API to look up an individual manifest by node. And that's where I've chosen to start with the implementation. Again, a theme of this early exchangev2 work is I want to start by building primitives for accessing raw repository data first and see how far we can get with those before we need more complexity. Differential Revision: https://phab.mercurial-scm.org/D4488

File last commit:

r30559:d83ca854 default
r39673:c7a7c7e8 default
Show More
test-propertycache.py
182 lines | 6.4 KiB | text/x-python | PythonLexer
/ tests / test-propertycache.py
Pierre-Yves David
repoview: make propertycache.setcache compatible with repoview...
r19845 """test behavior of propertycache and unfiltered propertycache
Mads Kiilerich
spelling: random spell checker fixes
r19951 The repoview overlay is quite complex. We test the behavior of
Pierre-Yves David
repoview: make propertycache.setcache compatible with repoview...
r19845 property cache of both localrepo and repoview to prevent
regression."""
Robert Stanca
py3: use print_function in test-propertycache.py
r28762 from __future__ import absolute_import, print_function
Robert Stanca
py3: use absolute_import in test-propertycache.py
r28755 import os
import subprocess
Pierre-Yves David
repoview: make propertycache.setcache compatible with repoview...
r19845
Yuya Nishihara
tests: import mercurial modules by name in test-propertycache...
r28839 from mercurial import (
hg,
localrepo,
ui as uimod,
util,
)
Pierre-Yves David
repoview: make propertycache.setcache compatible with repoview...
r19845
# create some special property cache that trace they call
calllog = []
Yuya Nishihara
tests: import mercurial modules by name in test-propertycache...
r28839 @util.propertycache
Pierre-Yves David
repoview: make propertycache.setcache compatible with repoview...
r19845 def testcachedfoobar(repo):
name = repo.filtername
if name is None:
name = ''
val = len(name)
calllog.append(val)
return val
Pierre-Yves David
repoview: have unfilteredpropertycache using the underlying cache...
r19846 unficalllog = []
Yuya Nishihara
tests: import mercurial modules by name in test-propertycache...
r28839 @localrepo.unfilteredpropertycache
Pierre-Yves David
repoview: have unfilteredpropertycache using the underlying cache...
r19846 def testcachedunfifoobar(repo):
name = repo.filtername
if name is None:
name = ''
val = 100 + len(name)
unficalllog.append(val)
return val
Pierre-Yves David
repoview: make propertycache.setcache compatible with repoview...
r19845 #plug them on repo
Yuya Nishihara
tests: import mercurial modules by name in test-propertycache...
r28839 localrepo.localrepository.testcachedfoobar = testcachedfoobar
localrepo.localrepository.testcachedunfifoobar = testcachedunfifoobar
Pierre-Yves David
repoview: make propertycache.setcache compatible with repoview...
r19845
Mads Kiilerich
spelling: fixes from spell checker
r21024 # Create an empty repo and instantiate it. It is important to run
# these tests on the real object to detect regression.
Pierre-Yves David
repoview: make propertycache.setcache compatible with repoview...
r19845 repopath = os.path.join(os.environ['TESTTMP'], 'repo')
Pierre-Yves David
test: make test-propertycache.py python2.4 compatible...
r19878 assert subprocess.call(['hg', 'init', repopath]) == 0
Yuya Nishihara
ui: factor out ui.load() to create a ui without loading configs (API)...
r30559 ui = uimod.ui.load()
Yuya Nishihara
tests: import mercurial modules by name in test-propertycache...
r28839 repo = hg.repository(ui, path=repopath).unfiltered()
Pierre-Yves David
repoview: make propertycache.setcache compatible with repoview...
r19845
Robert Stanca
py3: use print_function in test-propertycache.py
r28762 print('')
print('=== property cache ===')
print('')
print('calllog:', calllog)
print('cached value (unfiltered):',
vars(repo).get('testcachedfoobar', 'NOCACHE'))
Pierre-Yves David
repoview: make propertycache.setcache compatible with repoview...
r19845
Robert Stanca
py3: use print_function in test-propertycache.py
r28762 print('')
print('= first access on unfiltered, should do a call')
print('access:', repo.testcachedfoobar)
print('calllog:', calllog)
print('cached value (unfiltered):',
vars(repo).get('testcachedfoobar', 'NOCACHE'))
Pierre-Yves David
repoview: make propertycache.setcache compatible with repoview...
r19845
Robert Stanca
py3: use print_function in test-propertycache.py
r28762 print('')
print('= second access on unfiltered, should not do call')
print('access', repo.testcachedfoobar)
print('calllog:', calllog)
print('cached value (unfiltered):',
vars(repo).get('testcachedfoobar', 'NOCACHE'))
Pierre-Yves David
repoview: make propertycache.setcache compatible with repoview...
r19845
Robert Stanca
py3: use print_function in test-propertycache.py
r28762 print('')
print('= first access on "visible" view, should do a call')
Pierre-Yves David
repoview: make propertycache.setcache compatible with repoview...
r19845 visibleview = repo.filtered('visible')
Robert Stanca
py3: use print_function in test-propertycache.py
r28762 print('cached value ("visible" view):',
vars(visibleview).get('testcachedfoobar', 'NOCACHE'))
print('access:', visibleview.testcachedfoobar)
print('calllog:', calllog)
print('cached value (unfiltered):',
vars(repo).get('testcachedfoobar', 'NOCACHE'))
print('cached value ("visible" view):',
vars(visibleview).get('testcachedfoobar', 'NOCACHE'))
Pierre-Yves David
repoview: make propertycache.setcache compatible with repoview...
r19845
Robert Stanca
py3: use print_function in test-propertycache.py
r28762 print('')
print('= second access on "visible view", should not do call')
print('access:', visibleview.testcachedfoobar)
print('calllog:', calllog)
print('cached value (unfiltered):',
vars(repo).get('testcachedfoobar', 'NOCACHE'))
print('cached value ("visible" view):',
vars(visibleview).get('testcachedfoobar', 'NOCACHE'))
Pierre-Yves David
repoview: make propertycache.setcache compatible with repoview...
r19845
Robert Stanca
py3: use print_function in test-propertycache.py
r28762 print('')
print('= no effect on other view')
Pierre-Yves David
repoview: make propertycache.setcache compatible with repoview...
r19845 immutableview = repo.filtered('immutable')
Robert Stanca
py3: use print_function in test-propertycache.py
r28762 print('cached value ("immutable" view):',
vars(immutableview).get('testcachedfoobar', 'NOCACHE'))
print('access:', immutableview.testcachedfoobar)
print('calllog:', calllog)
print('cached value (unfiltered):',
vars(repo).get('testcachedfoobar', 'NOCACHE'))
print('cached value ("visible" view):',
vars(visibleview).get('testcachedfoobar', 'NOCACHE'))
print('cached value ("immutable" view):',
vars(immutableview).get('testcachedfoobar', 'NOCACHE'))
Pierre-Yves David
repoview: make propertycache.setcache compatible with repoview...
r19845
Pierre-Yves David
repoview: have unfilteredpropertycache using the underlying cache...
r19846 # unfiltered property cache test
Robert Stanca
py3: use print_function in test-propertycache.py
r28762 print('')
print('')
print('=== unfiltered property cache ===')
print('')
print('unficalllog:', unficalllog)
print('cached value (unfiltered): ',
vars(repo).get('testcachedunfifoobar', 'NOCACHE'))
print('cached value ("visible" view): ',
vars(visibleview).get('testcachedunfifoobar', 'NOCACHE'))
print('cached value ("immutable" view):',
vars(immutableview).get('testcachedunfifoobar', 'NOCACHE'))
Pierre-Yves David
repoview: have unfilteredpropertycache using the underlying cache...
r19846
Robert Stanca
py3: use print_function in test-propertycache.py
r28762 print('')
print('= first access on unfiltered, should do a call')
print('access (unfiltered):', repo.testcachedunfifoobar)
print('unficalllog:', unficalllog)
print('cached value (unfiltered): ',
vars(repo).get('testcachedunfifoobar', 'NOCACHE'))
Pierre-Yves David
repoview: have unfilteredpropertycache using the underlying cache...
r19846
Robert Stanca
py3: use print_function in test-propertycache.py
r28762 print('')
print('= second access on unfiltered, should not do call')
print('access (unfiltered):', repo.testcachedunfifoobar)
print('unficalllog:', unficalllog)
print('cached value (unfiltered): ',
vars(repo).get('testcachedunfifoobar', 'NOCACHE'))
Pierre-Yves David
repoview: have unfilteredpropertycache using the underlying cache...
r19846
Robert Stanca
py3: use print_function in test-propertycache.py
r28762 print('')
print('= access on view should use the unfiltered cache')
print('access (unfiltered): ', repo.testcachedunfifoobar)
print('access ("visible" view): ', visibleview.testcachedunfifoobar)
print('access ("immutable" view):', immutableview.testcachedunfifoobar)
print('unficalllog:', unficalllog)
print('cached value (unfiltered): ',
vars(repo).get('testcachedunfifoobar', 'NOCACHE'))
print('cached value ("visible" view): ',
vars(visibleview).get('testcachedunfifoobar', 'NOCACHE'))
print('cached value ("immutable" view):',
vars(immutableview).get('testcachedunfifoobar', 'NOCACHE'))
Pierre-Yves David
repoview: have unfilteredpropertycache using the underlying cache...
r19846
Robert Stanca
py3: use print_function in test-propertycache.py
r28762 print('')
print('= even if we clear the unfiltered cache')
Pierre-Yves David
repoview: have unfilteredpropertycache using the underlying cache...
r19846 del repo.__dict__['testcachedunfifoobar']
Robert Stanca
py3: use print_function in test-propertycache.py
r28762 print('cached value (unfiltered): ',
vars(repo).get('testcachedunfifoobar', 'NOCACHE'))
print('cached value ("visible" view): ',
vars(visibleview).get('testcachedunfifoobar', 'NOCACHE'))
print('cached value ("immutable" view):',
vars(immutableview).get('testcachedunfifoobar', 'NOCACHE'))
print('unficalllog:', unficalllog)
print('access ("visible" view): ', visibleview.testcachedunfifoobar)
print('unficalllog:', unficalllog)
print('cached value (unfiltered): ',
vars(repo).get('testcachedunfifoobar', 'NOCACHE'))
print('cached value ("visible" view): ',
vars(visibleview).get('testcachedunfifoobar', 'NOCACHE'))
print('cached value ("immutable" view):',
vars(immutableview).get('testcachedunfifoobar', 'NOCACHE'))
print('access ("immutable" view):', immutableview.testcachedunfifoobar)
print('unficalllog:', unficalllog)
print('cached value (unfiltered): ',
vars(repo).get('testcachedunfifoobar', 'NOCACHE'))
print('cached value ("visible" view): ',
vars(visibleview).get('testcachedunfifoobar', 'NOCACHE'))
print('cached value ("immutable" view):',
vars(immutableview).get('testcachedunfifoobar', 'NOCACHE'))
print('access (unfiltered): ', repo.testcachedunfifoobar)
print('unficalllog:', unficalllog)
print('cached value (unfiltered): ',
vars(repo).get('testcachedunfifoobar', 'NOCACHE'))
print('cached value ("visible" view): ',
vars(visibleview).get('testcachedunfifoobar', 'NOCACHE'))
print('cached value ("immutable" view):',
vars(immutableview).get('testcachedunfifoobar', 'NOCACHE'))