util: fix sortdict.update() to call __setitem__() on PyPy (issue5639) stable
authorYuya Nishihara <yuya@tcha.org>
Wed, 02 Aug 2017 22:51:19 +0900
branchstable
changeset 33626 524b13fc711f
parent 33625 6788e648efcf
child 33627 c2c6a0f7408b
util: fix sortdict.update() to call __setitem__() on PyPy (issue5639) It appears that overriding __setitem__() doesn't work as documented on PyPy. Let's patch it as before bd0fd3ff9916. https://docs.python.org/2/library/collections.html#ordereddict-examples-and-recipes The issue was ui.configitems() wasn't ordered correctly, so the pull command was wrapped in different order.
mercurial/pycompat.py
mercurial/util.py
--- a/mercurial/pycompat.py	Wed Aug 02 22:58:38 2017 +0900
+++ b/mercurial/pycompat.py	Wed Aug 02 22:51:19 2017 +0900
@@ -16,6 +16,7 @@
 import sys
 
 ispy3 = (sys.version_info[0] >= 3)
+ispypy = (r'__pypy__' in sys.builtin_module_names)
 
 if not ispy3:
     import cookielib
--- a/mercurial/util.py	Wed Aug 02 22:58:38 2017 +0900
+++ b/mercurial/util.py	Wed Aug 02 22:51:19 2017 +0900
@@ -584,6 +584,14 @@
             del self[key]
         super(sortdict, self).__setitem__(key, value)
 
+    if pycompat.ispypy:
+        # __setitem__() isn't called as of PyPy 5.8.0
+        def update(self, src):
+            if isinstance(src, dict):
+                src = src.iteritems()
+            for k, v in src:
+                self[k] = v
+
 @contextlib.contextmanager
 def acceptintervention(tr=None):
     """A context manager that closes the transaction on InterventionRequired