<feed xmlns='http://www.w3.org/2005/Atom'>
<title>catch3/.github/workflows, branch security/bounded-strings</title>
<subtitle>Progmasoft Catch3: an independently maintained C++17 test framework with a parallel runner, property checks, snapshots and structured results.</subtitle>
<link rel='alternate' type='text/html' href='https://git.progmasoft.com/catch3/'/>
<entry>
<title>Merge branch 'devel' into legal/lgpl</title>
<updated>2026-11-15T18:09:10+00:00</updated>
<author>
<name>Leitwolf</name>
</author>
<published>2026-11-15T18:09:10+00:00</published>
<link rel='alternate' type='text/html' href='https://git.progmasoft.com/catch3/commit/?id=f4b8dc2cbcf8809f32d4ca57b39d02288964cacc'/>
<id>f4b8dc2cbcf8809f32d4ca57b39d02288964cacc</id>
<content type='text'>
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
</pre>
</div>
</content>
</entry>
<entry>
<title>Merge remote-tracking branch 'origin/devel' into legal/lgpl</title>
<updated>2026-11-15T17:09:21+00:00</updated>
<author>
<name>Leitwolf11</name>
</author>
<published>2026-11-15T17:09:21+00:00</published>
<link rel='alternate' type='text/html' href='https://git.progmasoft.com/catch3/commit/?id=258075e94cd68fa36350fa6722faff96b7bfa101'/>
<id>258075e94cd68fa36350fa6722faff96b7bfa101</id>
<content type='text'>
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
</pre>
</div>
</content>
</entry>
<entry>
<title>Merge branch 'devel' into ci/doxygen</title>
<updated>2026-11-15T16:32:49+00:00</updated>
<author>
<name>Leitwolf</name>
</author>
<published>2026-11-15T16:32:49+00:00</published>
<link rel='alternate' type='text/html' href='https://git.progmasoft.com/catch3/commit/?id=9ee284a258efce283c4266d7319f2c336eb4403a'/>
<id>9ee284a258efce283c4266d7319f2c336eb4403a</id>
<content type='text'>
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
</pre>
</div>
</content>
</entry>
<entry>
<title>Build the Doxygen reference in CI and fail on warnings</title>
<updated>2026-11-15T14:18:46+00:00</updated>
<author>
<name>Leitwolf11</name>
</author>
<published>2026-11-15T14:18:46+00:00</published>
<link rel='alternate' type='text/html' href='https://git.progmasoft.com/catch3/commit/?id=b3c841b539755e12b706bf6d78f333b20747062c'/>
<id>b3c841b539755e12b706bf6d78f333b20747062c</id>
<content type='text'>
The Doxyfile had never run in CI, and its warnings went to a log file.

- It reads the headers only (*.hpp): Doxygen cannot match the explicit
  specializations of StringMaker and the PImpl constructors defined in the
  sources to their declarations, which gave ten of its twelve warnings.
- src/Progmasoft/Catch3/Internal/Preprocessor.hpp is left out: Doxygen reads
  priority_tag&lt;N&gt; deriving from priority_tag&lt;N - 1&gt; as a recursive class.
- WARN_AS_ERROR = FAIL_ON_WARNINGS, warnings on standard error.
- DOT_GRAPH_MAX_NODES = 200, so the include graph of All.hpp (103 nodes)
  is drawn; DOT_MULTI_TARGETS, which Doxygen 1.18 no longer knows, is gone.
- .github/workflows/doxygen.yml installs Doxygen and Graphviz, builds the
  reference and keeps the HTML.

Claude-Session: https://claude.ai/code/session_01Ji7xZMYjc4zankoc7hGBE1
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
The Doxyfile had never run in CI, and its warnings went to a log file.

- It reads the headers only (*.hpp): Doxygen cannot match the explicit
  specializations of StringMaker and the PImpl constructors defined in the
  sources to their declarations, which gave ten of its twelve warnings.
- src/Progmasoft/Catch3/Internal/Preprocessor.hpp is left out: Doxygen reads
  priority_tag&lt;N&gt; deriving from priority_tag&lt;N - 1&gt; as a recursive class.
