Patchwork D1243: overlayworkingctx: add `_compact()`

login
register
mail settings
Submitter phabricator
Date Dec. 7, 2017, 9:52 p.m.
Message ID <e76f4c3b575d5027909db013ef7f2566@localhost.localdomain>
Download mbox | patch
Permalink /patch/26050/
State Not Applicable
Headers show

Comments

phabricator - Dec. 7, 2017, 9:52 p.m.
phillco updated this revision to Diff 4216.

REPOSITORY
  rHG Mercurial

CHANGES SINCE LAST UPDATE
  https://phab.mercurial-scm.org/D1243?vs=4208&id=4216

REVISION DETAIL
  https://phab.mercurial-scm.org/D1243

AFFECTED FILES
  mercurial/context.py

CHANGE DETAILS




To: phillco, #hg-reviewers
Cc: mercurial-devel

Patch

diff --git a/mercurial/context.py b/mercurial/context.py
--- a/mercurial/context.py
+++ b/mercurial/context.py
@@ -2214,6 +2214,9 @@ 
 
     def commit(self, text, parents=None, date=None, extra=None, editor=None,
                user=None, branch=None):
+        # We need to discard any keys that are actually clean before the empty
+        # commit check.
+        self._compact()
         allowemptycommit = (len(self._cache) or
                             self._repo.ui.configbool('ui', 'allowemptycommit'))
         if not allowemptycommit:
@@ -2234,6 +2237,29 @@ 
     def clean(self):
         self._cache = {}
 
+    def _compact(self):
+        """Removes keys from the cache that are actually clean, by comparing
+        them with the underlting context.
+
+        This can occur during the merge process, e.g. by passing --tool :local
+        to resolve a conflict.
+        """
+        keys = []
+        for path in self._cache.keys():
+            cache = self._cache[path]
+            try:
+                underlying = self._wrappedctx[path]
+                if (underlying.data() == cache['data'] and
+                            underlying.flags() == cache['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=''):
         self._cache[path] = {
             'exists': exists,