From d9776e0f92c4d356bf588809280053567bd482aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Desbiens?= Date: Tue, 25 Aug 2026 16:16:29 -0400 Subject: [PATCH] Bumped gcovr off the 4.1 pin it had been held on since 2018 The coverage tooling was pinned to gcovr 4.1, released in 2018, and that version is missing the two options the coverage work needs next: --json and --add-tracefile, which is how the five build configurations get merged into one report. This moves the pin to 8.6, the current release. The pin stays exact, and it stays hand-moved: it lives in a shell script, and no Dependabot ecosystem can parse that. Isolated deliberately, so that a movement in the coverage number caused by the tool could not be confused with one caused by a later change. Measured on the default_build_coverage tree of test/tx, over the same gcda with the same gcov, varying only the gcovr version: gcovr lines-valid branches-valid files 4.1 3827 1994 177 7.0 3827 1994 177 8.3 3827 1994 177 8.6 3827 1994 177 So the denominator does not move with the tool at all, and this bump moves no number. The plan this came from expected 3822 to become 3827; that figure does not reproduce, under gcc-13 or gcc-14, with or without --object-directory. The only variant that changes the count is dropping the -f filter, which collapses the report to nothing. Two things found while measuring, both recorded because they matter to what comes next. The coverage numerator is not deterministic. On an identical tree with an identical compiler, three consecutive runs of the full suite -- all 96 tests passing every time -- reported 3826, 3827 and 3827 covered lines. The line that flickers is tx_thread_system_resume.c:529, the preemption path of _tx_thread_system_resume, and it takes its guarding branch with it. It has been described as never executed; it is executed on some runs and not others. A coverage floor has to be set with that in mind, and the honest fix is a test that takes the path deliberately. Reading gcc-13 output, the compiler the runners actually use, gcovr 8.6 runs the existing coverage.sh unchanged: Cobertura XML and 181 HTML files, same 177 classes. --xml-pretty and --object-directory still work on 8.6 but are now deprecated aliases for --cobertura-pretty and --gcov-object-directory, worth knowing for whoever removes --object-directory next. Assisted-by: Claude Opus 5 --- scripts/install.sh | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/scripts/install.sh b/scripts/install.sh index e37fd33a9..c142370de 100755 --- a/scripts/install.sh +++ b/scripts/install.sh @@ -78,7 +78,24 @@ retry sudo "${TIMEOUT[@]}" apt-get "${APT_OPTIONS[@]}" install -y \ software-properties-common || exit 1 retry "${TIMEOUT[@]}" python3 -m pip install --retries 3 --timeout 30 --upgrade pip || exit 1 -retry "${TIMEOUT[@]}" pip3 install --retries 3 --timeout 30 gcovr==4.1 || exit 1 +# gcovr was pinned to 4.1, released in 2018. That version cannot do what merging +# the coverage of several build configurations needs: it has no --json and no +# --add-tracefile, both of which arrived later. The pin is exact rather than +# floating so the coverage percentage stays comparable between runs -- the +# denominator is a property of the tool as much as of the tree -- and it is moved +# by hand, because it lives in a shell script that Dependabot cannot parse. +# +# Measured before bumping, on the default_build_coverage tree of test/tx, over +# the same gcda with the same gcov, varying only the gcovr version: 4.1, 7.0, +# 8.3 and 8.6 all report lines-valid 3827 across 177 files and branches-valid +# 1994. The denominator does not move with the tool, so this bump moves no +# number and any movement in a later run belongs to a later change. +# +# The numerator does move, but not because of gcovr: tx_thread_system_resume.c +# line 529 is executed on some runs of the suite and not others, so the same +# tree reports 3826 or 3827 covered lines with every test passing either way. +# That is a property of the suite, not of this pin. +retry "${TIMEOUT[@]}" pip3 install --retries 3 --timeout 30 gcovr==8.6 || exit 1 # Upgrade cmake to the latest version. retry "${TIMEOUT[@]}" pip install --retries 3 --timeout 30 --upgrade cmake || exit 1