pyoxidizer: produce working Python 3 Windows installers (
issue6366)
While we've had code to produce Python 3 Windows installers with
PyOxidizer, we haven't been advertising them on the web site due to
a bug in making TLS connections and issues around resource handling.
This commit upgrades our PyOxidizer install and configuration to
use a recent Git commit of PyOxidizer. This new version of PyOxidizer
contains a *ton* of changes, improvements, and bug fixes. Notably,
Windows shared distributions now mostly "just work" and the TLS bug
and random problems with Python extension modules in the standard
library go away. And Python has been upgraded from 3.7 to 3.8.6.
The price we pay for this upgrade is a ton of backwards incompatible
changes to Starlark.
I applied this commit (the overall series actually) on stable to
produce Windows installers for Mercurial 5.5.2, which I published
shortly before submitting this commit for review.
In order to get the stable branch working, I decided to take a
less aggressive approach to Python resource management. Previously,
we were attempting to load all Python modules from memory and were
performing some hacks to copy Mercurial's non-module resources
into additional directories in Starlark. This commit implements
a resource callback function in Starlark (a new feature since
PyOxidizer 0.7) to dynamically assign standard library resources
to in-memory loading and all other resources to filesystem loading.
This means that Mercurial's files and all the other packages we ship
in the Windows installers (e.g. certifi and pygments) are loaded
from the filesystem instead of from memory. This avoids issues
due to lack of __file__ and enables us to ship a working Python
3 installer on Windows.
The end state of the install layout after this patch is not
ideal for @: we still copy resource files like templates and
help text to directories next to the hg.exe executable. There
is code in @ to use importlib.resources to load these files and
we could likely remove these copies once this lands on @. But for
now, the install layout mimics what we've shipped for seemingly
forever and is backwards compatible. It allows us to achieve the
milestone of working Python 3 Windows installers and gets us a
giant step closer to deleting Python 2.
Differential Revision: https://phab.mercurial-scm.org/D9148
hgrc settings command line options final result
quiet verbo debug quiet verbo debug quiet verbo debug
0 False False False False False False -> False False False
1 True False False False False False -> True False False
2 False True False False False False -> False True False
3 True True False False False False -> False False False
4 False False True False False False -> False True True
5 True False True False False False -> False True True
6 False True True False False False -> False True True
7 True True True False False False -> False True True
8 False False False True False False -> True False False
9 True False False True False False -> True False False
10 False True False True False False -> True False False
11 True True False True False False -> True False False
12 False False True True False False -> True False False
13 True False True True False False -> True False False
14 False True True True False False -> True False False
15 True True True True False False -> True False False
16 False False False False True False -> False True False
17 True False False False True False -> False True False
18 False True False False True False -> False True False
19 True True False False True False -> False True False
20 False False True False True False -> False True False
21 True False True False True False -> False True False
22 False True True False True False -> False True False
23 True True True False True False -> False True False
24 False False False True True False -> False False False
25 True False False True True False -> False False False
26 False True False True True False -> False False False
27 True True False True True False -> False False False
28 False False True True True False -> False False False
29 True False True True True False -> False False False
30 False True True True True False -> False False False
31 True True True True True False -> False False False
32 False False False False False True -> False True True
33 True False False False False True -> False True True
34 False True False False False True -> False True True
35 True True False False False True -> False True True
36 False False True False False True -> False True True
37 True False True False False True -> False True True
38 False True True False False True -> False True True
39 True True True False False True -> False True True
40 False False False True False True -> False True True
41 True False False True False True -> False True True
42 False True False True False True -> False True True
43 True True False True False True -> False True True
44 False False True True False True -> False True True
45 True False True True False True -> False True True
46 False True True True False True -> False True True
47 True True True True False True -> False True True
48 False False False False True True -> False True True
49 True False False False True True -> False True True
50 False True False False True True -> False True True
51 True True False False True True -> False True True
52 False False True False True True -> False True True
53 True False True False True True -> False True True
54 False True True False True True -> False True True
55 True True True False True True -> False True True
56 False False False True True True -> False True True
57 True False False True True True -> False True True
58 False True False True True True -> False True True
59 True True False True True True -> False True True
60 False False True True True True -> False True True
61 True False True True True True -> False True True
62 False True True True True True -> False True True
63 True True True True True True -> False True True