mirror of
https://github.com/facebook/sapling.git
synced 2024-12-29 08:02:24 +03:00
ab3a7cb21f
Summary: In preparation for merging fb-mercurial sources to the Eden repository, move everything from the top-level directory into an `eden/scm` subdirectory.
68 lines
1.7 KiB
Python
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)
|