make: switch the PYTHON default to `py.exe -3` on Windows
Python3 _is_ named `python.exe` on Windows, but that isn't necessarily on PATH
when installing from python.org. I do happen to have a python.exe on PATH in
`$LOCALAPPDATA/Microsoft/WindowsApps`, but it appears to be 0 bytes (likely
because of permission issues), and doesn't run:
$ python -V
- Cannot open
Pulkit hit the same error as I did though, so it isn't just my system:
$ make -C . local
make: Entering directory `/home/Dell/repos/hg-committed`
python setup.py \
build_py -c -d . \
build_ext -i \
build_hgexe -i \
build_mo
- Cannot openmake: *** [local] Error 1
The `py.exe` dispatcher lives in the Windows directory (so it is on PATH), looks
up the python.org installation, and invokes that interpreter directly. I get a
warning with py39, but if it's our issue, it was an existing one:
$ make -C .. local
make: Entering directory `/c/Users/Matt/hg'
py -3 setup.py \
build_py -c -d . \
build_ext -i \
build_hgexe -i \
build_mo
C:\Users\Matt\AppData\Local\Programs\Python\Python39\lib\site-packages\setuptools\distutils_patch.py:25:
UserWarning: Distutils was imported before Setuptools. This usage is discouraged and may
exhibit undesirable behaviors or errors. Please use Setuptools' objects directly or at least
import Setuptools first.
warnings.warn(
The end result is a py3 based hg.exe that annoyingly won't run because it can't
find python39.dll. It will run tests (the ones without the `python3` shbang
line anyway), because the test runner adjusts PATH to include the python running
it.
Differential Revision: https://phab.mercurial-scm.org/D9361
#require no-msys # MSYS will translate web paths as if they were file paths
This tests if CGI files from after d0db3462d568 but
before d74fc8dec2b4 still work.
$ hg init test
$ cat >hgweb.cgi <<HGWEB
> #!$PYTHON
> #
> # An example CGI script to use hgweb, edit as necessary
>
> import cgitb
> cgitb.enable()
>
> from mercurial import demandimport; demandimport.enable()
> from mercurial.hgweb import hgweb
> from mercurial.hgweb import wsgicgi
> from mercurial.hgweb.request import wsgiapplication
>
> def make_web_app():
> return hgweb(b"test", b"Empty test repository")
>
> wsgicgi.launch(wsgiapplication(make_web_app))
> HGWEB
$ chmod 755 hgweb.cgi
$ cat >hgweb.config <<HGWEBDIRCONF
> [paths]
> test = test
> HGWEBDIRCONF
$ cat >hgwebdir.cgi <<HGWEBDIR
> #!$PYTHON
> #
> # An example CGI script to export multiple hgweb repos, edit as necessary
>
> import cgitb
> cgitb.enable()
>
> from mercurial import demandimport; demandimport.enable()
> from mercurial.hgweb import hgwebdir
> from mercurial.hgweb import wsgicgi
> from mercurial.hgweb.request import wsgiapplication
>
> def make_web_app():
> return hgwebdir(b"hgweb.config")
>
> wsgicgi.launch(wsgiapplication(make_web_app))
> HGWEBDIR
$ chmod 755 hgwebdir.cgi
$ . "$TESTDIR/cgienv"
$ "$PYTHON" hgweb.cgi > page1
$ "$PYTHON" hgwebdir.cgi > page2
$ PATH_INFO="/test/"
$ PATH_TRANSLATED="/var/something/test.cgi"
$ REQUEST_URI="/test/test/"
$ SCRIPT_URI="http://hg.omnifarious.org/test/test/"
$ SCRIPT_URL="/test/test/"
$ "$PYTHON" hgwebdir.cgi > page3
$ grep -i error page1 page2 page3
[1]