From: "Harald Nordgren via GitGitGadget" <gitgitgadget@gmail.com>
To: git@vger.kernel.org
Cc: Harald Nordgren <haraldnordgren@gmail.com>,
Harald Nordgren <haraldnordgren@gmail.com>
Subject: [PATCH] ci: point leak-sanitizer failures at the actual test and error
Date: Fri, 25 Sep 2026 18:54:03 +0000 [thread overview]
Message-ID: <pull.2419.git.git.1790362443893.gitgitgadget@gmail.com> (raw)
From: Harald Nordgren <haraldnordgren@gmail.com>
A leak is only found once, at the end of a whole script, well after
every test already reported ok, and the failure annotation carried
no file or line, so all a reviewer ever saw was:
Process completed with exit code 1.
with nothing to click through to. Stop each leak-sanitizer script at
its first failure instead of running the rest of an already-tainted
script, and have both failure and leak annotations point at the real
file and carry the actual error, for example:
t/t1507-rev-parse-upstream.sh, line 1:
memory leak logged around t1507.1
==ERROR: LeakSanitizer: detected memory leaks
Direct leak of 60 byte(s) in 1 object(s) allocated from:
...
#5 in add_branch builtin/remote.c:135
Signed-off-by: Harald Nordgren <haraldnordgren@gmail.com>
---
ci: point leak-sanitizer failures at the actual test and error
I discovered while running CI on another GitHub pull request that it's
very hard to see where the error is for the leak tests.
This will stop each leak-sanitizer script at its first failure and
points annotations at the real file and error.
Proof that it works:
https://github.com/git/git/actions/runs/35871180948/job/107215430244
Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-git-2419%2FHaraldNordgren%2Fci-annotation-file-line-v1
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-git-2419/HaraldNordgren/ci-annotation-file-line-v1
Pull-Request: https://github.com/git/git/pull/2419
ci/lib.sh | 1 +
t/test-lib-github-workflow-markup.sh | 49 +++++++++++++++++++++++-----
t/test-lib.sh | 2 ++
3 files changed, 44 insertions(+), 8 deletions(-)
diff --git a/ci/lib.sh b/ci/lib.sh
index c6ccbf8c17..a89f480a78 100755
--- a/ci/lib.sh
+++ b/ci/lib.sh
@@ -382,6 +382,7 @@ linux-leaks|linux-reftable-leaks)
export NO_CVS_TESTS=LetsSaveSomeTime
export NO_SVN_TESTS=LetsSaveSomeTime
export NO_P4_TESTS=LetsSaveSomeTime
+ GIT_TEST_OPTS="$GIT_TEST_OPTS --immediate"
;;
linux-asan-ubsan)
export SANITIZE=address,undefined
diff --git a/t/test-lib-github-workflow-markup.sh b/t/test-lib-github-workflow-markup.sh
index fa29a62aa3..4f6460a0ad 100644
--- a/t/test-lib-github-workflow-markup.sh
+++ b/t/test-lib-github-workflow-markup.sh
@@ -28,6 +28,7 @@ start_test_output () {
github_markup_output="${GIT_TEST_TEE_OUTPUT_FILE%.out}.markup"
>$github_markup_output
GIT_TEST_TEE_OFFSET=0
+ github_markup_script_name=${0##*/}
}
# No need to override start_test_case_output
@@ -35,22 +36,54 @@ start_test_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_output=$(test-tool path-utils skip-n-bytes \
+ "$GIT_TEST_TEE_OUTPUT_FILE" $GIT_TEST_TEE_OFFSET)
+
case "$test_case_result" in
failure)
- echo >>$github_markup_output "::error::failed: $this_test.$test_count $1"
+ test_case_summary=$(printf '%s\n' "$test_case_output" |
+ tail -n 20 | github_escape_message_)
+ github_annotation_ error "t/$github_markup_script_name" "${test_case_line:-1}" \
+ "failed: $this_test.$test_count $1%0A%0A$test_case_summary"
;;
fixed)
- echo >>$github_markup_output "::notice::fixed: $this_test.$test_count $1"
- ;;
- ok|broken)
- # Exit without printing the "ok" or ""broken" tests
- return
+ github_annotation_ notice "t/$github_markup_script_name" "${test_case_line:-1}" \
+ "fixed: $this_test.$test_count $1"
;;
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
+ printf '%s\n' "$test_case_output" >>$github_markup_output
echo >>$github_markup_output "::endgroup::"
}
+finalize_test_leak_output () {
+ test_leak_summary=$(head -n 40 "$TEST_RESULTS_SAN_FILE".* |
+ github_escape_message_)
+ github_annotation_ error "t/$github_markup_script_name" 1 \
+ "memory leak logged around $this_test.$test_count%0A%0A$test_leak_summary"
+}
+
# No need to override finalize_test_output
+
+github_escape_message_ () {
+ sed -e ':a' -e 'N' -e '$!ba' -e 's/%/%25/g' -e 's/\r/%0D/g' -e 's/\n/%0A/g'
+}
+
+find_test_case_line_ () {
+ grep -n -F -- "$1" "$TEST_DIRECTORY/$github_markup_script_name" |
+ head -n 1 | cut -d: -f1
+}
+
+github_annotation_ () {
+ echo >>$github_markup_output "::$1 file=$2,line=$3::$4"
+}
diff --git a/t/test-lib.sh b/t/test-lib.sh
index 1f0505e412..a52589c6a2 100644
--- a/t/test-lib.sh
+++ b/t/test-lib.sh
@@ -199,6 +199,7 @@ mark_option_requires_arg () {
start_test_output () { :; }
start_test_case_output () { :; }
finalize_test_case_output () { :; }
+finalize_test_leak_output () { :; }
finalize_test_output () { :; }
parse_option () {
@@ -1218,6 +1219,7 @@ check_test_results_san_file_ () {
return
fi &&
say_color >&4 error "$(cat "$TEST_RESULTS_SAN_FILE".*)" &&
+ finalize_test_leak_output &&
if test "$test_failure" = 0
then
base-commit: 3bc0341126508f78f5869cbfc0005e987efdf0c7
--
gitgitgadget
next reply other threads:[~2026-09-25 18:54 UTC|newest]
Thread overview: 40+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-09-25 18:54 Harald Nordgren via GitGitGadget [this message]
2026-09-25 20:26 ` [PATCH] ci: point leak-sanitizer failures at the actual test and error Ben Knoble
2026-09-25 21:43 ` Harald Nordgren
2026-09-27 15:19 ` Phillip Wood
2026-09-27 19:52 ` Harald Nordgren
2026-09-28 18:54 ` [PATCH v2 0/2] ci: link failure and leak annotations to the test script Harald Nordgren via GitGitGadget
2026-09-28 18:54 ` [PATCH v2 1/2] ci: annotate leaks and stop a leak-sanitizer script at its first failure Harald Nordgren via GitGitGadget
2026-09-28 20:46 ` Junio C Hamano
2026-09-29 7:47 ` Harald Nordgren
2026-09-28 18:54 ` [PATCH v2 2/2] ci: point test failures and fixed known breakages at their file and line Harald Nordgren via GitGitGadget
2026-09-28 20:53 ` Junio C Hamano
2026-09-30 6:09 ` [PATCH v3 0/2] ci: link failure and leak annotations to the test script Harald Nordgren via GitGitGadget
2026-09-30 6:09 ` [PATCH v3 1/2] ci: annotate leaks and stop a leak-sanitizer script at its first failure Harald Nordgren via GitGitGadget
2026-09-30 14:56 ` Phillip Wood
2026-09-30 6:09 ` [PATCH v3 2/2] ci: point test failures and fixed known breakages at their file and line Harald Nordgren via GitGitGadget
2026-09-30 14:56 ` Phillip Wood
2026-09-30 18:40 ` Harald Nordgren
2026-09-30 14:37 ` [PATCH v3 0/2] ci: link failure and leak annotations to the test script Junio C Hamano
2026-09-30 15:52 ` Phillip Wood
2026-09-30 18:46 ` Junio C Hamano
2026-10-01 18:44 ` [PATCH v4 " Harald Nordgren via GitGitGadget
2026-10-01 18:44 ` [PATCH v4 1/2] ci: annotate leaks and stop a leak-sanitizer script at its first failure Harald Nordgren via GitGitGadget
2026-10-01 18:44 ` [PATCH v4 2/2] ci: point test failures and fixed known breakages at their file and line Harald Nordgren via GitGitGadget
2026-10-01 19:49 ` Phillip Wood
2026-10-01 20:11 ` Junio C Hamano
2026-10-02 8:04 ` Harald Nordgren
2026-10-03 8:11 ` [PATCH v5 0/2] ci: link failure and leak annotations to the test script Harald Nordgren via GitGitGadget
2026-10-03 8:11 ` [PATCH v5 1/2] ci: annotate leaks and stop a leak-sanitizer script at its first failure Harald Nordgren via GitGitGadget
2026-10-03 8:11 ` [PATCH v5 2/2] ci: point test failures and fixed known breakages at their file and line Harald Nordgren via GitGitGadget
2026-10-03 13:03 ` [PATCH v5 0/2] ci: link failure and leak annotations to the test script Phillip Wood
2026-10-03 19:02 ` Phillip Wood
2026-10-04 11:51 ` Harald Nordgren
2026-10-05 13:23 ` Phillip Wood
2026-10-05 13:59 ` Harald Nordgren
2026-10-05 15:11 ` Phillip Wood
2026-10-04 12:03 ` Harald Nordgren
2026-10-06 6:56 ` [PATCH v6 " Harald Nordgren via GitGitGadget
2026-10-06 6:56 ` [PATCH v6 1/2] ci: annotate leaks and stop a leak-sanitizer script at its first failure Harald Nordgren via GitGitGadget
2026-10-06 6:56 ` [PATCH v6 2/2] ci: point test failures and fixed known breakages at their file and line Harald Nordgren via GitGitGadget
2026-10-06 9:52 ` [PATCH v6 0/2] ci: link failure and leak annotations to the test script Phillip Wood
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=pull.2419.git.git.1790362443893.gitgitgadget@gmail.com \
--to=gitgitgadget@gmail.com \
--cc=git@vger.kernel.org \
--cc=haraldnordgren@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.