changeset 40897:0c638ff69f5c

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().
author Yuya Nishihara <yuya@tcha.org>
date Wed, 31 Oct 2018 22:29:05 +0900
parents 2525faf4ecdb
children 7cda0cacbbf6
files mercurial/util.py tests/test-lrucachedict.py
diffstat 2 files changed, 29 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- 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)