sapling/eden/scm/tests/logexceptions.py
Adam Simpkins ab3a7cb21f Move fb-mercurial sources into an eden/scm subdirectory.
Summary:
In preparation for merging fb-mercurial sources to the Eden repository,
move everything from the top-level directory into an `eden/scm`
subdirectory.
2019-11-13 16:04:48 -08:00

68 lines
1.7 KiB
Python

# logexceptions.py - Write files containing info about Mercurial exceptions
#
# Copyright 2017 Matt Mackall <mpm@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 edenscm.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]
fh.write(b"\0".join(p.encode("utf-8", "replace") for p in parts))
def extsetup(ui):
extensions.wrapfunction(dispatch, "handlecommandexception", handleexception)