##// END OF EJS Templates
pyoxidizer: produce working Python 3 Windows installers (issue6366)...
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

File last commit:

r43346:2372284d default
r46277:57b5452a default
Show More
hgwebdir_wsgi.py
140 lines | 4.8 KiB | text/x-python | PythonLexer
Sune Foldager
add wsgi script for Microsoft IIS with isapi-wsgi
r10572 # An example WSGI script for IIS/isapi-wsgi to export multiple hgweb repos
Sune Foldager
hgwebdir_wsgi: update script and expand help...
r28187 # Copyright 2010-2016 Sune Foldager <cyano@me.com>
Sune Foldager
add wsgi script for Microsoft IIS with isapi-wsgi
r10572 #
Martin Geisler
win32/hgwebdir_wsgi: clarify copyright license
r10578 # This software may be used and distributed according to the terms of the
# GNU General Public License version 2 or any later version.
#
Sune Foldager
add wsgi script for Microsoft IIS with isapi-wsgi
r10572 # Requirements:
Sune Foldager
hgwebdir_wsgi: update script and expand help...
r28187 # - Python 2.7, preferably 64 bit
# - Mercurial installed from source (python setup.py install) or download the
# python module installer from https://www.mercurial-scm.org/wiki/Download
# - IIS 7 or newer
Sune Foldager
add wsgi script for Microsoft IIS with isapi-wsgi
r10572 #
#
# Installation and use:
#
Sune Foldager
hgwebdir_wsgi: update script and expand help...
r28187 # - Download or clone the isapi-wsgi source and run python setup.py install.
# https://github.com/hexdump42/isapi-wsgi
#
# - Create a directory to hold the shim dll, config files etc. This can reside
# inside the standard IIS directory, C:\inetpub, or anywhere else. Copy this
# script there.
Sune Foldager
add wsgi script for Microsoft IIS with isapi-wsgi
r10572 #
# - Run this script (i.e. python hgwebdir_wsgi.py) to get a shim dll. The
# shim is identical for all scripts, so you can just copy and rename one
Sune Foldager
hgwebdir_wsgi: update script and expand help...
r28187 # from an earlier run, if you wish. The shim needs to reside in the same
# directory as this script.
#
# - Start IIS manager and create a new app pool:
# .NET CLR Version: No Managed Code
# Advanced Settings: Enable 32 Bit Applications, if using 32 bit Python.
# You can adjust the identity and maximum worker processes if you wish. This
# setup works fine with multiple worker processes.
Sune Foldager
add wsgi script for Microsoft IIS with isapi-wsgi
r10572 #
Sune Foldager
hgwebdir_wsgi: update script and expand help...
r28187 # - Create an IIS application where your hgwebdir is to be served from.
# Assign it the app pool you just created and point its physical path to the
# directory you created.
#
# - In the application, remove all handler mappings and setup a wildcard script
# handler mapping of type IsapiModule with the shim dll as its executable.
# This file MUST reside in the same directory as the shim. The easiest way
# to do all this is to close IIS manager, place a web.config file in your
# directory and start IIS manager again. The file should contain:
Sune Foldager
add wsgi script for Microsoft IIS with isapi-wsgi
r10572 #
Sune Foldager
hgwebdir_wsgi: update script and expand help...
r28187 # <?xml version="1.0" encoding="UTF-8"?>
# <configuration>
# <system.webServer>
# <handlers accessPolicy="Read, Script">
# <clear />
# <add name="hgwebdir" path="*" verb="*" modules="IsapiModule"
# scriptProcessor="C:\your\directory\_hgwebdir_wsgi.dll"
# resourceType="Unspecified" requireAccess="None"
# preCondition="bitness64" />
# </handlers>
# </system.webServer>
# </configuration>
#
# Where "bitness64" should be replaced with "bitness32" for 32 bit Python.
#
# - Edit ISAPI And CGI Restrictions on the web server (global setting). Add a
# restriction pointing to your shim dll and allow it to run.
Sune Foldager
add wsgi script for Microsoft IIS with isapi-wsgi
r10572 #
Sune Foldager
hgwebdir_wsgi: update script and expand help...
r28187 # - Create a configuration file in your directory and adjust the configuration
# variables below to match your needs. Example configuration:
#
# [web]
# style = gitweb
# push_ssl = false
# allow_push = *
# encoding = utf8
Sune Foldager
add wsgi script for Microsoft IIS with isapi-wsgi
r10572 #
Sune Foldager
hgwebdir_wsgi: update script and expand help...
r28187 # [server]
# validate = true
#
# [paths]
# repo1 = c:\your\directory\repo1
# repo2 = c:\your\directory\repo2
#
# - Restart the web server and see if things are running.
Sune Foldager
add wsgi script for Microsoft IIS with isapi-wsgi
r10572 #
Pulkit Goyal
py3: shift from __future__ import absolute import to beginning (issue5269)
r29385 from __future__ import absolute_import
Sune Foldager
add wsgi script for Microsoft IIS with isapi-wsgi
r10572 # Configuration file location
Sune Foldager
hgwebdir_wsgi: update script and expand help...
r28187 hgweb_config = r'c:\your\directory\wsgi.config'
Sune Foldager
add wsgi script for Microsoft IIS with isapi-wsgi
r10572
# Global settings for IIS path translation
Augie Fackler
formatting: blacken the codebase...
r43346 path_strip = 0 # Strip this many path elements off (when using url rewrite)
Sune Foldager
add wsgi script for Microsoft IIS with isapi-wsgi
r10572 path_prefix = 1 # This many path elements are prefixes (depends on the
Augie Fackler
formatting: blacken the codebase...
r43346 # virtual path of the IIS application).
Sune Foldager
add wsgi script for Microsoft IIS with isapi-wsgi
r10572
import sys
Sune Foldager
win32/hgwebdir_wsgi: clarify documentation and clean up script a bit
r10586 # Adjust python path if this is not a system-wide install
Augie Fackler
formatting: blacken the codebase...
r43346 # sys.path.insert(0, r'C:\your\custom\hg\build\lib.win32-2.7')
Sune Foldager
win32/hgwebdir_wsgi: clarify documentation and clean up script a bit
r10586
# Enable tracing. Run 'python -m win32traceutil' to debug
Augie Fackler
win32/hgwebdir_wsgi: use getattr instead of hasattr
r14974 if getattr(sys, 'isapidllhandle', None) is not None:
Sune Foldager
win32/hgwebdir_wsgi: clarify documentation and clean up script a bit
r10586 import win32traceutil
Augie Fackler
formatting: blacken the codebase...
r43346
win32traceutil.SetupForPrint # silence unused import warning
Sune Foldager
win32/hgwebdir_wsgi: clarify documentation and clean up script a bit
r10586
Sune Foldager
add wsgi script for Microsoft IIS with isapi-wsgi
r10572 import isapi_wsgi
from mercurial.hgweb.hgwebdir_mod import hgwebdir
# Example tweak: Replace isapi_wsgi's handler to provide better error message
# Other stuff could also be done here, like logging errors etc.
class WsgiHandler(isapi_wsgi.IsapiWsgiHandler):
Augie Fackler
formatting: blacken the codebase...
r43346 error_status = '500 Internal Server Error' # less silly error message
Sune Foldager
add wsgi script for Microsoft IIS with isapi-wsgi
r10572
isapi_wsgi.IsapiWsgiHandler = WsgiHandler
# Only create the hgwebdir instance once
application = hgwebdir(hgweb_config)
Augie Fackler
formatting: blacken the codebase...
r43346
Sune Foldager
add wsgi script for Microsoft IIS with isapi-wsgi
r10572 def handler(environ, start_response):
# Translate IIS's weird URLs
url = environ['SCRIPT_NAME'] + environ['PATH_INFO']
paths = url[1:].split('/')[path_strip:]
script_name = '/' + '/'.join(paths[:path_prefix])
path_info = '/'.join(paths[path_prefix:])
if path_info:
path_info = '/' + path_info
environ['SCRIPT_NAME'] = script_name
environ['PATH_INFO'] = path_info
return application(environ, start_response)
Augie Fackler
formatting: blacken the codebase...
r43346
Sune Foldager
add wsgi script for Microsoft IIS with isapi-wsgi
r10572 def __ExtensionFactory__():
return isapi_wsgi.ISAPISimpleHandler(handler)
Augie Fackler
formatting: blacken the codebase...
r43346
if __name__ == '__main__':
Mads Kiilerich
cleanup: make sure we always access members of imported modules...
r22198 from isapi.install import ISAPIParameters, HandleCommandLine
Augie Fackler
formatting: blacken the codebase...
r43346
Sune Foldager
add wsgi script for Microsoft IIS with isapi-wsgi
r10572 params = ISAPIParameters()
HandleCommandLine(params)