mirror of
https://github.com/facebook/sapling.git
synced 2024-10-11 01:07:15 +03:00
9dc21f8d0b
Summary: D13853115 adds `edenscm/` to `sys.path` and code still uses `import mercurial`. That has nasty problems if both `import mercurial` and `import edenscm.mercurial` are used, because Python would think `mercurial.foo` and `edenscm.mercurial.foo` are different modules so code like `try: ... except mercurial.error.Foo: ...`, or `isinstance(x, mercurial.foo.Bar)` would fail to handle the `edenscm.mercurial` version. There are also some module-level states (ex. `extensions._extensions`) that would cause trouble if they have multiple versions in a single process. Change imports to use the `edenscm` so ideally the `mercurial` is no longer imported at all. Add checks in extensions.py to catch unexpected extensions importing modules from the old (wrong) locations when running tests. Reviewed By: phillco Differential Revision: D13868981 fbshipit-source-id: f4e2513766957fd81d85407994f7521a08e4de48
93 lines
2.5 KiB
Perl
93 lines
2.5 KiB
Perl
Tests if hgweb can run without touching sys.stdin, as is required
|
|
by the WSGI standard and strictly implemented by mod_wsgi.
|
|
|
|
$ hg init repo
|
|
$ cd repo
|
|
$ echo foo > bar
|
|
$ hg add bar
|
|
$ hg commit -m "test"
|
|
$ cat > request.py <<EOF
|
|
> from __future__ import absolute_import
|
|
> import os
|
|
> import sys
|
|
> from edenscm.mercurial import (
|
|
> dispatch,
|
|
> hg,
|
|
> ui as uimod,
|
|
> util,
|
|
> )
|
|
> ui = uimod.ui
|
|
> from edenscm.mercurial.hgweb.hgweb_mod import (
|
|
> hgweb,
|
|
> )
|
|
> stringio = util.stringio
|
|
>
|
|
> class FileLike(object):
|
|
> def __init__(self, real):
|
|
> self.real = real
|
|
> def fileno(self):
|
|
> print >> sys.__stdout__, 'FILENO'
|
|
> return self.real.fileno()
|
|
> def read(self):
|
|
> print >> sys.__stdout__, 'READ'
|
|
> return self.real.read()
|
|
> def readline(self):
|
|
> print >> sys.__stdout__, 'READLINE'
|
|
> return self.real.readline()
|
|
>
|
|
> sys.stdin = FileLike(sys.stdin)
|
|
> errors = stringio()
|
|
> input = stringio()
|
|
> output = stringio()
|
|
>
|
|
> def startrsp(status, headers):
|
|
> print('---- STATUS')
|
|
> print(status)
|
|
> print('---- HEADERS')
|
|
> print([i for i in headers if i[0] != 'ETag'])
|
|
> print('---- DATA')
|
|
> return output.write
|
|
>
|
|
> env = {
|
|
> 'wsgi.version': (1, 0),
|
|
> 'wsgi.url_scheme': 'http',
|
|
> 'wsgi.errors': errors,
|
|
> 'wsgi.input': input,
|
|
> 'wsgi.multithread': False,
|
|
> 'wsgi.multiprocess': False,
|
|
> 'wsgi.run_once': False,
|
|
> 'REQUEST_METHOD': 'GET',
|
|
> 'SCRIPT_NAME': '',
|
|
> 'PATH_INFO': '',
|
|
> 'QUERY_STRING': '',
|
|
> 'SERVER_NAME': '$LOCALIP',
|
|
> 'SERVER_PORT': os.environ['HGPORT'],
|
|
> 'SERVER_PROTOCOL': 'HTTP/1.0'
|
|
> }
|
|
>
|
|
> i = hgweb('.')
|
|
> for c in i(env, startrsp):
|
|
> pass
|
|
> print('---- ERRORS')
|
|
> print(errors.getvalue())
|
|
> print('---- OS.ENVIRON wsgi variables')
|
|
> print(sorted([x for x in os.environ if x.startswith('wsgi')]))
|
|
> print('---- request.ENVIRON wsgi variables')
|
|
> with i._obtainrepo() as repo:
|
|
> print(sorted([x for x in repo.ui.environ if x.startswith('wsgi')]))
|
|
> EOF
|
|
$ $PYTHON request.py
|
|
---- STATUS
|
|
200 Script output follows
|
|
---- HEADERS
|
|
[('Content-Type', 'text/html; charset=ascii')]
|
|
---- DATA
|
|
---- ERRORS
|
|
|
|
---- OS.ENVIRON wsgi variables
|
|
[]
|
|
---- request.ENVIRON wsgi variables
|
|
['wsgi.errors', 'wsgi.input', 'wsgi.multiprocess', 'wsgi.multithread', 'wsgi.run_once', 'wsgi.url_scheme', 'wsgi.version']
|
|
|
|
$ cd ..
|