Patchwork [8,of,8] py3: use unicode literals in mdiff.py

login
register
mail settings
Submitter Pulkit Goyal
Date Aug. 7, 2016, 7:54 p.m.
Message ID <f7cb9b3eeac9c22dc76f.1470599681@waste.org>
Download mbox | patch
Permalink /patch/16187/
State Not Applicable
Headers show

Comments

Pulkit Goyal - Aug. 7, 2016, 7:54 p.m.
# HG changeset patch
# User Pulkit Goyal <7895pulkit@gmail.com>
# Date 1470168805 -19800
#      Wed Aug 03 01:43:25 2016 +0530
# Node ID f7cb9b3eeac9c22dc76f6c5976fda488ba992be2
# Parent  a77a7f6e8bfc90901d829257a782ff11e2bae0f7
py3: use unicode literals in mdiff.py

This is a near-sighted solution to unbust mdiff.py importing on Python
3. The import was previously failing due to a setattr() using a
bytes instance on the attribute name.

The behavior of str vs bytes keys is kinda wonky in Python.
In Python 2, key names are automagically converted from 1 type
to the other. e.g. if you set a unicode key then set a str key of
essentially the same value, the original key gets updated. But
on Python 3 there can be different keys for "identical" str and
bytes values! That's why this patch is short-signed: there will
certainly be consumers looking at the bytes keys of this dict.

But for now it unblocks importing of this module. And behavior
is identical in Python 2, so it should be safe.
Pulkit Goyal - Aug. 7, 2016, 7:58 p.m.
Kindly ignore this series, I tried hg push
https://selenic.com/repo/hg-push -r some_changest, and the whole
series got pushed :(

On Mon, Aug 8, 2016 at 1:24 AM, Pulkit Goyal <7895pulkit@gmail.com> wrote:
> # HG changeset patch
> # User Pulkit Goyal <7895pulkit@gmail.com>
> # Date 1470168805 -19800
> #      Wed Aug 03 01:43:25 2016 +0530
> # Node ID f7cb9b3eeac9c22dc76f6c5976fda488ba992be2
> # Parent  a77a7f6e8bfc90901d829257a782ff11e2bae0f7
> py3: use unicode literals in mdiff.py
>
> This is a near-sighted solution to unbust mdiff.py importing on Python
> 3. The import was previously failing due to a setattr() using a
> bytes instance on the attribute name.
>
> The behavior of str vs bytes keys is kinda wonky in Python.
> In Python 2, key names are automagically converted from 1 type
> to the other. e.g. if you set a unicode key then set a str key of
> essentially the same value, the original key gets updated. But
> on Python 3 there can be different keys for "identical" str and
> bytes values! That's why this patch is short-signed: there will
> certainly be consumers looking at the bytes keys of this dict.
>
> But for now it unblocks importing of this module. And behavior
> is identical in Python 2, so it should be safe.
>
> diff --git a/mercurial/mdiff.py b/mercurial/mdiff.py
> --- a/mercurial/mdiff.py
> +++ b/mercurial/mdiff.py
> @@ -45,17 +45,17 @@
>      '''
>
>      defaults = {
> -        'context': 3,
> -        'text': False,
> -        'showfunc': False,
> -        'git': False,
> -        'nodates': False,
> -        'nobinary': False,
> -        'noprefix': False,
> -        'ignorews': False,
> -        'ignorewsamount': False,
> -        'ignoreblanklines': False,
> -        'upgrade': False,
> +        u'context': 3,
> +        u'text': False,
> +        u'showfunc': False,
> +        u'git': False,
> +        u'nodates': False,
> +        u'nobinary': False,
> +        u'noprefix': False,
> +        u'ignorews': False,
> +        u'ignorewsamount': False,
> +        u'ignoreblanklines': False,
> +        u'upgrade': False,
>          }
>
>      def __init__(self, **opts):
> diff --git a/tests/test-check-py3-compat.t b/tests/test-check-py3-compat.t
> --- a/tests/test-check-py3-compat.t
> +++ b/tests/test-check-py3-compat.t
> @@ -161,7 +161,7 @@
>    mercurial/ui.py: error importing module: <TypeError> a bytes-like object is required, not 'str' (line *) (glob)
>    mercurial/unionrepo.py: error importing module: <TypeError> a bytes-like object is required, not 'str' (line *) (glob)
>    mercurial/url.py: error importing module: <TypeError> a bytes-like object is required, not 'str' (line *) (glob)
> -  mercurial/verify.py: error importing: <TypeError> attribute name must be string, not 'bytes' (error at mdiff.py:*) (glob)
> +  mercurial/verify.py: error importing module: <TypeError> a bytes-like object is required, not 'str' (line *) (glob)
>    mercurial/win32.py: error importing module: <ImportError> No module named 'msvcrt' (line *) (glob)
>    mercurial/windows.py: error importing module: <ImportError> No module named '_winreg' (line *) (glob)
>    mercurial/wireproto.py: error importing module: <SyntaxError> invalid syntax (bundle2.py, line *) (line *) (glob)
> _______________________________________________
> Mercurial-devel mailing list
> Mercurial-devel@mercurial-scm.org
> https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel

Patch

diff --git a/mercurial/mdiff.py b/mercurial/mdiff.py
--- a/mercurial/mdiff.py
+++ b/mercurial/mdiff.py
@@ -45,17 +45,17 @@ 
     '''
 
     defaults = {
-        'context': 3,
-        'text': False,
-        'showfunc': False,
-        'git': False,
-        'nodates': False,
-        'nobinary': False,
-        'noprefix': False,
-        'ignorews': False,
-        'ignorewsamount': False,
-        'ignoreblanklines': False,
-        'upgrade': False,
+        u'context': 3,
+        u'text': False,
+        u'showfunc': False,
+        u'git': False,
+        u'nodates': False,
+        u'nobinary': False,
+        u'noprefix': False,
+        u'ignorews': False,
+        u'ignorewsamount': False,
+        u'ignoreblanklines': False,
+        u'upgrade': False,
         }
 
     def __init__(self, **opts):
diff --git a/tests/test-check-py3-compat.t b/tests/test-check-py3-compat.t
--- a/tests/test-check-py3-compat.t
+++ b/tests/test-check-py3-compat.t
@@ -161,7 +161,7 @@ 
   mercurial/ui.py: error importing module: <TypeError> a bytes-like object is required, not 'str' (line *) (glob)
   mercurial/unionrepo.py: error importing module: <TypeError> a bytes-like object is required, not 'str' (line *) (glob)
   mercurial/url.py: error importing module: <TypeError> a bytes-like object is required, not 'str' (line *) (glob)
-  mercurial/verify.py: error importing: <TypeError> attribute name must be string, not 'bytes' (error at mdiff.py:*) (glob)
+  mercurial/verify.py: error importing module: <TypeError> a bytes-like object is required, not 'str' (line *) (glob)
   mercurial/win32.py: error importing module: <ImportError> No module named 'msvcrt' (line *) (glob)
   mercurial/windows.py: error importing module: <ImportError> No module named '_winreg' (line *) (glob)
   mercurial/wireproto.py: error importing module: <SyntaxError> invalid syntax (bundle2.py, line *) (line *) (glob)