- WARN_AS_ERROR = FAIL_ON_WARNINGS, warnings on standard error.
- DOT_GRAPH_MAX_NODES = 200, so the include graph of All.hpp (103 nodes)
  is drawn; DOT_MULTI_TARGETS, which Doxygen 1.18 no longer knows, is gone.
- .github/workflows/doxygen.yml installs Doxygen and Graphviz, builds the
  reference and keeps the HTML.

Claude-Session: https://claude.ai/code/session_01Ji7xZMYjc4zankoc7hGBE1
</pre>
</div>
</content>
</entry>
<entry>
<title>License Catch3's Progmasoft files under LGPL-3.0-or-later</title>
<updated>2026-11-15T11:01:10+00:00</updated>
<author>
<name>Leitwolf11</name>
</author>
<published>2026-11-15T11:01:10+00:00</published>
<link rel='alternate' type='text/html' href='https://git.progmasoft.com/catch3/commit/?id=5c865488e762dec616a0c483d0fc07250123c387'/>
<id>5c865488e762dec616a0c483d0fc07250123c387</id>
<content type='text'>
Every Progmasoft-authored file moves from MPL-2.0 WITH
AdditionRef-Progmasoft-Exception-2.0 to LGPL-3.0-or-later, from 0.5.0
on. Catch2-originated files keep BSL-1.0, and the vendored yyjson and
pugixml keep MIT.

- LICENSES/ holds the LGPL-3.0 text and the GPL-3.0 text it builds on,
  both as published by the FSF; the MPL-2.0 and Progmasoft Exception
  texts go, since no file uses them any more.
- Five files that came from Catch2 and were rewritten by Progmasoft
  (.clang-format, the issue and pull request templates, SECURITY.md)
  keep Catch2's notice next to Progmasoft's and say
  LGPL-3.0-or-later AND BSL-1.0.
- //tools:check expects the new header of Progmasoft files; the
  amalgamation notes say LGPL-3.0-or-later and the amalgamated files
  are regenerated; meson's project license is BSL-1.0 and
  LGPL-3.0-or-later.
- README gains a License section; LICENSES/README.md, contributing.md
  and progmasoft-catch3.md describe the new split and that releases
  before 0.5.0 keep the license they were published under.

Every commit to Progmasoft's files since the fork is the maintainer's.

Claude-Session: https://claude.ai/code/session_01Ji7xZMYjc4zankoc7hGBE1
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Every Progmasoft-authored file moves from MPL-2.0 WITH
AdditionRef-Progmasoft-Exception-2.0 to LGPL-3.0-or-later, from 0.5.0
on. Catch2-originated files keep BSL-1.0, and the vendored yyjson and
pugixml keep MIT.

- LICENSES/ holds the LGPL-3.0 text and the GPL-3.0 text it builds on,
  both as published by the FSF; the MPL-2.0 and Progmasoft Exception
  texts go, since no file uses them any more.
- Five files that came from Catch2 and were rewritten by Progmasoft
  (.clang-format, the issue and pull request templates, SECURITY.md)
  keep Catch2's notice next to Progmasoft's and say
  LGPL-3.0-or-later AND BSL-1.0.
- //tools:check expects the new header of Progmasoft files; the
  amalgamation notes say LGPL-3.0-or-later and the amalgamated files
  are regenerated; meson's project license is BSL-1.0 and
  LGPL-3.0-or-later.
- README gains a License section; LICENSES/README.md, contributing.md
  and progmasoft-catch3.md describe the new split and that releases
  before 0.5.0 keep the license they were published under.

Every commit to Progmasoft's files since the fork is the maintainer's.

Claude-Session: https://claude.ai/code/session_01Ji7xZMYjc4zankoc7hGBE1
</pre>
</div>
</content>
</entry>
<entry>
<title>Drop references to the former compiler from two comments</title>
<updated>2026-11-15T09:07:30+00:00</updated>
<author>
<name>Leitwolf11</name>
</author>
<published>2026-11-15T09:07:30+00:00</published>
<link rel='alternate' type='text/html' href='https://git.progmasoft.com/catch3/commit/?id=13ecce487c3075e4ccc2f62b9c08597459d1a268'/>
<id>13ecce487c3075e4ccc2f62b9c08597459d1a268</id>
<content type='text'>
The macOS workflow and RepositoryReport.hpp explained themselves by another project; they now say what they do: macOS gets one job, and the JSON report uses the field names of RepositoryReport in camelCase.

