[PATCH V2] py3: add "b" prefix to string literals related to module policy
Augie Fackler
raf at durin42.com
Sun Mar 12 15:40:28 EDT 2017
On Mon, Mar 13, 2017 at 04:13:55AM +0900, FUJIWARA Katsunori wrote:
> # HG changeset patch
> # User FUJIWARA Katsunori <foozy at lares.dti.ne.jp>
> # Date 1489345596 -32400
> # Mon Mar 13 04:06:36 2017 +0900
> # Node ID 2526bffdc7f01acb4e0f77865fce0ffab675250f
> # Parent 62939e0148f170b67ca8c7374f36c413b67fd387
> py3: add "b" prefix to string literals related to module policy
Queued, thanks.
>
> String literals without explicit prefix in __init__.py and policy.py
> are treated as unicode object on Python3, because these modules are
> loaded before setup of our specific code transformation (the later
> module is imported at the beginning of __init__.py).
>
> BTW, "modulepolicy" in __init__.py is initialized by "policy.policy".
>
> This causes issues below;
>
> - checking "policy" value in other modules causes unintentional result
>
> For example, "b'py' not in (u'c', u'py')" returns True
> unintentionally on Python3.
>
> - writing "policy" out fails at conversion from unicode to bytes
>
> 62939e0148f1 fixed this issue for default code path, but "policy"
> can be overridden by HGMODULEPOLICY environment variable (it should
> be rare case for developer using Python3, though).
>
> This patch does:
>
> - add "b" prefix to all string literals, which are related to module
> policy, in modules above.
>
> - check existence of HGMODULEPOLICY, and overwrite "policy" only if
> it exists
>
> For simplicity, this patch omits checking "supports_bytes_environ",
> switching os.environ/os.environb, and so on (Yuya agreed this in
> personal talking)
>
> diff --git a/mercurial/__init__.py b/mercurial/__init__.py
> --- a/mercurial/__init__.py
> +++ b/mercurial/__init__.py
> @@ -68,7 +68,7 @@ class hgimporter(object):
> # indicates the type of module. So just assume what we found
> # is OK (even though it could be a pure Python module).
> except ImportError:
> - if modulepolicy == 'c':
> + if modulepolicy == b'c':
> raise
> zl = ziploader('mercurial', 'pure')
> mod = zl.load_module(name)
> @@ -106,7 +106,7 @@ class hgimporter(object):
> 'version should exist' % name)
>
> except ImportError:
> - if modulepolicy == 'c':
> + if modulepolicy == b'c':
> raise
>
> # Could not load the C extension and pure Python is allowed. So
> diff --git a/mercurial/policy.py b/mercurial/policy.py
> --- a/mercurial/policy.py
> +++ b/mercurial/policy.py
> @@ -19,9 +19,9 @@ import sys
> # py - only load pure Python modules
> #
> # By default, require the C extensions for performance reasons.
> -policy = 'c'
> -policynoc = ('cffi', 'cffi-allow', 'py')
> -policynocffi = ('c', 'py')
> +policy = b'c'
> +policynoc = (b'cffi', b'cffi-allow', b'py')
> +policynocffi = (b'c', b'py')
>
> try:
> from . import __modulepolicy__
> @@ -42,4 +42,8 @@ if sys.version_info[0] >= 3:
> policy = b'py'
>
> # Environment variable can always force settings.
> -policy = os.environ.get('HGMODULEPOLICY', policy)
> +if sys.version_info[0] >= 3:
> + if 'HGMODULEPOLICY' in os.environ:
> + policy = os.environ['HGMODULEPOLICY'].encode('utf-8')
> +else:
> + policy = os.environ.get('HGMODULEPOLICY', policy)
> diff --git a/tests/test-check-code.t b/tests/test-check-code.t
> --- a/tests/test-check-code.t
> +++ b/tests/test-check-code.t
> @@ -27,8 +27,14 @@ New errors are not allowed. Warnings are
> use encoding.environ instead (py3)
> Skipping mercurial/httpclient/__init__.py it has no-che?k-code (glob)
> Skipping mercurial/httpclient/_readers.py it has no-che?k-code (glob)
> - mercurial/policy.py:45:
> - > policy = os.environ.get('HGMODULEPOLICY', policy)
> + mercurial/policy.py:46:
> + > if 'HGMODULEPOLICY' in os.environ:
> + use encoding.environ instead (py3)
> + mercurial/policy.py:47:
> + > policy = os.environ['HGMODULEPOLICY'].encode('utf-8')
> + use encoding.environ instead (py3)
> + mercurial/policy.py:49:
> + > policy = os.environ.get('HGMODULEPOLICY', policy)
> use encoding.environ instead (py3)
> Skipping mercurial/statprof.py it has no-che?k-code (glob)
> [1]
> diff --git a/tests/test-check-py3-commands.t b/tests/test-check-py3-commands.t
> --- a/tests/test-check-py3-commands.t
> +++ b/tests/test-check-py3-commands.t
> @@ -23,3 +23,10 @@ The full traceback is hidden to have a s
> $ $PYTHON3 `which hg` version | tail -1
> *** failed to import extension babar from imaginary_elephant: *: 'imaginary_elephant' (glob)
> warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
> +
> +Test bytes-ness of policy.policy with HGMODULEPOLICY
> +
> + $ HGMODULEPOLICY=py
> + $ export HGMODULEPOLICY
> + $ $PYTHON3 `which hg` debuginstall 2>&1 2>&1 | tail -1
> + no problems detected
> _______________________________________________
> Mercurial-devel mailing list
> Mercurial-devel at mercurial-scm.org
> https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel
More information about the Mercurial-devel
mailing list