Differences between revisions 25 and 33 (spanning 8 versions)
Revision 25 as of 2017-06-21 20:04:11
Size: 3653
Editor: AaronKushner
Comment:
Revision 33 as of 2019-03-04 21:39:52
Size: 2012
Editor: PulkitGoyal
Comment:
Deletions are marked like this. Additions are marked like this.
Line 1: Line 1:
#pragma section-numbers 2
Line 5: Line 7:
This is a status page for keeping track of what needs to be done to make progress on Mercurial on Python 3. Our current aim is to support Python 3.5. This is a status page for keeping track of what needs to be done to make progress on Mercurial on Python 3. Our current aim is to support Python 3.5+.
Line 7: Line 9:
== What Works ==
`hg version`, `hg debuginstall`, `hg init`, `hg files`, `hg manifest`, `hg log`, `hg diff`, `hg export`, `hg status`, `hg summary`, `hg config`, `hg identify`, `hg update` works on Python 3 without using any out of core extensions. These won't work for you if you have out of core extensions enabled. There are certain things which don't work yet with these commands like revset, templates.
<<TableOfContents>>
Line 10: Line 11:
== Contributing == == Status ==
Line 12: Line 13:
We will be happy to review patches and speed up the work related to Python 3. Before you start there are few things related to current porting and how things work currently. Most of our efforts are to make sure have Python 2 compatibility intact while making Python 3 run. We have been testing by installing default mercurial on our system using Python 3. Following are things which don't work right now:
Line 14: Line 15:
 * We have a source transformer which does following things on Python 3.
    1. It adds b'' in front of string starting with "'" or '"' and not having any u'', r'' or b'' in front.
    2. Adds this line `from mercurial.pycompat import delattr, getattr, hasattr, setattr, xrange, open` on every python file.
    3. Converts every occurrence of `iteritems` to `items` on Python 3.
    4. Converts argument of *attr and encode, decode to unicodes by adding u''.
    5. The transformer currently works on `mercurial/, hgext/ and hgext3rd/`.
    6. The transformer code lies [[https://www.mercurial-scm.org/repo/hg/file/295625f1296b/mercurial/__init__.py#l124|here]] and you can also use transformer on your .py files by adding them in the transformer.
  * ~1% of tests fail
  * The phabricator extension
  * curses interface
  * out of core extensions
Line 22: Line 20:
 * Due to everything is unicodes by default in Python 3, and we need to rely on bytes, we have [[https://www.mercurial-scm.org/repo/hg/file/tip/mercurial/pycompat.py|pycompat.py]] which contains hacks related to various functions of `os` module on Python. If you find anything apart from this not working, definitely go ahead and edit this page and we will fix it.
Line 24: Line 22:
 * We also have `encoding.environ` which helps us using a bytes version of `os.environ` on both Python 2 and 3. We are planning to mark hg 5.0 which is scheduled for May 1 as Python 3 beta release.
Line 26: Line 24:
 * We are also adding r'' at some places to make it a raw string. If you are an extension author and want to port the extension, [[https://www.mercurial-scm.org/repo/hg-committed/file/tip/mercurial/pycompat.py||pycompat.py]] contains most of our compatibility hacks. If you need help or guidance, you can message on IRC or devel mailing list. We will be happy to help you.
Line 28: Line 26:
 * There are currently two tests which are based on Python 3 compatibility and few checks in our linter [[https://www.mercurial-scm.org/repo/hg/file/tip/tests/test-check-code.t|test-check-code.t]] to make sure new patches include things from `pycompat.py`.
Line 30: Line 27:
    1. [[https://www.mercurial-scm.org/repo/hg/file/tip/tests/test-check-py3-compat.t|test-check-py3-compat.t]] : This test was used initially to fix a lot of things, not very much helpful now.
    2. [[https://www.mercurial-scm.org/repo/hg/file/tip/tests/test-py3-commands.t|test-py3-commands.t]]: This test lists commands which actually works on Python 3. If you want an updated list anytime, the test is the best place to look for.
== Things need to be investigated ==
Line 33: Line 29:
 * Encoding issues are generally uncovered by our tests (as everything was byte string on Python 2.)  * Windows encoding changes
 https://docs.python.org/3/whatsnew/3.6.html#pep-529-change-windows-filesystem-encoding-to-utf-8
 * Lazy importer performance overhead. Our custom importer on Python 2 always returns a stub module during ``import``. Python 3's does I/O to verify the module exists then returns a lazy module that is loaded when first accessed. In addition to behavior differences, the I/O may contribute sufficient performance overhead to constitute a problem.
 * A mechanism for extensions to advertise that they are Python 3 compatible. Nearly every extension will break in Python 3. We may want a mechanism that requires extensions to self-declare that they are Python 3 compatible - possibly via special syntax in their source code or the presence of a well-named variable. It might have to be at the source level because Python 3 would need to evaluate code in order to obtain the value of a module-level variable.
Line 35: Line 34:
== How to start ==

 * You can always set up a virtual environment and run Mercurial in it, but we have a easier way around.
    1. Clone the [[https://www.mercurial-scm.org/repo/hg|main repo]] or [[https://www.mercurial-scm.org/repo/hg-committed/|committed-repo]] and say it's in folder name `hgrepo`.
    2. Have Python 3.5 installed and say you have it in variable `python3.5`.
    3. Run `hgrepo$ python3.5 hg version`. That must work, if not check that you should not have out of tree extensions enabled.
    4. Now you can run any hg command this way and test if it's working or not.

The practice we follow now is run commands which are not yet fixed and try to fix the exceptions raised. So our current approach is exception based.
----
CategoryAudit

Note:

This page is primarily intended for developers of Mercurial.

Python 3

This is a status page for keeping track of what needs to be done to make progress on Mercurial on Python 3. Our current aim is to support Python 3.5+.

1. Status

We have been testing by installing default mercurial on our system using Python 3. Following are things which don't work right now:

  • ~1% of tests fail
  • The phabricator extension
  • curses interface
  • out of core extensions

If you find anything apart from this not working, definitely go ahead and edit this page and we will fix it.

We are planning to mark hg 5.0 which is scheduled for May 1 as Python 3 beta release.

If you are an extension author and want to port the extension, https://www.mercurial-scm.org/repo/hg-committed/file/tip/mercurial/pycompat.py contains most of our compatibility hacks. If you need help or guidance, you can message on IRC or devel mailing list. We will be happy to help you.

2. Things need to be investigated

  • Windows encoding changes

    https://docs.python.org/3/whatsnew/3.6.html#pep-529-change-windows-filesystem-encoding-to-utf-8

  • Lazy importer performance overhead. Our custom importer on Python 2 always returns a stub module during import. Python 3's does I/O to verify the module exists then returns a lazy module that is loaded when first accessed. In addition to behavior differences, the I/O may contribute sufficient performance overhead to constitute a problem.

  • A mechanism for extensions to advertise that they are Python 3 compatible. Nearly every extension will break in Python 3. We may want a mechanism that requires extensions to self-declare that they are Python 3 compatible - possibly via special syntax in their source code or the presence of a well-named variable. It might have to be at the source level because Python 3 would need to evaluate code in order to obtain the value of a module-level variable.


CategoryAudit

Python3 (last edited 2023-02-19 16:08:38 by AntonShestakov)