Mercurial > hg
view tests/test-propertycache.py @ 50366:a445194f0a4d stable
backup: fix issue when the backup end up in a different directory
Because of store encoding, we might end up with the backup in a different
directory than the initial copy (for example if the backup path make it cross
the 120 char limit).
This can create crash, especially since 6.4 where backup are used during revlog
split.
Making sure the directory exists fixes these crash We added a test covering this
case.
Strictly speaking, this has always been broken, however the new code in 6.4
triggers it more easily.
author | Pierre-Yves David <pierre-yves.david@octobus.net> |
---|---|
date | Wed, 03 May 2023 00:16:38 +0200 |
parents | 6000f5b25c9b |
children |
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.""" 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'), )