[PATCH v6 2/2] ci: point test failures and fixed known breakages at their file and line
- From
Harald Nordgren via GitGitGadget <gitgitgadget@gmail.com>
- Date
- Oct 6, 2026, 06:56 UTC
- Message-ID
- <acf1fbd250c347a0f1afc295e603f3463c14217f.1791269798.git.gitgitgadget@gmail.com>
- In-Reply-To
- <pull.2419.v6.git.git.1791269798.gitgitgadget@gmail.com>
From: Harald Nordgren <haraldnordgren@gmail.com>
A failing test gets an annotation in the Annotations list on its job's summary page, naming it, for example:
failed: t1060.17 partial clone of corrupted repository
with no indication of where that test lives.
Find the line a test is defined on by searching its script for the test's own description as a fixed string, using the first match, and add the file and line to the annotation's own message text:
failed: t1060.17 partial clone of corrupted repository (t1060-object-corruption.sh:141)
Fall back to naming just the script, with no line, when the description is not found verbatim, which happens when a test builds its description at runtime instead of writing it out literally.
Signed-off-by: Harald Nordgren <haraldnordgren@gmail.com> --- t/test-lib-github-workflow-markup.sh | 29 ++++++++++++++++++++++------ 1 file changed, 23 insertions(+), 6 deletions(-)
diff --git a/t/test-lib-github-workflow-markup.sh b/t/test-lib-github-workflow-markup.sh index 3fa7859f0b..826c4ac902 100644 --- a/t/test-lib-github-workflow-markup.sh +++ b/t/test-lib-github-workflow-markup.sh @@ -31,23 +31,40 @@ start_test_output () { github_markup_script_name=${0##*/} } +find_test_case_line_ () { + # A description can contain characters like [ or * that would + # corrupt a regex search, so match it literally and take the first + # hit. The -- keeps a description starting with "-" from being read + # as an option. + grep -n -F -- "$1" "$TEST_DIRECTORY/$github_markup_script_name" | + head -n 1 | cut -d: -f1 +} + # No need to override start_test_case_output finalize_test_case_output () { test_case_result=$1 shift + + case "$test_case_result" in + ok|broken) + # Exit without printing the "ok" or "broken" tests + return + ;; + esac + + test_case_line=$(find_test_case_line_ "$1") + test_case_where="$github_markup_script_name${test_case_line:+:$test_case_line}" + case "$test_case_result" in failure) - echo >>$github_markup_output "::error::failed: $this_test.$test_count $1" + echo >>$github_markup_output "::error::failed: $this_test.$test_count $1 ($test_case_where)" ;; fixed) - echo >>$github_markup_output "::notice::fixed: $this_test.$test_count $1" - ;; - ok|broken) - # Exit without printing the "ok" or ""broken" tests - return + echo >>$github_markup_output "::notice::fixed: $this_test.$test_count $1 ($test_case_where)" ;; esac + echo >>$github_markup_output "::group::$test_case_result: $this_test.$test_count $*" test-tool >>$github_markup_output path-utils skip-n-bytes \ "$GIT_TEST_TEE_OUTPUT_FILE" $GIT_TEST_TEE_OFFSET
-- gitgitgadget