<feed xmlns='http://www.w3.org/2005/Atom'>
<title>catch3/.github, branch build/bcr</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>Prepare the Bazel Central Registry entry as progmasoft_catch3</title>
<updated>2026-11-15T20:08:05+00:00</updated>
<author>
<name>Leitwolf11</name>
</author>
<published>2026-11-15T20:08:05+00:00</published>
<link rel='alternate' type='text/html' href='https://git.progmasoft.com/catch3/commit/?id=67c3ef401b34716f7214374ff0d6c24b3c50a149'/>
<id>67c3ef401b34716f7214374ff0d6c24b3c50a149</id>
<content type='text'>
- MODULE.bazel names the module progmasoft_catch3, the name it has in
  the registry, with bazel_compatibility &gt;=8.0.0; //tools:version finds
  the version under the new name.
- .bcr/ holds the templates publish-to-bcr fills: metadata, source (the
  GitHub archive of the catch3-* tag) and the presubmit, which runs the
  test module on Debian, Ubuntu, macOS (x86-64 and arm64) and Windows
  with Bazel 8.x and 9.x.
- tests/Progmasoft/BazelModule is a module that depends on Catch3 as a
  user's does, through //:catch3_main and through //:catch3 with its
  own main. The root ignores it; Bazel Builds tests it with Bazel 8.x
  and 9.x on Ubuntu and Windows.
- Publish to BCR runs when a catch3-* release is published, or by hand
  for a tag, and opens the registry pull request from the fork of the
  maintainer, without attestations.
- The integration guide says how a module depends on progmasoft_catch3.

Claude-Session: https://claude.ai/code/session_01Ji7xZMYjc4zankoc7hGBE1
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
- MODULE.bazel names the module progmasoft_catch3, the name it has in
  the registry, with bazel_compatibility &gt;=8.0.0; //tools:version finds
  the version under the new name.
- .bcr/ holds the templates publish-to-bcr fills: metadata, source (the
  GitHub archive of the catch3-* tag) and the presubmit, which runs the
  test module on Debian, Ubuntu, macOS (x86-64 and arm64) and Windows
  with Bazel 8.x and 9.x.
- tests/Progmasoft/BazelModule is a module that depends on Catch3 as a
  user's does, through //:catch3_main and through //:catch3 with its
  own main. The root ignores it; Bazel Builds tests it with Bazel 8.x
  and 9.x on Ubuntu and Windows.
- Publish to BCR runs when a catch3-* release is published, or by hand
  for a tag, and opens the registry pull request from the fork of the
  maintainer, without attestations.
- The integration guide says how a module depends on progmasoft_catch3.

Claude-Session: https://claude.ai/code/session_01Ji7xZMYjc4zankoc7hGBE1
</pre>
</div>
</content>
</entry>
<entry>
<title>Wrap the new license text at 80 columns</title>
<updated>2026-11-15T18:12:53+00:00</updated>
<author>
<name>Leitwolf11</name>
</author>
<published>2026-11-15T18:12:53+00:00</published>
<link rel='alternate' type='text/html' href='https://git.progmasoft.com/catch3/commit/?id=9ee4ca4522989cf82a4df7c791b32c00e3046b13'/>
<id>9ee4ca4522989cf82a4df7c791b32c00e3046b13</id>
<content type='text'>
PATENTS.md and the License section of the README are wrapped at 80
columns, as the rest of Catch3's Markdown is and as Codacy's markdownlint
checks. The three Markdown files that came from Catch2 write their two
copyright lines and the license in one comment, so that no line passes 80.

Co-Authored-By: Claude Opus 5.5 &lt;noreply@anthropic.com&gt;
Claude-Session: https://claude.ai/code/session_01Ji7xZMYjc4zankoc7hGBE1
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
PATENTS.md and the License section of the README are wrapped at 80
columns, as the rest of Catch3's Markdown is and as Codacy's markdownlint
checks. The three Markdown files that came from Catch2 write their two
copyright lines and the license in one comment, so that no line passes 80.

Co-Authored-By: Claude Opus 5.5 &lt;noreply@anthropic.com&gt;
Claude-Session: https://claude.ai/code/session_01Ji7xZMYjc4zankoc7hGBE1
</pre>
</div>
</content>
</entry>
<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>
</feed>
