run-tests: stop ignoring venv-installed packages
This will allow test dependencies to be installed within a venv, instead of
tampering with sys/user sites. One thing to note here is that the `VIRTUAL_ENV`
path takes precedence over system-site, unlike when run directly with an
activated `venv`. For example, `sys.path` as viewed from a feature test in
`hghave.py`, when running `hghave vcr` directly with an activated `venv`:
sys.path: [
'/home/jenkins/hg-committed/tests',
'/usr/lib/python38.zip',
'/usr/lib/python3.8',
'/usr/lib/python3.8/lib-dynload',
'/home/jenkins/test_venv/lib/python3.8/site-packages'
]
vs `sys.path` from the same feature test, when run by `run-tests.py` with this
change:
sys.path: [
'/home/jenkins/hg-committed/tests',
'/home/jenkins/hg-committed',
'/home/jenkins/hg-committed/tests',
'/home/jenkins/test_venv/lib/python3.8/site-packages',
'/usr/lib/python38.zip',
'/usr/lib/python3.8',
'/usr/lib/python3.8/lib-dynload',
'/home/jenkins/.local/lib/python3.8/site-packages',
'/usr/local/lib/python3.8/dist-packages',
'/usr/lib/python3/dist-packages'
]
# logexceptions.py - Write files containing info about Mercurial exceptions
#
# Copyright 2017 Olivia Mackall <olivia@selenic.com>
#
# This software may be used and distributed according to the terms of the
# GNU General Public License version 2 or any later version.
import inspect
import os
import sys
import traceback
import uuid
from mercurial import (
dispatch,
extensions,
)
def handleexception(orig, ui):
res = orig(ui)
if not ui.environ.get(b'HGEXCEPTIONSDIR'):
return res
dest = os.path.join(
ui.environ[b'HGEXCEPTIONSDIR'], str(uuid.uuid4()).encode('ascii')
)
exc_type, exc_value, exc_tb = sys.exc_info()
stack = []
tb = exc_tb
while tb:
stack.append(tb)
tb = tb.tb_next
stack.reverse()
hgframe = 'unknown'
hgline = 'unknown'
# Find the first Mercurial frame in the stack.
for tb in stack:
mod = inspect.getmodule(tb)
if not mod.__name__.startswith(('hg', 'mercurial')):
continue
frame = tb.tb_frame
try:
with open(inspect.getsourcefile(tb), 'r') as fh:
hgline = fh.readlines()[frame.f_lineno - 1].strip()
except (IndexError, OSError):
pass
hgframe = '%s:%d' % (frame.f_code.co_filename, frame.f_lineno)
break
primary = traceback.extract_tb(exc_tb)[-1]
primaryframe = '%s:%d' % (primary.filename, primary.lineno)
with open(dest, 'wb') as fh:
parts = [
str(exc_value),
primaryframe,
hgframe,
hgline,
ui.environ[b'TESTNAME'].decode('utf-8', 'replace'),
]
fh.write(b'\0'.join(p.encode('utf-8', 'replace') for p in parts))
def extsetup(ui):
extensions.wrapfunction(dispatch, 'handlecommandexception', handleexception)