Claude-Session: https://claude.ai/code/session_01Ji7xZMYjc4zankoc7hGBE1
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
The macOS workflow and RepositoryReport.hpp explained themselves by another project; they now say what they do: macOS gets one job, and the JSON report uses the field names of RepositoryReport in camelCase.

Claude-Session: https://claude.ai/code/session_01Ji7xZMYjc4zankoc7hGBE1
</pre>
</div>
</content>
</entry>
<entry>
<title>Keep per-test coverage with --coverage (roadmap step 4)</title>
<updated>2026-11-13T04:46:08+00:00</updated>
<author>
<name>Leitwolf11</name>
</author>
<published>2026-11-13T04:46:08+00:00</published>
<link rel='alternate' type='text/html' href='https://git.progmasoft.com/catch3/commit/?id=17248837a78462596809f902dd47cf113a39670b'/>
<id>17248837a78462596809f902dd47cf113a39670b</id>
<content type='text'>
--coverage=DIR runs every attempt in a process of its own and keeps the
coverage of each test, for binaries built with LLVM source-based
coverage (Clang: -fprofile-instr-generate -fcoverage-mapping) or gcov
(GCC: --coverage).

How it works:

- The scheduler gives each attempt a fresh worker, as --isolate does,
  and sets LLVM_PROFILE_FILE and GCOV_PREFIX for it: the profile the
  process writes at exit is then the coverage of that one test, in
  DIR/profiles/t&lt;index&gt;-a&lt;attempt&gt;.profraw or a .gcov directory. Each
  runtime reads its own variable, so no symbol of either runtime is
  looked up: weak references would not pull them out of their static
  archives, and Mach-O does not allow undefined weak symbols.
- A process that runs other tests first (bisection) writes beside the
  profiles, never into one. The attempt records its profile, also in
  the JSON results.
- The profiles of an earlier run are removed when the run starts,
  because gcov adds to the .gcda files it finds.
- After the run, CoverageReport reads the last profile of every test:
  llvm-profdata and llvm-cov (PATH, xcrun on macOS, or
  CATCH3_LLVM_PROFDATA / CATCH3_LLVM_COV) export LCOV, gcov (or
  CATCH3_GCOV) writes JSON next to a copy of the .gcno. The result is
  DIR/coverage.json, the files, lines and branches each test reached,
  and DIR/coverage.lcov for the whole run. Without the tools the
  profiles stay and the run says so.
- --coverage with --in-process or --break is refused.

Tests: option parsing, LCOV reading and writing, gcov JSON, and an
integration test on CoverageFixture, a binary CMake builds with the
coverage flags of Clang or GCC: two tests reach different lines, each
map holds only its own, the LCOV report holds both, and a stale profile
of an earlier run is gone. Locally all 84 CTest tests pass with Clang,
and the coverage tests pass with GCC (built with
CATCH3_ENABLE_WERROR=OFF: Catch3 does not build with GCC's warnings as
errors, before and after this change).

CI: the Linux jobs install LLVM's coverage tools, a new job checks the
gcov path with GCC, and CATCH3_COVERAGE_REQUIRE_MAP turns a missing map
into a failure on Linux and macOS instead of a skip. MSVC has no
source-based coverage, so its builds skip those tests; the roadmap
lists step 4 as in progress until Windows with clang-cl is tested.
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
--coverage=DIR runs every attempt in a process of its own and keeps the
coverage of each test, for binaries built with LLVM source-based
coverage (Clang: -fprofile-instr-generate -fcoverage-mapping) or gcov
(GCC: --coverage).

How it works:

- The scheduler gives each attempt a fresh worker, as --isolate does,
  and sets LLVM_PROFILE_FILE and GCOV_PREFIX for it: the profile the
  process writes at exit is then the coverage of that one test, in
  DIR/profiles/t&lt;index&gt;-a&lt;attempt&gt;.profraw or a .gcov directory. Each
  runtime reads its own variable, so no symbol of either runtime is
  looked up: weak references would not pull them out of their static
  archives, and Mach-O does not allow undefined weak symbols.
