# HG changeset patch # User Jun Wu # Date 1495757192 25200 # Node ID bb628fc85b0e6fd340ea15ce5fcc7e91e180a039 # Parent b62b2b373bced626dda563cf5cabb64ea752c9e4 test-context: add a case demonstrating manifest caching problem This issue was discovered when testing absorb on Windows. What happens are: 1. ctx.p1().manifestctx gets cached. let's call ctx.p1().manifestctx._revlog() "mrevlog1" 2. repo.manifestlog gets invalidated. let's call repo.manifestlog._revlog "mrevlog2" 3. repo.commitctx(ctx) commitctx uses ctx.p1().manifestctx and writes to "mrevlog1" 4. repo[n].manifest() cannot find the manifest node in "mrevlog2" This patch adds a test case to reproduce the issue. diff -r b62b2b373bce -r bb628fc85b0e tests/test-context.py --- a/tests/test-context.py Thu May 25 16:50:46 2017 +0200 +++ b/tests/test-context.py Thu May 25 17:06:32 2017 -0700 @@ -1,9 +1,11 @@ from __future__ import absolute_import, print_function import os +from mercurial.node import hex from mercurial import ( context, encoding, hg, + scmutil, ui as uimod, ) @@ -146,3 +148,34 @@ match=scmutil.matchfiles(repo, ['bar-r', 'foo']), listclean=True)) print('wcctx._status=%s' % (str(wcctx._status))) + +os.chdir('..') + +# test manifestlog being changed +print('== commit with manifestlog invalidated') + +repo = hg.repository(u, 'test2', create=1) +os.chdir('test2') + +# make some commits +for i in [b'1', b'2', b'3']: + with open(i, 'wb') as f: + f.write(i) + status = scmutil.status([], [i], [], [], [], [], []) + ctx = context.workingcommitctx(repo, status, text=i, user=b'test@test.com', + date=(0, 0)) + ctx.p1().manifest() # side effect: cache manifestctx + n = repo.commitctx(ctx) + print('commit %s: %s' % (i, hex(n))) + + # touch 00manifest.i mtime so storecache could expire. + # repo.__dict__['manifestlog'] is deleted by transaction releasefn. + st = repo.svfs.stat('00manifest.i') + repo.svfs.utime('00manifest.i', (st.st_mtime + 1, st.st_mtime + 1)) + + # read the file just committed + try: + if repo[n][i].data() != i: + print('data mismatch') + except Exception as ex: + print('cannot read data: %r' % ex) diff -r b62b2b373bce -r bb628fc85b0e tests/test-context.py.out --- a/tests/test-context.py.out Thu May 25 16:50:46 2017 +0200 +++ b/tests/test-context.py.out Thu May 25 17:06:32 2017 -0700 @@ -44,3 +44,9 @@ wcctx._status= wcctx._status= +== commit with manifestlog invalidated +commit 1: 2efe531a913fa648867ab8824360371679d05a65 +commit 2: 2caca91f6362020334384ebe27bae67315298abf +cannot read data: LookupError('Q\xa3L\xa5Ou\x8f\xce8\xda