diff -r b07b691d2667 -r 8ac0c9cd4c48 tests/test-fncache.t --- a/tests/test-fncache.t Wed Jul 11 16:11:33 2018 +0200 +++ b/tests/test-fncache.t Wed Jul 11 14:28:13 2018 +0100 @@ -436,3 +436,73 @@ $ cat .hg/store/fncache | sort data/.bar.i data/foo.i + + $ cd .. + +In repositories that have accumulated a large number of files over time, the +fncache file is going to be large. If we possibly can avoid loading it, so much the better. +The cache should not loaded when committing changes to existing files, or when unbundling +changesets that only contain changes to existing files: + + $ cat > fncacheloadwarn.py << EOF + > from __future__ import absolute_import + > from mercurial import extensions, store + > + > def extsetup(ui): + > def wrapstore(orig, requirements, *args): + > store = orig(requirements, *args) + > if 'store' in requirements and 'fncache' in requirements: + > instrumentfncachestore(store, ui) + > return store + > extensions.wrapfunction(store, 'store', wrapstore) + > + > def instrumentfncachestore(fncachestore, ui): + > class instrumentedfncache(type(fncachestore.fncache)): + > def _load(self): + > ui.warn('fncache load triggered!\n') + > super(instrumentedfncache, self)._load() + > fncachestore.fncache.__class__ = instrumentedfncache + > EOF + + $ fncachextpath=`pwd`/fncacheloadwarn.py + $ hg init nofncacheload + $ cd nofncacheload + $ printf "[extensions]\nfncacheloadwarn=$fncachextpath\n" >> .hg/hgrc + +A new file should trigger a load, as we'd want to update the fncache set in that case: + + $ touch foo + $ hg ci -qAm foo + fncache load triggered! + +But modifying that file should not: + + $ echo bar >> foo + $ hg ci -qm foo + +If a transaction has been aborted, the zero-size truncated index file will +not prevent the fncache from being loaded; rather than actually abort +a transaction, we simulate the situation by creating a zero-size index file: + + $ touch .hg/store/data/bar.i + $ touch bar + $ hg ci -qAm bar + fncache load triggered! + +Unbundling should follow the same rules; existing files should not cause a load: + + $ hg clone -q . tobundle + $ echo 'new line' > tobundle/bar + $ hg -R tobundle ci -qm bar + $ hg -R tobundle bundle -q barupdated.hg + $ hg unbundle -q barupdated.hg + +but adding new files should: + + $ touch tobundle/newfile + $ hg -R tobundle ci -qAm newfile + $ hg -R tobundle bundle -q newfile.hg + $ hg unbundle -q newfile.hg + fncache load triggered! + + $ cd ..