Patchwork D3504: cborutil: port to Python 3

login
register
mail settings
Submitter phabricator
Date May 8, 2018, 7:27 p.m.
Message ID <differential-rev-PHID-DREV-myanl3fs7nzfisk7gwwa-req@phab.mercurial-scm.org>
Download mbox | patch
Permalink /patch/31404/
State Superseded
Headers show

Comments

phabricator - May 8, 2018, 7:27 p.m.
durin42 created this revision.
Herald added a subscriber: mercurial-devel.
Herald added a reviewer: hg-reviewers.

REVISION SUMMARY
  The only problem lurking in here was sorts of mismatched types. The
  sorts are only for output stability in our tests (sigh), so we just
  build a phony sort key using the __name__ of types so that we only
  compare like types against each other. By pure luck, my awful sort key
  matches the behavior we get "for free" in Python 2, so no test output
  changes.

REPOSITORY
  rHG Mercurial

REVISION DETAIL
  https://phab.mercurial-scm.org/D3504

AFFECTED FILES
  mercurial/utils/cborutil.py

CHANGE DETAILS




To: durin42, #hg-reviewers
Cc: mercurial-devel
phabricator - May 8, 2018, 8:18 p.m.
indygreg accepted this revision.
indygreg added a comment.
This revision is now accepted and ready to land.


  Ugh.

REPOSITORY
  rHG Mercurial

REVISION DETAIL
  https://phab.mercurial-scm.org/D3504

To: durin42, #hg-reviewers, indygreg
Cc: indygreg, mercurial-devel

Patch

diff --git a/mercurial/utils/cborutil.py b/mercurial/utils/cborutil.py
--- a/mercurial/utils/cborutil.py
+++ b/mercurial/utils/cborutil.py
@@ -140,12 +140,15 @@ 
 
     yield BREAK
 
+def _mixedtypesortkey(v):
+    return type(v).__name__, v
+
 def streamencodeset(s):
     # https://www.iana.org/assignments/cbor-tags/cbor-tags.xhtml defines
     # semantic tag 258 for finite sets.
     yield encodelength(MAJOR_TYPE_SEMANTIC, 258)
 
-    for chunk in streamencodearray(sorted(s)):
+    for chunk in streamencodearray(sorted(s, key=_mixedtypesortkey)):
         yield chunk
 
 def streamencodemap(d):
@@ -155,7 +158,8 @@ 
     """
     yield encodelength(MAJOR_TYPE_MAP, len(d))
 
-    for key, value in sorted(d.iteritems()):
+    for key, value in sorted(d.iteritems(),
+                             key=lambda x: _mixedtypesortkey(x[0])):
         for chunk in streamencode(key):
             yield chunk
         for chunk in streamencode(value):