From 99501401b87a450b1512e1edc8dc47d18754522d Mon Sep 17 00:00:00 2001 From: Stan Ulbrych Date: Mon, 6 Apr 2026 14:17:51 +0100 Subject: [PATCH] Embed links to issues in `Triage:` messages --- .../testcase-detail/testcase-detail.html | 2 +- src/clusterfuzz/_internal/cron/triage.py | 28 ++++++++++--------- .../appengine/handlers/cron/triage_test.py | 15 +++++++--- 3 files changed, 27 insertions(+), 18 deletions(-) diff --git a/src/appengine/private/components/testcase-detail/testcase-detail.html b/src/appengine/private/components/testcase-detail/testcase-detail.html index e2c7d4a995e..7bec8634d25 100644 --- a/src/appengine/private/components/testcase-detail/testcase-detail.html +++ b/src/appengine/private/components/testcase-detail/testcase-detail.html @@ -463,7 +463,7 @@ Triage: - [[info.metadata.triage_message]] + diff --git a/src/clusterfuzz/_internal/cron/triage.py b/src/clusterfuzz/_internal/cron/triage.py index 5b55e80ea58..6a0572c76f6 100644 --- a/src/clusterfuzz/_internal/cron/triage.py +++ b/src/clusterfuzz/_internal/cron/triage.py @@ -259,21 +259,27 @@ def _check_and_update_similar_bug(testcase, issue_tracker): if not issue: continue + similar_testcase_id = similar_testcase.key.id() + testcase_url = data_handler.TESTCASE_REPORT_URL.format( + domain=data_handler.get_domain(), testcase_id=similar_testcase_id) + issue_url = issue_tracker.issue_url(issue.id) + testcase_link = f'{similar_testcase_id}' + issue_link = f'{issue.id}' + # If the reproducible issue is not verified yet, bug is still valid and # might be caused by non-availability of latest builds. In that case, # don't file a new bug yet. if similar_testcase.open and not similar_testcase.one_time_crasher_flag: _add_triage_message( testcase, 'Delaying filing a bug since similar reproducible testcase ' - f'({similar_testcase.key.id()} in issue {issue.id}) is not verified ' - 'yet.') + f'({testcase_link} in issue {issue_link}) is not verified yet.') return True # If the issue is still open, no need to file a duplicate bug. if issue.is_open: _add_triage_message( testcase, f'Skipping filing a bug since similar testcase ' - f'({similar_testcase.key.id()}) has an open issue ({issue.id}).') + f'({testcase_link}) has an open issue ({issue_link}).') return True # If the issue indicates that this crash needs to be ignored, no need to @@ -283,12 +289,9 @@ def _check_and_update_similar_bug(testcase, issue_tracker): if ignore_label in issue.labels: _add_triage_message( testcase, - ('Skipping filing a bug since similar testcase ({testcase_id}) in ' - 'issue ({issue_id}) is blacklisted with {ignore_label} label.' - ).format( - testcase_id=similar_testcase.key.id(), - issue_id=issue.id, - ignore_label=ignore_label)) + f'Skipping filing a bug since similar testcase ' + f'({testcase_link}) in issue ({issue_link}) is blacklisted with ' + f'{ignore_label} label.') return True # If this testcase is not reproducible, and a previous similar @@ -299,7 +302,7 @@ def _check_and_update_similar_bug(testcase, issue_tracker): _add_triage_message( testcase, 'Skipping filing unreproducible bug since one was already filed ' - f'({similar_testcase.key.id()} in issue {issue.id}).') + f'({testcase_link} in issue {issue_link}).') return True # If the issue is recently closed, wait certain time period to make sure @@ -308,9 +311,8 @@ def _check_and_update_similar_bug(testcase, issue_tracker): issue.closed_time, hours=data_types.MIN_ELAPSED_TIME_SINCE_FIXED)): _add_triage_message( testcase, - ('Delaying filing a bug since similar testcase ' - '({testcase_id}) in issue ({issue_id}) was just fixed.').format( - testcase_id=similar_testcase.key.id(), issue_id=issue.id)) + f'Delaying filing a bug since similar testcase ' + f'({testcase_link}) in issue ({issue_link}) was just fixed.') return True return False diff --git a/src/clusterfuzz/_internal/tests/appengine/handlers/cron/triage_test.py b/src/clusterfuzz/_internal/tests/appengine/handlers/cron/triage_test.py index fc6bd2a5166..1b875050732 100644 --- a/src/clusterfuzz/_internal/tests/appengine/handlers/cron/triage_test.py +++ b/src/clusterfuzz/_internal/tests/appengine/handlers/cron/triage_test.py @@ -386,8 +386,11 @@ def test_similar_testcase_with_issue_closed_with_ignore_label(self): testcase = data_handler.get_testcase_by_id(self.testcase.key.id()) self.assertEqual( - 'Skipping filing a bug since similar testcase (2) in issue (1) ' - 'is blacklisted with ClusterFuzz-Ignore label.', + 'Skipping filing a bug since similar testcase ' + '(2)' + ' in issue ' + '(1) is blacklisted with ClusterFuzz-Ignore label.', testcase.get_metadata(triage.TRIAGE_MESSAGE_KEY)) def test_similar_testcase_with_issue_recently_closed(self): @@ -412,8 +415,12 @@ def test_similar_testcase_with_issue_recently_closed(self): testcase = data_handler.get_testcase_by_id(self.testcase.key.id()) self.assertEqual( - 'Delaying filing a bug since similar testcase (2) in issue (1) ' - 'was just fixed.', testcase.get_metadata(triage.TRIAGE_MESSAGE_KEY)) + 'Delaying filing a bug since similar testcase ' + '(2)' + ' in issue ' + '(1) was just fixed.', + testcase.get_metadata(triage.TRIAGE_MESSAGE_KEY)) @test_utils.with_cloud_emulators('datastore')