util: make sortdict.keys() return a copy stable
authorMartin von Zweigbergk <martinvonz@google.com>
Mon, 30 Jan 2017 22:58:56 -0800
branchstable
changeset 30854 0126e422450e
parent 30853 312b861924c8
child 30855 72c36a2be2d6
util: make sortdict.keys() return a copy dict.keys() is documented to return a copy, so it's surprising that sortdict.keys() did not. I noticed this because we have an extension that calls readlocaltags(). That method tries to remove any tags that point to non-existent revisions (most likely stripped). However, since it's unintentionally working on the instance it's modifying, it sometimes fails to remove tags when there are multiple bad tags in a row. This was not caught because localrepo.tags() does an additional layer of filtering. sortdict is also used in other places, but I have not checked whether its keys() and/or __delitem__() methods are used there.
mercurial/util.py
--- a/mercurial/util.py	Mon Jan 30 22:50:20 2017 +0900
+++ b/mercurial/util.py	Mon Jan 30 22:58:56 2017 -0800
@@ -550,7 +550,7 @@
         except ValueError:
             pass
     def keys(self):
-        return self._list
+        return self._list[:]
     def iterkeys(self):
         return self._list.__iter__()
     def iteritems(self):