Re: [PATCH 6 of 8] util: add method to peek item in lrucachedict

2018-12-10 Thread Pulkit Goyal
On Thu, Dec 6, 2018 at 3:54 PM Yuya Nishihara  wrote:

> # HG changeset patch
> # User Yuya Nishihara 
> # Date 1540992545 -32400
> #  Wed Oct 31 22:29:05 2018 +0900
> # Node ID 2d23efc7274a923baffe9d0dc46709d651c468b4
> # Parent  5f4354d1aa370a028eee8bcc6de245b1212cf35c
> 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().


Queued 6,7 too. Many thanks!
___
Mercurial-devel mailing list
Mercurial-devel@mercurial-scm.org
https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel


[PATCH 6 of 8] util: add method to peek item in lrucachedict

2018-12-06 Thread Yuya Nishihara
# HG changeset patch
# User Yuya Nishihara 
# Date 1540992545 -32400
#  Wed Oct 31 22:29:05 2018 +0900
# Node ID 2d23efc7274a923baffe9d0dc46709d651c468b4
# Parent  5f4354d1aa370a028eee8bcc6de245b1212cf35c
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().

diff --git a/mercurial/util.py b/mercurial/util.py
--- a/mercurial/util.py
+++ b/mercurial/util.py
@@ -1337,6 +1337,20 @@ class lrucachedict(object):
 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:
diff --git a/tests/test-lrucachedict.py b/tests/test-lrucachedict.py
--- a/tests/test-lrucachedict.py
+++ b/tests/test-lrucachedict.py
@@ -79,6 +79,21 @@ class testlrucachedict(unittest.TestCase
 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)
___
Mercurial-devel mailing list
Mercurial-devel@mercurial-scm.org
https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel