From 99df311b778f7c98573138b24440567e0cdc75d5 Mon Sep 17 00:00:00 2001 From: "sentry[bot]" <39604003+sentry[bot]@users.noreply.github.com> Date: Thu, 5 Nov 2026 21:58:29 +0000 Subject: [PATCH] fix: ignore exceptions originating outside codecov_cli in before_send --- codecov_cli/opentelemetry.py | 24 +++++++++++++++++++ tests/test_opentelemetry.py | 45 ++++++++++++++++++++++++++++++++++++ uv.lock | 4 ++-- 3 files changed, 71 insertions(+), 2 deletions(-) create mode 100644 tests/test_opentelemetry.py diff --git a/codecov_cli/opentelemetry.py b/codecov_cli/opentelemetry.py index b902a433..5b32a53b 100644 --- a/codecov_cli/opentelemetry.py +++ b/codecov_cli/opentelemetry.py @@ -13,7 +13,31 @@ _SKIP_TAG_KEYS = {"branch", "flags", "commit_sha", "env_vars"} +def _frame_in_cli(frame): + module = frame.get("module") or "" + if module == "codecov_cli" or module.startswith("codecov_cli."): + return True + path = (frame.get("abs_path") or frame.get("filename") or "").replace("\\", "/") + return "/codecov_cli/" in path or path.startswith("codecov_cli/") + + +def _originates_in_cli(event): + """Return True if any exception stack frame comes from the codecov_cli package.""" + for exc in (event.get("exception") or {}).get("values") or []: + frames = (exc.get("stacktrace") or {}).get("frames") or [] + if any(_frame_in_cli(frame) for frame in frames): + return True + return False + + def _before_send(event, hint): + # When the CLI is invoked programmatically (e.g. via CliRunner in a script), + # sentry_sdk.init installs a process-wide excepthook. Unhandled exceptions + # raised purely by the host script, with no codecov_cli frames, are not CLI + # failures, so we don't report them as CLI crashes. + if (event.get("exception") or {}).get("values") and not _originates_in_cli(event): + return None + messages = [] if "message" in event and event.get("message") is not None: messages.append(event.get("message")) diff --git a/tests/test_opentelemetry.py b/tests/test_opentelemetry.py new file mode 100644 index 00000000..ac3393dd --- /dev/null +++ b/tests/test_opentelemetry.py @@ -0,0 +1,45 @@ +from codecov_cli.opentelemetry import _before_send + + +def _exc_event(frames, value="boom"): + return { + "exception": { + "values": [ + { + "type": "Error", + "value": value, + "stacktrace": {"frames": frames}, + } + ] + } + } + + +def test_before_send_keeps_cli_exceptions(): + event = _exc_event( + [ + {"module": "__main__", "filename": ""}, + {"module": "codecov_cli.services.upload", "filename": "upload.py"}, + ] + ) + assert _before_send(event, {}) is event + + +def test_before_send_keeps_cli_exceptions_by_path(): + event = _exc_event( + [{"abs_path": "/site-packages/codecov_cli/main.py", "filename": "main.py"}] + ) + assert _before_send(event, {}) is event + + +def test_before_send_drops_host_script_exceptions(): + event = _exc_event( + [{"module": "__main__", "filename": "", "abs_path": ""}], + value="No module named 'prevent_cli.fallbacks'", + ) + assert _before_send(event, {}) is None + + +def test_before_send_keeps_messages(): + event = {"message": "something happened"} + assert _before_send(event, {}) is event diff --git a/uv.lock b/uv.lock index 05a61ed5..840f2eb7 100644 --- a/uv.lock +++ b/uv.lock @@ -1,5 +1,5 @@ version = 1 -revision = 3 +revision = 5 requires-python = ">=3.10" [[package]] @@ -104,7 +104,7 @@ wheels = [ [[package]] name = "codecov-cli" -version = "11.3.1" +version = "11.3.2" source = { editable = "." } dependencies = [ { name = "certifi" },