Skip to content

0.14.0

Latest

Choose a tag to compare

@github-actions github-actions released this 30 Aug 19:33
· 18 commits to main since this release
0.14.0
4eef7f8

Version 0.14.0

Changelog

  • Updated the bundled LLVM setup to the official toolchains_llvm 1.9.0 prerelease commit while
    its BCR publication is pending, removing the remaining helly25/toolchains_llvm fork 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 to mboworks_mbo, and
    migrated shell tests to mboworks_bashtest@0.6.1. Historical helly25_mbo releases 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/**/bar matches foo/bar and any number of intervening directory levels.
  • Added mbo::StringOrView, a read-only string-like value that either owns a std::string or
    borrows a std::string_view. It exposes the full applicable string/string-view interface,
    comparisons, C++23-style contains/subview, stream and Abseil formatting, plus Abseil and
    std::hash integration.
  • Fixed OptionalDataOrRef construction and assignment so borrowed values cannot silently become
    dangling references; added the corresponding lifetime constraints and tests.
  • Fixed Required replacement and generic operations, including move-only values and converting
    construction/assignment, while preserving its configurable failure behavior.
  • Fixed NoDestruct construction 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 NormalizePath preserve the filesystem's native character type instead of assuming narrow
    characters.
  • Made GetContents report seek failures and GetMaxLines report 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 rated GOOD, including mbo/types at 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 aggregate done gate.
  • 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 over std::size_t capacities while the class takes auto: instances spelled via MakeLimitedVector/LimitedOptions or an int literal matched no operator at all and failed to compile.
  • Enabled cppcoreguidelines-pro-bounds-avoid-unchecked-container-access: unchecked operator[] 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 scoped NOLINT blocks.
  • Fixed LimitedVector comparison operators (==, <=>, <), which looped to min of the CAPACITIES instead of the sizes: comparing partially-filled vectors read uninitialized slots (or threw in a require-throws build). Found by pro-bounds-avoid-unchecked-container-access.
  • Converted unchecked operator[] to .at()/std::get (or a reasoned NOLINT in benchmarks' timed loops and compile-time code) across the hash, digest, json, types and container libraries.
  • Converted unchecked operator[] to .front()/.at() (or a reasoned NOLINT on hot paths) across the diff, strings, log, mope, file and testing libraries, preparing pro-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 in decompose_count.h) are annotated __extension__ in code. The bazel-7/8 compat CI rungs relax it because those bazels half-apply external_include_paths and leak external-header findings.
  • Removed the temporary hash_tembo.h allowlist 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, with missing-field-initializers suppressed as the deliberate designated-init idiom; previously only -Werror was 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-symbolizer via runfiles so a fresh LLVM fetch location cannot break asan/tsan.
  • Added a headers-claimed pre-commit check: every tracked header must be listed in its package's BUILD file. Found hash_tembo.h orphaned since #306 on its first run (temporarily allowlisted; re-listed by #311).
  • Replaced the reachability-based library-test-coverage hook with xff's strict rule: every cc_library needs a test in its own package with a direct dependency; exceptions live in the tool's _ALLOWLIST with 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 (_cc naming, per-package tests, no braced-init-list iteration, lhs/rhs comparator parameters).
  • Added tests for hash_extra_cc, hash_internal_util_cc, mope_cc, ini_cc, runfiles_dir_cc, extend_cc, extender_cc and test_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-argument suppression: the hermetic toolchain resolves libc++ headers via -cxx-isystem and 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 official toolchains_llvm 1.9.0 prerelease selected by git_override until BCR publication.
  • Removed the redundant --cxxopt=-stdlib=libc++ from the clang-tidy bazel config; the hermetic toolchain already passes it, so it appeared twice and produced "unused argument" warnings.
  • Fixed mbo::file::GetMTime on libstdc++: it read std::filesystem::file_clock time 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_cc and require_cc.
  • Fixed mbo::types::TypedView to derive from std::ranges::view_interface PUBLICLY; 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 always false: its recursion specialised the out-of-range case, so an in-range index fell through to the false_type primary template.
  • Added mbo/types:variant_test and mbo/log:demangle_test.
  • Added mbo/types:compare_test, covering CompareLess, CompareFloat's NaN total order and CompareScalar's mixed-signedness branches.
  • Fixed //mbo/types:compare_cc to declare its dependency on traits_cc, which it includes but never listed.
  • Added a cc-target-naming pre-commit check (ported from helly25/xff): cc_library target names must end in _cc. Renamed hash_internal_util and hash_test_util accordingly.
  • mbo::types::CompareLess now declares is_transparent, so its existing heterogeneous overloads are reachable through LimitedSet/LimitedMap instead 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), and index_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/LimitedMap erase no 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 declares is_transparent, find, contains, count, index_of, lower_bound, upper_bound and equal_range accept any type the comparator can order against the key, without constructing a key.
  • Fixed LimitedOrdered::count which returned last - false instead of last - first and did not compile at all (no test instantiated it).
  • Added a library-test-coverage pre-commit check: every cc_library under //mbo/... must be reachable from some test target.
  • Added diff-charts sub-command for the hash_benchmark_report.py tool.
  • Added bundle-context sub-command for the hash_benchmark_report.py tool.
  • Updated mumbo to V5 which aims at improved Instruction-level parallelism (ILP).
  • Improved publish for hash_benchmark_report.py which updates README.md with the latest benchmark results, charts and quality tables.
  • Added --cwd param to mbo/digest tool.
  • Added the public mbo::log::ScopedStream helpers. The accompanying MBO_LOG_CHECK experiment
    remains package-private and is not a supported API.
  • Moved clang-tidy from trunk to the opt-in clang-tidy pre-commit hook (tools/clang_tidy.sh).
  • Fixed .clang-tidy: WarningsAsErrors never escalated findings, and a misspelled option key was dead.
  • Disabled llvm-header-guard and llvm-prefer-static-over-anonymous-namespace, which contradict STYLE_CPP.md.
  • Fixed compile_commands-update.sh to record the hermetic clang, so clangd and clang-tidy parse what --config=clang builds.
  • Dropped 196 duplicate exec-configuration compile commands via the extractor's new --bcce-prefer-target-config.
  • Fixed IniFile::SetKey to move its std::string&& instead of copying it through assign.
  • Removed a pointless std::floor over integer division in mbo/strings/numbers.h, which round-tripped a size_t through double.
  • Fixed mbo::types::tstring::is to take its ignored argument by const reference rather than by value.
  • Promoted clang-tidy to 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, ...) from readability-identifier-naming, which demanded CamelCase the standard does not permit.
  • Disabled misc-use-internal-linkage (its only fix is static, while STYLE_CPP.md wants an anonymous namespace) and readability-redundant-parentheses (its fix deletes the __builtin_dump_struct callee).

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-charts sub-command for the hash_benchmark_report.py tool. by @helly25 in #265
  • Update mumbo to 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/digest tool. 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

Full Changelog: 0.13.2...0.14.0