- A process that runs other tests first (bisection) writes beside the
  profiles, never into one. The attempt records its profile, also in
  the JSON results.
- The profiles of an earlier run are removed when the run starts,
  because gcov adds to the .gcda files it finds.
- After the run, CoverageReport reads the last profile of every test:
  llvm-profdata and llvm-cov (PATH, xcrun on macOS, or
  CATCH3_LLVM_PROFDATA / CATCH3_LLVM_COV) export LCOV, gcov (or
  CATCH3_GCOV) writes JSON next to a copy of the .gcno. The result is
  DIR/coverage.json, the files, lines and branches each test reached,
  and DIR/coverage.lcov for the whole run. Without the tools the
  profiles stay and the run says so.
- --coverage with --in-process or --break is refused.

Tests: option parsing, LCOV reading and writing, gcov JSON, and an
integration test on CoverageFixture, a binary CMake builds with the
coverage flags of Clang or GCC: two tests reach different lines, each
map holds only its own, the LCOV report holds both, and a stale profile
of an earlier run is gone. Locally all 84 CTest tests pass with Clang,
and the coverage tests pass with GCC (built with
CATCH3_ENABLE_WERROR=OFF: Catch3 does not build with GCC's warnings as
errors, before and after this change).

CI: the Linux jobs install LLVM's coverage tools, a new job checks the
gcov path with GCC, and CATCH3_COVERAGE_REQUIRE_MAP turns a missing map
into a failure on Linux and macOS instead of a skip. MSVC has no
source-based coverage, so its builds skip those tests; the roadmap
lists step 4 as in progress until Windows with clang-cl is tested.
</pre>
</div>
</content>
</entry>
<entry>
<title>Pin the CodeQL action to its v4.38.2 release</title>
<updated>2026-11-08T21:42:34+00:00</updated>
<author>
<name>Leitwolf11</name>
</author>
<published>2026-11-08T21:42:34+00:00</published>
<link rel='alternate' type='text/html' href='https://git.progmasoft.com/catch3/commit/?id=cc1c53218b6357df95f015a81c1d89787bfe054d'/>
<id>cc1c53218b6357df95f015a81c1d89787bfe054d</id>
<content type='text'>
The init and analyze steps were pinned to 7999b86c, a commit no release tag
points at, with a "# v4" comment that names another commit (zizmor
ref-version-mismatch, two code-scanning alerts). Both steps now use
2892aa5e, the commit of v4.38.2, with that exact version as the comment.

Co-Authored-By: Claude Opus 5.5 &lt;noreply@anthropic.com&gt;
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
The init and analyze steps were pinned to 7999b86c, a commit no release tag
points at, with a "# v4" comment that names another commit (zizmor
ref-version-mismatch, two code-scanning alerts). Both steps now use
2892aa5e, the commit of v4.38.2, with that exact version as the comment.

Co-Authored-By: Claude Opus 5.5 &lt;noreply@anthropic.com&gt;
</pre>
</div>
</content>
</entry>
<entry>
<title>Merge devel into feature/cpp-tools</title>
<updated>2026-11-01T21:16:57+00:00</updated>
<author>
<name>Leitwolf11</name>
</author>
<published>2026-11-01T21:16:57+00:00</published>
<link rel='alternate' type='text/html' href='https://git.progmasoft.com/catch3/commit/?id=3ed0fd930371823b6d44ae64d00dbd79e421a552'/>
<id>3ed0fd930371823b6d44ae64d00dbd79e421a552</id>
<content type='text'>
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
</pre>
</div>
</content>
</entry>
<entry>
<title>Name the Bazel targets of the tools in snake_case</title>
<updated>2026-11-01T19:19:02+00:00</updated>
<author>
<name>Leitwolf11</name>
</author>
<published>2026-11-01T19:19:02+00:00</published>
<link rel='alternate' type='text/html' href='https://git.progmasoft.com/catch3/commit/?id=e32c9d107274f42b9cca700475404c80e96533c5'/>
<id>e32c9d107274f42b9cca700475404c80e96533c5</id>
<content type='text'>
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
</pre>
</div>
</content>
</entry>
</feed>
