context: re-add `overlayworkingctx._compact()` removed in 6a5dcd754842
This partially backs out 6a5dcd754842. The method was and is unused, but a call
to it is introduced in the next patch.
Differential Revision: https://phab.mercurial-scm.org/D8842
--- a/mercurial/context.py Thu Jul 23 16:30:30 2020 +0200
+++ b/mercurial/context.py Tue Jul 28 20:07:05 2020 +0200
@@ -2530,6 +2530,43 @@
def clean(self):
self._cache = {}
+ def _compact(self):
+ """Removes keys from the cache that are actually clean, by comparing
+ them with the underlying context.
+
+ This can occur during the merge process, e.g. by passing --tool :local
+ to resolve a conflict.
+ """
+ keys = []
+ # This won't be perfect, but can help performance significantly when
+ # using things like remotefilelog.
+ scmutil.prefetchfiles(
+ self.repo(),
+ [
+ (
+ self.p1().rev(),
+ scmutil.matchfiles(self.repo(), self._cache.keys()),
+ )
+ ],
+ )
+
+ for path in self._cache.keys():
+ cache = self._cache[path]
+ try:
+ underlying = self._wrappedctx[path]
+ if (
+ underlying.data() == cache[b'data']
+ and underlying.flags() == cache[b'flags']
+ ):
+ keys.append(path)
+ except error.ManifestLookupError:
+ # Path not in the underlying manifest (created).
+ continue
+
+ for path in keys:
+ del self._cache[path]
+ return keys
+
def _markdirty(
self, path, exists, data=None, date=None, flags=b'', copied=None
):