commitctx: extract copy information encoding into extra into commit.py
The encoding of copy information into extra has multiple subcases and become
quite complicated (eg: empty list can be explicitly or implicitly stored for
example). In addition, it is niche experimental feature since as it affect the
hash, it is only suitable for user who don't mercurial for storage server side
(ie: Google).
Having this complexity part of the changelog will get in the way of further
cleanup. We could have to either move more of that logic into the changelog or
to move or extract more of the logic at the higher level. We take the second
approach and start gather logic in dedicated function in commit.py.
"""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'),
)