diff -r f32f8bf5dc4c -r d9c49138ab93 mercurial/localrepo.py --- a/mercurial/localrepo.py Mon Sep 12 03:06:28 2016 +0900 +++ b/mercurial/localrepo.py Mon Sep 12 03:06:28 2016 +0900 @@ -1246,6 +1246,13 @@ delattr(self.unfiltered(), 'dirstate') def invalidate(self, clearfilecache=False): + '''Invalidates both store and non-store parts other than dirstate + + If a transaction is running, invalidation of store is omitted, + because discarding in-memory changes might cause inconsistency + (e.g. incomplete fncache causes unintentional failure, but + redundant one doesn't). + ''' unfiltered = self.unfiltered() # all file caches are stored unfiltered for k in self._filecache.keys(): # dirstate is invalidated separately in invalidatedirstate() @@ -1259,7 +1266,11 @@ except AttributeError: pass self.invalidatecaches() - self.store.invalidatecaches() + if not self.currenttransaction(): + # TODO: Changing contents of store outside transaction + # causes inconsistency. We should make in-memory store + # changes detectable, and abort if changed. + self.store.invalidatecaches() def invalidateall(self): '''Fully invalidates both store and non-store parts, causing the