Mercurial > hg
view tests/logexceptions.py @ 48850:656196c1d442
setup: drop support for Python 3.5
We talked about this on the mailing list [1] and there seemed to be
agreement that Python 3.5 is effectively dead and no longer worth
supporting.
So this commit changes our minimum version requirement to 3.6.2.
[1] https://www.mercurial-scm.org/pipermail/mercurial-devel/2022-February/147885.html
Differential Revision: https://phab.mercurial-scm.org/D12315
author | Gregory Szorc <gregory.szorc@gmail.com> |
---|---|
date | Wed, 02 Mar 2022 18:42:00 -0800 |
parents | d4ba4d51f85f |
children | 6000f5b25c9b |
line wrap: on
line source
# 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. from __future__ import absolute_import 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)