view tests/test-propertycache.py @ 42175:cd1bede340b0 stable

setup: tweak error message for Python 3 We now have beta support for Python 3. In my opinion, it isn't yet stable enough to allow `pip install Mercurial` to work with Python 3 out of the box: we don't want people accidentally using Mercurial with Python 3 just yet. But I do think we should be more friendly about informing people of their options. This commit tweaks the error message that users see when running setup.py with Python 3. We instruct them about the current level of Python 3 support, point them at the wiki for more info, and give them instructions on how to bypass the check. As part of this, I also changed which version value is printed, as we were printing a named tuple before.
author Gregory Szorc <gregory.szorc@gmail.com>
date Sun, 21 Apr 2019 08:57:01 -0700
parents e5d74742d00e
children 2372284d9457
line wrap: on
line source

"""test behavior of propertycache and unfiltered propertycache

The repoview overlay is quite complex. We test the behavior of
property cache of both localrepo and repoview to prevent
regression."""

from __future__ import absolute_import, print_function
import os
import subprocess

from mercurial import (
    hg,
    localrepo,
    pycompat,
    ui as uimod,
    util,
)

from mercurial.utils import (
    procutil,
)

# create some special property cache that trace they call

calllog = []
@util.propertycache
def testcachedfoobar(repo):
    name = repo.filtername
    if name is None:
        name = ''
    val = len(name)
    calllog.append(val)
    return val

unficalllog = []
@localrepo.unfilteredpropertycache
def testcachedunfifoobar(repo):
    name = repo.filtername
    if name is None:
        name = ''
    val = 100 + len(name)
    unficalllog.append(val)
    return val

#plug them on repo
localrepo.localrepository.testcachedfoobar = testcachedfoobar
localrepo.localrepository.testcachedunfifoobar = testcachedunfifoobar


# Create an empty repo and instantiate it. It is important to run
# these tests on the real object to detect regression.
repopath = pycompat.fsencode(os.path.join(os.environ['TESTTMP'], 'repo'))
assert subprocess.call(pycompat.rapply(procutil.tonativestr,
                                       [b'hg', b'init', repopath])) == 0

ui = uimod.ui.load()
repo = hg.repository(ui, path=repopath).unfiltered()


print('')
print('=== property cache ===')
print('')
print('calllog:', calllog)
print('cached value (unfiltered):',
    vars(repo).get('testcachedfoobar', 'NOCACHE'))

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'))

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'))

print('')
print('= first access on "visible" view, should do a call')
visibleview = repo.filtered('visible')
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'))

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'))

print('')
print('= no effect on other view')
immutableview = repo.filtered('immutable')
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'))

# unfiltered property cache test
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'))

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'))

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'))

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'))

print('')
print('= even if we clear the unfiltered cache')
del repo.__dict__['testcachedunfifoobar']
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'))