Version 0.14.0
Changelog
- Updated the bundled LLVM setup to the official
toolchains_llvm1.9.0 prerelease commit while
its BCR publication is pending, removing the remaininghelly25/toolchains_llvmfork dependency. - Added live per-translation-unit clang-tidy progress with parallel worker counts, completion
percentages, failure-only diagnostics, configurable concurrency, and complete interruption
cleanup. A fail-closed clang-tidy database removes redundant fuzz-transition commands only when
their semantic compiler arguments match the ordinary build. - Transferred the project to
mboworks/mbo, renamed the Bazel module tomboworks_mbo, and
migrated shell tests tomboworks_bashtest@0.6.1. Historicalhelly25_mboreleases remain
available unchanged. - Extended SHGLOB braces with bounded ascending and descending integer and ASCII-letter sequences,
including signed and zero-padded integers. Expansions above 10,000 terms are rejected, and the
optional Bash increment form remains literal. - Replaced the previous glob translation with the canonical fast GLOB/SHGLOB implementation. It
provides locale-independent structural bracket parsing, positive and negated character classes,
precise validation, nested SHGLOB alternatives, and complete-component**; notably,
foo/**/barmatchesfoo/barand any number of intervening directory levels. - Added
mbo::StringOrView, a read-only string-like value that either owns astd::stringor
borrows astd::string_view. It exposes the full applicable string/string-view interface,
comparisons, C++23-stylecontains/subview, stream and Abseil formatting, plus Abseil and
std::hashintegration. - Fixed
OptionalDataOrRefconstruction and assignment so borrowed values cannot silently become
dangling references; added the corresponding lifetime constraints and tests. - Fixed
Requiredreplacement and generic operations, including move-only values and converting
construction/assignment, while preserving its configurable failure behavior. - Fixed
NoDestructconstruction and its formatting/hash customizations for non-copyable and
explicitly constructed values. - Added strict INI parsing: malformed sections, missing keys, and invalid trailing content now
return diagnostics instead of being partially accepted. - Fixed JSON value-iterator assignment and made JSON's configurable requirement failures testable
through the exception-enabled configuration without weakening the default fatal behavior. - Fixed alphabetic hexadecimal escapes so the full accepted digit set is decoded correctly.
- Fixed independently quoted option parsing: quoting one option no longer changes how subsequent
options are parsed. - Rejected truncated and structurally malformed glob ranges rather than passing altered semantics
to RE2. - Made
NormalizePathpreserve the filesystem's native character type instead of assuming narrow
characters. - Made
GetContentsreport seek failures andGetMaxLinesreport read failures instead of
returning incomplete data as success. - Corrected cache-cleanup prefix matching so one branch or configuration cannot select unrelated
cache entries. - Added fuzz targets for glob conversion, string parsing, INI parsing, diff inputs/options, and
digest checksum parsing. - Added LCOV line/function/branch coverage enforcement for the overall tree, logical modules, and
changed code. Reports use a shared policy and baseline, publish durable per-PR HTML detail to
GitHub Pages, and fail with actionable uncovered-line/branch diagnostics. - Raised measured coverage across every core module through behavioral tests rather than production
exclusions: overall coverage is 98.11% lines, 98.63% functions, and 89.32% branches; every module
is ratedGOOD, includingmbo/typesat 86.12% branch coverage. - Bounded CI cache entries below 500 MB and made cache cleanup best-effort, so cleanup API failures
cannot turn an otherwise successful job red. - Enabled UndefinedBehaviorSanitizer explicitly in the AddressSanitizer configuration.
- Updated the compile-command extractor and reused the clang-tidy Bazel configuration, eliminating
an avoidable configuration switch while keeping header-only changes in clang-tidy's scope. - Adopted the shared contributor style guides and enforcement: matcher-based tests, named typed and
parameterized cases, explicit test sizes, aligned Markdown tables, and pre-commit rejection of
forbidden GoogleTest comparison macros and spelling errors in C++ and documentation. - Added repository Git orchestration rules for dependency-graph-aware autonomous PR handling,
synchronized-head validation, conflict resolution, and safe parent/child merge sequencing. - Made pull-request validation run in pull-request context, cancel superseded runs, and retain the
final aggregatedonegate. - Hardened release automation: release bumps retain required review protection, only the requested
tag is published, and temporary Git indexes use a portable private directory. - Documented the policy of using readable GitHub Actions version tags rather than commit hashes
unless a concrete security or reproducibility reason requires pinning. - Silenced external-header warnings in exec-configuration builds without relaxing warnings for
first-party code. - Fixed
LimitedVector's comparison operators, which were declared overstd::size_tcapacities while the class takesauto: instances spelled viaMakeLimitedVector/LimitedOptionsor anintliteral matched no operator at all and failed to compile. - Enabled
cppcoreguidelines-pro-bounds-avoid-unchecked-container-access: uncheckedoperator[]is now a clang-tidy error. Containers that bounds-check themselves (LimitedMap,LimitedVector,Json) and insert-semantics maps (absl's) are excluded by class; the hash/digest kernels and other in-range-by-construction code carry scopedNOLINTblocks. - Fixed
LimitedVectorcomparison operators (==,<=>,<), which looped tominof the CAPACITIES instead of the sizes: comparing partially-filled vectors read uninitialized slots (or threw in a require-throws build). Found bypro-bounds-avoid-unchecked-container-access. - Converted unchecked
operator[]to.at()/std::get(or a reasonedNOLINTin benchmarks' timed loops and compile-time code) across the hash, digest, json, types and container libraries. - Converted unchecked
operator[]to.front()/.at()(or a reasonedNOLINTon hot paths) across the diff, strings, log, mope, file and testing libraries, preparingpro-bounds-avoid-unchecked-container-access. - Re-measured
pro-bounds-avoid-unchecked-container-access(task: attempt to enable): 2,953 findings, ~2,500 in hash/digest kernels where indices are in-range by construction; stays disabled with the data recorded in.clang-tidy. - Enabled
-Wpedantic(as errors) on all first-party code. Two named carve-outs for absl macros expanding in our translation units (ABSL_FLAG's__COUNTER__,ABSL_CHECK's_Nullable); the repo's own deliberate GNU extensions (__int128, statement expressions indecompose_count.h) are annotated__extension__in code. The bazel-7/8 compat CI rungs relax it because those bazels half-applyexternal_include_pathsand leak external-header findings. - Removed the temporary
hash_tembo.hallowlist entry from the headers-claimed check; #311 lists the header in a target again. - The warning set is now owned by the repo: explicit
-Wall -Wextra(as errors) on all first-party code, withmissing-field-initializerssuppressed as the deliberate designated-init idiom; previously only-Werrorwas ours and the set came from each toolchain's defaults. - CI no longer caches the hermetic LLVM (ported from helly25/xff #409+#411): jobs cache bazel's disk cache instead of the output root, non-clang cells keep a small repo cache, and the symbolizer wrapper resolves
llvm-symbolizervia runfiles so a fresh LLVM fetch location cannot break asan/tsan. - Added a
headers-claimedpre-commit check: every tracked header must be listed in its package's BUILD file. Foundhash_tembo.horphaned since #306 on its first run (temporarily allowlisted; re-listed by #311). - Replaced the reachability-based
library-test-coveragehook with xff's strict rule: everycc_libraryneeds a test in its own package with a direct dependency; exceptions live in the tool's_ALLOWLISTwith reasons. - Converted assert-status-then-dereference in the new tests to
IsOkAndHolds/MBO_ASSERT_OK_AND_ASSIGN, and imported four rules from helly25/xff's style guide (_ccnaming, per-package tests, no braced-init-list iteration,lhs/rhscomparator parameters). - Added tests for
hash_extra_cc,hash_internal_util_cc,mope_cc,ini_cc,runfiles_dir_cc,extend_cc,extender_ccandtest_types_cc- every library now has a test in its own package. - Added tests for all ten diff libraries: the three algorithms (
diff_direct_cc,diff_myers_cc,diff_naive_cc), the shared plumbing (base_diff_cc,chunked_diff_cc) and the internals (chunk_cc,context_cc,data_cc,output_cc,update_absl_log_flags_cc). - Removed every
-stdlib=libc++and every-Wno-unused-command-line-argumentsuppression: the hermetic toolchain resolves libc++ headers via-cxx-isystemand links libc++ explicitly, so the flag was inert (driver-confirmed) at compile and link alike; the one formerly load-bearing upstream copy is fixed in the officialtoolchains_llvm1.9.0 prerelease selected bygit_overrideuntil BCR publication. - Removed the redundant
--cxxopt=-stdlib=libc++from theclang-tidybazel config; the hermetic toolchain already passes it, so it appeared twice and produced "unused argument" warnings. - Fixed
mbo::file::GetMTimeon libstdc++: it readstd::filesystem::file_clocktime as Unix seconds, but that clock's epoch is implementation-defined (2174-01-01 on libstdc++), so every file's mtime was ~148 years off on Linux. - Added
mbo/diff:diff_options_test, covering every flag parser including the unknown-value paths. - Added
mbo/file:artefact_test. - Added tests for
container_proxy_cc,cases_cc,traits_cc(internal),config_ccandrequire_cc. - Fixed
mbo::types::TypedViewto derive fromstd::ranges::view_interfacePUBLICLY; private inheritance made every member it supplies inaccessible. - Added
mbo/types:typed_view_test, and normalised colon-less deps in BUILD files. - Fixed
mbo::types::IsVariantMemberType, which was alwaysfalse: its recursion specialised the out-of-range case, so an in-range index fell through to thefalse_typeprimary template. - Added
mbo/types:variant_testandmbo/log:demangle_test. - Added
mbo/types:compare_test, coveringCompareLess,CompareFloat's NaN total order andCompareScalar's mixed-signedness branches. - Fixed
//mbo/types:compare_ccto declare its dependency ontraits_cc, which it includes but never listed. - Added a
cc-target-namingpre-commit check (ported from helly25/xff):cc_librarytarget names must end in_cc. Renamedhash_internal_utilandhash_test_utilaccordingly. mbo::types::CompareLessnow declaresis_transparent, so its existing heterogeneous overloads are reachable throughLimitedSet/LimitedMapinstead of every lookup having to build a key first.- Extended transparent lookup to every read operation:
LimitedMap::at,contains_all/contains_any(which previously rejected foreign keys outright), andindex_of, so a foreign key now takes the same unrolled fast path as an exact key instead of falling back to a binary search. LimitedSet/LimitedMaperaseno longer constructs a key when the comparator is transparent, and its template overload is now constrained to foreign keys only.- Added transparent (heterogeneous) lookup to
LimitedSet/LimitedMap: when the comparator declaresis_transparent,find,contains,count,index_of,lower_bound,upper_boundandequal_rangeaccept any type the comparator can order against the key, without constructing a key. - Fixed
LimitedOrdered::countwhich returnedlast - falseinstead oflast - firstand did not compile at all (no test instantiated it). - Added a
library-test-coveragepre-commit check: everycc_libraryunder//mbo/...must be reachable from some test target. - Added
diff-chartssub-command for thehash_benchmark_report.pytool. - Added
bundle-contextsub-command for thehash_benchmark_report.pytool. - Updated
mumboto V5 which aims at improved Instruction-level parallelism (ILP). - Improved publish for
hash_benchmark_report.pywhich updates README.md with the latest benchmark results, charts and quality tables. - Added
--cwdparam tombo/digesttool. - Added the public
mbo::log::ScopedStreamhelpers. The accompanyingMBO_LOG_CHECKexperiment
remains package-private and is not a supported API. - Moved
clang-tidyfromtrunkto the opt-inclang-tidypre-commit hook (tools/clang_tidy.sh). - Fixed
.clang-tidy:WarningsAsErrorsnever escalated findings, and a misspelled option key was dead. - Disabled
llvm-header-guardandllvm-prefer-static-over-anonymous-namespace, which contradictSTYLE_CPP.md. - Fixed
compile_commands-update.shto record the hermetic clang, so clangd and clang-tidy parse what--config=clangbuilds. - Dropped 196 duplicate exec-configuration compile commands via the extractor's new
--bcce-prefer-target-config. - Fixed
IniFile::SetKeyto move itsstd::string&&instead of copying it throughassign. - Removed a pointless
std::floorover integer division inmbo/strings/numbers.h, which round-tripped asize_tthroughdouble. - Fixed
mbo::types::tstring::isto take its ignored argument by const reference rather than by value. - Promoted
clang-tidyto an enforcing pre-commit gate: it now runs automatically on the C++ sources a commit touches, and any finding fails the commit. - Exempted the standard-mandated container member type names (
value_type,size_type, ...) fromreadability-identifier-naming, which demanded CamelCase the standard does not permit. - Disabled
misc-use-internal-linkage(its only fix isstatic, whileSTYLE_CPP.mdwants an anonymous namespace) andreadability-redundant-parentheses(its fix deletes the__builtin_dump_structcallee).
For Bazel MODULES.bazel
bazel_dep(name = "mboworks_mbo", version = "0.14.0")Using the provided LLVM
Copy llvm.MODULE.bazel to your repository's root directory and add the following line to your MODULES.bazel file or paste the whole contents into it.
include("//:llvm.MODULE.bazel")Using the provided development modules
Copy dev.MODULE.bazel to your repository's root directory and add the following line to your MODULES.bazel file or paste the whole contents into it. It provides the dev-only Hedron compile-commands extractor (generates compile_commands.json for clangd) and depend_on_what_you_use.
include("//:dev.MODULE.bazel")What's Changed
- Added
diff-chartssub-command for thehash_benchmark_report.pytool. by @helly25 in #265 - Update
mumboto V5 which aims at improved Instruction-level parallelism (ILP). by @helly25 in #266 - Improved publish command by @helly25 in #267
- Added cwd param to
mbo/digesttool. by @helly25 in #268 - ScopedStream by @helly25 in #269
- Move clang-tidy from trunk to a pre-commit hook, and fix the compile DB by @helly25 in #270
- Disable the CppCoreGuidelines bounds / type-safety profile by @helly25 in #271
- Clear the three most concentrated clang-tidy checks by @helly25 in #272
- Raise the cognitive-complexity threshold to 30 and clear the rest by @helly25 in #273
- Disable misc-include-cleaner by @helly25 in #274
- Apply the safe misc-const-correctness fixes by @helly25 in #275
- Clear readability-identifier-length by renaming, not by configuring by @helly25 in #276
- Adopt the STYLE_CPP.md additions from xff by @helly25 in #277
- Fix the any_scan.h value-param findings caused by #272 by @helly25 in #278
- clang-tidy: parse against libc++ everywhere, and document the real hook setup by @helly25 in #279
- Extract the compile DB in the configuration we develop in by @helly25 in #280
- Drop redundant
typename(C++20 P0634) by @helly25 in #281 - Act on the triage: two checks off, enum-class cleared by @helly25 in #283
- Fix the header guards that were actually wrong, and enforce the rule by @helly25 in #282
- Clear designated-initializers and internal-linkage; drop ifelse-braces by @helly25 in #284
- Clear misc-const-correctness, fix a build break from #275, quiet four checks by @helly25 in #285
- Clear internal-linkage, rvalue-ref and identifier-length remainders by @helly25 in #286
- Apply five auto-fixable checks; disable one that corrupts code by @helly25 in #287
- Silence the CRTP check, and disable the variadic checks in config by @helly25 in #288
- Fix an unchecked optional in diff, and settle the tail checks by @helly25 in #289
- Add a constexpr Contains, and fix a forward-in-a-loop by @helly25 in #290
- Use the Optional matcher instead of assert-then-dereference by @helly25 in #291
- Clear the remaining clang-tidy findings in headers and diff/file/types by @helly25 in #292
- Promote clang-tidy to an enforcing pre-commit gate by @helly25 in #293
- Depend on @rules_cc//cc/runfiles directly, not the bazel_tools shim by @helly25 in #294
- Build //... before extracting the compile DB so virtual includes exist by @helly25 in #295
- Add transparent lookup to LimitedOrdered, and fix a count that never compiled by @helly25 in #297
- Fail clang-tidy on a parse error rather than reporting its wreckage by @helly25 in #298
- Require every cc_library to be reached by a test by @helly25 in #299
- Skip the key conversion in erase when the comparator is transparent by @helly25 in #300
- Extend transparent lookup to every read operation by @helly25 in #302
- Declare CompareLess transparent, and let the benchmark choose its comparator by @helly25 in #303
- Enforce the _cc suffix on cc_library targets, ported from xff by @helly25 in #304
- Test compare_cc, and fix the dependency it never declared by @helly25 in #305
- WIP: fambo + tembo hash family (work in progress — optimization/measurements not final) by @helly25 in #306
- Add tests for libraries that had none by @helly25 in #307
- Drop the redundant -stdlib=libc++ cxxopt from the clang-tidy config by @helly25 in #308
- Override toolchains_llvm to drop the inert -stdlib=libc++ compile flag by @helly25 in #309
- Add tests for the remaining untested libraries by @helly25 in #310
- Adopt the strict per-package test-coverage check by @helly25 in #312
- Require every header to be claimed by its package's BUILD file by @helly25 in #313
- Restore the correct tembo implementation and its full integration by @helly25 in #311
- Stop caching the hermetic LLVM in CI; resolve the symbolizer via runfiles by @helly25 in #314
- Restore the pro-bounds-avoid-unchecked disable that #314 deleted by accident by @helly25 in #317
- Own the warning set: explicit -Wall -Wextra as errors by @helly25 in #316
- Remove the temporary hash_tembo.h allowlist entry by @helly25 in #318
- Enable -Wpedantic as errors with named carve-outs by @helly25 in #319
- Record the measured verdict on pro-bounds-avoid-unchecked-container-access by @helly25 in #315
- Prepare hash/digest kernels for pro-bounds-avoid-unchecked-container-access by @helly25 in #320
- Convert unchecked operator[] in the ordinary-code libraries by @helly25 in #321
- Convert unchecked operator[] in hash/digest/types/container; fix LimitedVector compare by @helly25 in #322
- Enable pro-bounds-avoid-unchecked-container-access by @helly25 in #323
- Fix LimitedVector comparisons for LimitedOptions and int-literal capacities by @helly25 in #324
- Triage the rest of the bounds profile; make hicpp a module decision by @helly25 in #325
- Fix JSON value iterator assignment by @helly25 in #326
- Reject truncated glob ranges safely by @helly25 in #327
- Fix cache cleanup prefix matching by @helly25 in #328
- Handle GetContents seek failures safely by @helly25 in #329
- Report GetMaxLines read failures by @helly25 in #330
- Make NormalizePath native-character safe by @helly25 in #331
- Silence external warnings in exec builds by @helly25 in #332
- Document GitHub Actions versioning policy by @helly25 in #333
- Create release temporary index safely by @helly25 in #334
- Add documentation spell checking by @helly25 in #335
- Add glob conversion fuzz target by @helly25 in #336
- Add string parsing fuzz target by @helly25 in #337
- Add INI parsing fuzz target by @helly25 in #338
- Add diff inputs and options fuzz target by @helly25 in #339
- Fuzz digest checksum parsing by @helly25 in #340
- Remove redundant public header TODO by @helly25 in #342
- Enable UBSan in ASan testing by @helly25 in #341
- Add LCOV coverage gates by @helly25 in #343
- Simplify coverage summary table by @helly25 in #344
- Align coverage category thresholds by @helly25 in #345
- Raise coverage to shared category floors by @helly25 in #346
- Fix alphabetic hexadecimal escape parsing by @helly25 in #347
- ci: publish coverage reports to GitHub Pages by @helly25 in #348
- Fix independent quote parsing options by @helly25 in #349
- Adopt shared contributor style guidance by @helly25 in #350
- Publish durable indexed coverage reports by @helly25 in #351
- Update compile command extractor by @helly25 in #352
- Normalize matcher function coverage by @helly25 in #353
- Reuse clang-tidy config for compile DB tool by @helly25 in #354
- Normalize tstring branch coverage by @helly25 in #355
- Cover hash internal utilities directly by @helly25 in #356
- Normalize hash branch coverage by @helly25 in #357
- Normalize log function coverage by @helly25 in #358
- Make OptionalDataOrRef lifetime safe by @helly25 in #359
- Unify coverage policy presentation by @helly25 in #360
- Unify coverage ratings and enforcement by @helly25 in #361
- Preserve review protection for release bumps by @helly25 in #367
- Add strict INI parsing by @helly25 in #370
- Fix Required replacement and generic operations by @helly25 in #362
- Publish only the requested release tag by @helly25 in #366
- Add owning-or-borrowing StringOrView by @helly25 in #377
- Cancel superseded validation runs by @helly25 in #374
- Enforce measured coverage baseline by @helly25 in #369
- Cover header-only changes with clang-tidy by @helly25 in #368
- Fix NoDestruct construction and customizations by @helly25 in #363
- Run validation in pull request context by @helly25 in #372
- Enforce spelling in C++ sources by @helly25 in #375
- Complete StringOrView text integration by @helly25 in #378
- Integrate Json correctness and repository hardening by @helly25 in #364
- Define autonomous Git orchestration rules by @helly25 in #379
- Provide the canonical fast GLOB and SHGLOB implementation by @helly25 in #371
- Improve behavioral coverage across core modules by @helly25 in #380
- Make function and branch coverage actionable by @helly25 in #381
- Raise line coverage and bound CI caches by @helly25 in #382
- Raise types branch coverage to 86 percent by @helly25 in #383
- Support SHGLOB brace sequences by @helly25 in #384
- Complete the 0.13.3 changelog by @helly25 in #385
- Prepare version 0.14.0 by @helly25 in #386
- Migrate mbo to MBO Works by @helly25 in #387
- Report parallel clang-tidy progress by @helly25 in #388
- Set package ecosystem to 'bazel' in dependabot config by @helly25 in #389
- Bump rules_fuzzing from 0.6.0 to 0.8.0 by @dependabot[bot] in #391
- Bump rules_cc from 0.2.21 to 0.2.22 by @dependabot[bot] in #393
- Bump bazel_skylib from 1.9.0 to 1.9.2 by @dependabot[bot] in #392
- Bump googletest from 1.17.0.bcr.2 to 1.18.0.bcr.1 by @dependabot[bot] in #390
- Bump depend_on_what_you_use from 0.16.0 to 1.1.2 by @dependabot[bot] in #394
- Prepare mbo 0.14.0 with toolchains_llvm 1.9.0 by @helly25 in #395
New Contributors
- @dependabot[bot] made their first contribution in #391
Full Changelog: 0.13.2...0.14.0