util: add method to peek item in lrucachedict
I want a function that doesn't unnecessarily update the internal state of
the cache dict after fork().
--- a/mercurial/util.py Wed Oct 31 22:05:45 2018 +0900
+++ b/mercurial/util.py Wed Oct 31 22:29:05 2018 +0900
@@ -1337,6 +1337,20 @@
except KeyError:
return default
+ def peek(self, k, default=_notset):
+ """Get the specified item without moving it to the head
+
+ Unlike get(), this doesn't mutate the internal state. But be aware
+ that it doesn't mean peek() is thread safe.
+ """
+ try:
+ node = self._cache[k]
+ return node.value
+ except KeyError:
+ if default is _notset:
+ raise
+ return default
+
def clear(self):
n = self._head
while n.key is not _notset:
--- a/tests/test-lrucachedict.py Wed Oct 31 22:05:45 2018 +0900
+++ b/tests/test-lrucachedict.py Wed Oct 31 22:29:05 2018 +0900
@@ -79,6 +79,21 @@
self.assertEqual(d.get('a'), 'va')
self.assertEqual(list(d), ['a', 'c', 'b'])
+ def testpeek(self):
+ d = util.lrucachedict(4)
+ d['a'] = 'va'
+ d['b'] = 'vb'
+ d['c'] = 'vc'
+
+ with self.assertRaises(KeyError):
+ d.peek('missing')
+ self.assertEqual(list(d), ['c', 'b', 'a'])
+ self.assertIsNone(d.peek('missing', None))
+ self.assertEqual(list(d), ['c', 'b', 'a'])
+
+ self.assertEqual(d.peek('a'), 'va')
+ self.assertEqual(list(d), ['c', 'b', 'a'])
+
def testcopypartial(self):
d = util.lrucachedict(4)
d.insert('a', 'va', cost=4)