D4479: [RFC] obsolete: add mechanism to filter obsstore

lothiraldan (Boris Feld) phabricator at mercurial-scm.org
Tue Sep 4 23:19:57 UTC 2018


lothiraldan created this revision.
Herald added a subscriber: mercurial-devel.
Herald added a reviewer: hg-reviewers.

REVISION SUMMARY
  This patch is not ready to land and only sent for discussion.

REPOSITORY
  rHG Mercurial

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

AFFECTED FILES
  mercurial/obsolete.py

CHANGE DETAILS

diff --git a/mercurial/obsolete.py b/mercurial/obsolete.py
--- a/mercurial/obsolete.py
+++ b/mercurial/obsolete.py
@@ -70,6 +70,7 @@
 from __future__ import absolute_import
 
 import errno
+import hashlib
 import struct
 
 from .i18n import _
@@ -461,7 +462,7 @@
     return _unpack('>B', data[0:1])[0]
 
 @util.nogc
-def _readmarkers(data, off=None, stop=None):
+def _readmarkers(data, off=None, stop=None, filterfunc=None):
     """Read and enumerate markers from raw data"""
     diskversion = _readmarkerversion(data)
     if not off:
@@ -471,7 +472,10 @@
     if diskversion not in formats:
         msg = _('parsing obsolete marker: unknown version %r') % diskversion
         raise error.UnknownVersion(msg, version=diskversion)
-    return diskversion, formats[diskversion][0](data, off, stop)
+    markers = formats[diskversion][0](data, off, stop)
+    if filterfunc:
+        markers = filterfunc(markers)
+    return diskversion, markers
 
 def encodeheader(version=_fm0version):
     return _pack('>B', version)
@@ -515,6 +519,19 @@
             raise error.Abort(_('bad obsolescence marker detected: '
                                'invalid successors nullid'))
 
+def _filtermarkers(data):
+    """
+    Return a generator that will filter markers based on the data param passed.
+    data: a newline-separated list of obsmarker repr hashes
+    """
+    filterset = set(filter(lambda x: x != '', data.split('\n')))
+    def filtermarkers(markers):
+        for marker in markers:
+            markerhash = hashlib.md5(marker.__repr__()).hexdigest()
+            if markerhash not in filterset:
+                yield marker
+    return filtermarkers
+
 class obsstore(object):
     """Store obsolete markers
 
@@ -676,7 +693,8 @@
         data = self._data
         if not data:
             return []
-        self._version, markers = _readmarkers(data)
+        filterfunc = _filtermarkers(self.svfs.tryread('obsfilter'))
+        self._version, markers = _readmarkers(data, filterfunc=filterfunc)
         markers = list(markers)
         _checkinvalidmarkers(markers)
         return markers



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


More information about the Mercurial-devel mailing list