diff --git a/mercurial/localrepo.py b/mercurial/localrepo.py --- a/mercurial/localrepo.py +++ b/mercurial/localrepo.py @@ -1447,10 +1447,7 @@ class localrepository(object): # head, refresh the tag cache, then immediately add a new head. # But I think doing it this way is necessary for the "instant # tag cache retrieval" case to work. - self.invalidatecaches() - - # Discard all cache entries to force reloading everything. - self._filecache.clear() + self.invalidate() def walk(self, match, node=None): ''' diff --git a/tests/test-filecache.py b/tests/test-filecache.py --- a/tests/test-filecache.py +++ b/tests/test-filecache.py @@ -4,7 +4,7 @@ if subprocess.call(['python', '%s/hghave 'cacheable']): sys.exit(80) -from mercurial import util, scmutil, extensions +from mercurial import util, scmutil, extensions, hg, ui filecache = scmutil.filecache @@ -86,6 +86,21 @@ def fakeuncacheable(): util.cachestat.cacheable = origcacheable util.cachestat.__init__ = originit +def test_filecache_synced(): + # test old behaviour that caused filecached properties to go out of sync + os.system('hg init && echo a >> a && hg ci -qAm.') + repo = hg.repository(ui.ui()) + # first rollback clears the filecache, but changelog to stays in __dict__ + repo.rollback() + repo.commit('.') + # second rollback comes along and touches the changelog externally + # (file is moved) + repo.rollback() + # but since changelog isn't under the filecache control anymore, we don't + # see that it changed, and return the old changelog without reconstructing + # it + repo.commit('.') + print 'basic:' print basic(fakerepo()) @@ -93,3 +108,4 @@ print print 'fakeuncacheable:' print fakeuncacheable() +test_filecache_synced() diff --git a/tests/test-filecache.py.out b/tests/test-filecache.py.out --- a/tests/test-filecache.py.out +++ b/tests/test-filecache.py.out @@ -13,3 +13,7 @@ creating creating creating creating +repository tip rolled back to revision -1 (undo commit) +working directory now based on revision -1 +repository tip rolled back to revision -1 (undo commit) +working directory now based on revision -1