[PATCH 2 of 4] obsolete: add a filteredmarkerdict class
Jun Wu
quark at fb.com
Mon Mar 13 05:34:17 EDT 2017
# HG changeset patch
# User Jun Wu <quark at fb.com>
# Date 1489386664 25200
# Sun Mar 12 23:31:04 2017 -0700
# Node ID 09a30f1a2da8d17d4781b1a66a282265138f4f29
# Parent dec2b2328ef19c166f0ed1cb711b6c99dc9c590a
# Available At https://bitbucket.org/quark-zju/hg-draft
# hg pull https://bitbucket.org/quark-zju/hg-draft -r 09a30f1a2da8
obsolete: add a filteredmarkerdict class
See the previous patch for motivation. This allows us to make markers
invisible on demand.
diff --git a/mercurial/obsolete.py b/mercurial/obsolete.py
--- a/mercurial/obsolete.py
+++ b/mercurial/obsolete.py
@@ -517,4 +517,41 @@ def _checkinvalidmarkers(markers):
'invalid successors nullid'))
+class filteredmarkerdict(dict):
+ """a dict where its values (markers) are filtered when accessed
+
+ Markers with date <= _nodeversions.get(precursor, -1) will be filtered.
+ """
+
+ def __init__(self, nodeversions):
+ self._nodeversions = nodeversions
+
+ def get(self, key, default=None):
+ self._filter(key)
+ return super(filteredmarkerdict, self).get(key, default)
+
+ def __contains__(self, key):
+ self._filter(key)
+ return super(filteredmarkerdict, self).__contains__(key)
+
+ def _filter(self, key):
+ markers = super(filteredmarkerdict, self).get(key, None)
+ if markers is None:
+ return
+ filtered = []
+ for m in markers:
+ prec = m[0]
+ pver = self._nodeversions.get(prec, -1)
+ date = m[4][0]
+ if date <= pver:
+ filtered.append(m)
+ if not filtered:
+ return
+ # We can mutate the set, because nodeversions can only be updated with
+ # newer dates. The items being removed won't be revived later.
+ if len(filtered) == len(markers):
+ del self[key]
+ return
+ self[key] = set(x for x in markers if x not in filtered)
+
class obsstore(object):
"""Store obsolete markers
More information about the Mercurial-devel
mailing list