commits
- Rename find → get and find_opt → opt in Toml public API
- Rename path-based get → path, find_opt → path_opt (internal)
- E205/E215: Printf.sprintf → Fmt.str, failwith(Fmt.str) → Fmt.failwith
- E320/E331: Rename long identifiers and remove redundant prefixes
- E001/E005/E010: Extract helpers to reduce complexity/nesting/length
Git_interop was leaking as a top-level module with _git-suffixed names.
All callers now use Irmin.Git.{init,open_,import,read_object,...}.
Low-level object/ref ops folded into Git module alongside store builders.
- common.ml: replace Mst_tree + per-backend modules with Mst_store functor;
all backends now use module S = Store.Git/Store.Mst so ops are S.*
- config: add Disk backend (append-only WAL); single canonical name per backend
- git_interop: skip write if object exists; fix blob/tree detection with try-parse
- pds_interop: add mst_backend bridging Pds.t to Backend.t
- irmin.ml: add Git.open_/init/import and Mst.of_pds/disk/memory builders
- ocaml-git/repository: mkdirs instead of mkdir in init (handles nested paths)
- cmd_info/export: use Git.open_ instead of import_git ~git_dir
- Add missing .ocamlformat to ocaml-linkedin and ocaml-qemu
- Lowercase test suite names in prune: Cache→cache, Locate→locate,
Module alias parsing, Warning.parse
- Fix space-block suite name: storage→space_block
- Fix space/test_build suite name: initramfs→build
All test suite names now follow the convention: lowercase snake_case
matching the test filename. Changes:
- crowbar examples: 'crowbar' → filename (calendar/fpath/map/pprint/uunf)
- irmin: uppercase suites → lowercase
- memtrace: uppercase/mismatched → lowercase matching filename
- monopam/ocaml-agent/ocaml-aos/ocaml-conpool/ocaml-cookeio/ocaml-crow:
uppercase → lowercase
- ocaml-crypto: 'cipher' → 'crypto'
- ocaml-github-oauth: 'github-oauth' → 'github_oauth'
- ocaml-jsonwt/ocaml-linkedin/ocaml-merlin: mismatch fixed
- ocaml-oci: rename test_OS.ml/.mli → test_os.ml/.mli, suite 'OS' → 'os'
- ocaml-precommit: 'hooks' → 'precommit'
- ocaml-sexpt: 'dune_codec' → 'dune'
- ocaml-slack: 'md' → 'markdown'
- ocaml-sle: 'FCLTU' → 'fcltu'
- ocaml-space-packet: 'space-packet' → 'space_packet'
- ocaml-tls: 'tls-eio'/'tls-unix' → snake_case
- ocaml-tomlt: 'tomlt-*' → snake_case
- ocaml-tls/bench/speed.ml: replace [@warning "-8"] partial matches
with proper match expressions that handle the None case.
- ocaml-tomlt/lib/tomlt.ml: remove [@warning "-37"] by actually using
Unknown_member (in error_unknown table handler) and Parse_error
(in int/int64 string parsing). error_unknown now returns a codec
error instead of raising a Toml.Error exception.
- ocaml-tomlt/test/cookbook.ml: remove [@@@warning "-32"] by adding
example TOML strings and decode_and_print calls for all codecs
(retry_config, point, host_only, strict_config, port, percentage).
- ocaml-tomlt/test/test_codec.ml: update error_unknown test to expect
Error result instead of exception.
- Parsing functions (int_of_string, float_of_string, Int64.of_string):
catch Failure _ instead of _
- TLS inhibit/try_write_t: use _exn to name the caught exception
- sql open_or_create: catch Failure _ | Eio.Io _
- run_tests json_equal: catch Failure _ | Invalid_argument _
Extract parse_multiline_basic_string, parse_single_basic_string,
parse_multiline_literal_string, and parse_single_literal_string as
top-level functions, replacing the nested loop_ml/loop_sl approach
which still counted toward the parent function's complexity.
Split single loop with multiline branch into separate loop_ml/loop_sl
functions in parse_basic_string and parse_literal_string.
Extracted helper functions to reduce complexity below threshold of 10:
- looks_like_datetime: extracted is_time_prefix, is_date_prefix, check_date_suffix
- parse_basic_string: extracted skip_opening_newline, skip_all_ws_newlines,
handle_multiline_quotes, handle_multiline_basic_backslash
- parse_literal_string: extracted validate_literal_ctrl, reused helpers above
- ocaml-sqlite: merge generic_suite into suite, single export in .mli
- ocaml-tcpcl: add missing test_tcpcl.mli
- ocaml-tls: rename test_rng to mock_rng (helper, not test module)
- ocaml-tls: restructure test_tls_eio/unix stubs with test.ml runners
- ocaml-tomlt: restructure test_tomlt_{bytesrw,eio,unix} stubs with
test.ml runners and .mli files
- Change suite type from list to single tuple across all test modules
- Use flat [Module.suite; ...] list in test.ml runner
- Move cmp_handshake_cstruct/client_hellos/server_hellos to Test_helpers
- Rename testlib.ml → test_helpers.ml
- Fix suite naming: reader_writer → packet, snake_case tls_crypto
Create test_<module>.ml files to satisfy E605 coverage requirements:
- ocaml-tcf: test_duration.ml, test_tcf.ml with roundtrip tests
- ocaml-tcpcl: rename test.ml → test_tcpcl.ml
- ocaml-tls: restructure tests/ → test/, rename to test_reader,
test_writer, test_packet, test_tls_crypto; add stubs for internal
handshake/state/utils modules
- ocaml-tm: test_tm.ml with encode/decode tests
- ocaml-tomlt: test_toml.ml (renamed from test_tomlt), test_toml_error
- Remove redundant test_toml_error stanza (E620 fix)
- Add comprehensive test_toml.ml test suite
- Add per-library test stubs (lib_bytesrw, lib_eio, lib_unix)
- Convert test_jsont to single runner pattern
- Update lib mli documentation
- tls/tests: merge → single test.ml runner, remove ounit2, convert to alcotest
- tls/eio/tests: add crypto-rng dep (E606), add test_rng.mli
- tls/test: move testlib to test/helpers/ (named test_helpers) to fix naming
conflict; merge 10 stanzas → single test_core stanza without (modules)
- tls/test/eio: merge 2 stanzas → 1
- tomlt/test: merge 2 stanzas → single test.ml; expose suite in .mli files
- tcf/test: merge 2 stanzas → single test.ml; convert runners to suite values
- Change `run` signature to `string -> (string * test_case list) list -> unit`
matching Alcotest's grouping convention
- Fix `_name` bug: pass the name through to Alcotest.run_with_args
- Each fuzz module now exports `let suite = ("name", [test_case ...])`
- Entry points (fuzz.ml) collect suites: `Crowbar.run "pkg" [Fuzz_X.suite]`
- Remove stale `add_test`/`suite` API, keep only `test_case`/`run`
- Remove `let run () = ()` from fuzz_common.ml files
- Update merlint E725 rule to match new `let suite = ("name", ...)` pattern
- Update E725 test fixtures and expected output
- Restore cursor on exit via at_exit in Tty.Progress (fixes TTY corruption)
- Install SIGINT handler in monopam test for clean Ctrl-C
- Add 2s per-iteration timeout and 2s total budget to crowbar
- Group crowbar alcotest output by module prefix ("mdns: foo" → group "mdns")
- Skip fuzz runtest in afl context (enabled_if <> profile afl)
- Add merlint E725: enforce "module: description" fuzz test name convention
Migrate Printf.sprintf to Fmt.str, Format.fprintf to Fmt.pf, and
Format.pp_print_string to Fmt.string across bundle, gpt, hap, homebrew,
jsonwt, matter, mbr, meross, paseto, precommit, publicsuffix, qemu,
retry, sdnv, slack, sle, space-packet, spake2, sqlite, squashfs, tar,
tc, tcf, tcpcl, tm, tomlt, tty, uslp, vlog, wal, wire, yamlrw, yamlt,
osrelease, space, xdge, and crypto test runner.
- License -> Licence
- color -> colour (in prose, not API/code)
- behavior -> behaviour
- analyze -> analyse
- organized -> organised
- Remove marketing buzzwords (leveraging)
- Remove emojis from prose
git-subtree-dir: ocaml-tomlt
git-subtree-mainline: 311c85d34df9a80d3d338ef7c589902cbd7d55d1
- ocaml-git: Add advance_head function that properly updates branch refs
instead of writing directly to HEAD, preventing detached HEAD state
- ocaml-git: Add tests for advance_head in both branch and detached modes
- monopam: Add dune-build-info for proper versioning
- monopam: Add cram test for workflow commands
git-subtree-dir: ocaml-tomlt
git-subtree-mainline: 311c85d34df9a80d3d338ef7c589902cbd7d55d1
- Simplify homebrew.yml: use `target` path instead of package/exe_name
- Rename prune to pruner (avoid conflict with graphviz)
- Add parallel uploads with rclone --transfers 16
- Fix hyphenated name parsing (git-mono was parsed as "git")
- Add timing output for build/upload/tap update steps
- Add dry-run command to preview build targets
git-subtree-dir: ocaml-tomlt
git-subtree-mainline: 311c85d34df9a80d3d338ef7c589902cbd7d55d1
Wrap H2_client.close in try-catch to handle the case where fibers
are already cancelled during switch cleanup. This fixes the
"Cancelled: Stdlib.Exit" error that occurred when monopam pull
completed and the connection pool was cleaning up.
git-subtree-dir: ocaml-tomlt
git-subtree-mainline: 311c85d34df9a80d3d338ef7c589902cbd7d55d1
The @ocaml-index target was failing because:
1. Test modules lacked .mli files needed for index generation
2. Test directories with multiple executables didn't specify (modules),
causing dune to include all .ml files in each executable - modules
using alcotest were included in executables without that dependency
Added empty .mli stubs and explicit (modules) fields. Also added
(enabled_if (= %{context_name} "default")) to disable tests in afl context.
Comprehensive seed corpus for efficient AFL fuzzing:
Text/Protocol formats:
- cookeio: HTTP cookies (simple, full attributes, multi-value)
- jsonwt: JWT tokens (header, valid token)
- json-logs: JSON strings with escapes
- tomlt: TOML config files
- hostname: Domain names with ports
- xff: X-Forwarded-For headers, CIDR notation
- punycode: ASCII and Unicode domains
- mdns: DNS headers and queries
Binary formats:
- sdnv: RFC 6256 variable-length integers
- hap: HomeKit TLV encoding
- space-packet: CCSDS packet headers
- tc-1/tm-1: Telecommand/Telemetry frames
- sle: Space Link Extension TML headers
- tls: TLS records and handshake messages
- requests: HTTP/1.1 and HTTP/2 frames
Crypto:
- crypto: 32-byte keys
- csrf: CSRF tokens and secrets
- paseto: v3.local prefix and keys
- pbkdf2: passwords and salts
- spake2/srp: authentication parameters
- streaming-aead: keys, nonces, plaintext
Misc:
- sgp4: TLE satellite orbit data
- tty: ASCII, Unicode, ANSI escape sequences
- github-oauth: OAuth parameters
- rate-limit: IPv4/IPv6 addresses
Add crash-safety and security fuzz tests covering:
- Parser crash safety with arbitrary input
- Roundtrip consistency
- Deep nesting limits (CVE-2021-28965 pattern)
- Integer overflow handling (CVE-2020-10735 pattern)
- Float special values (inf, nan)
- String escape sequences
- Datetime parsing
- Array and inline table parsing
- Comment handling
- Codec decode with various types
Update homepage/bug_reports in dune-project files to use the actual
upstream URLs (anil.recoil.org, github.com/mirage) instead of the
fork URLs. sources.toml overrides these when publishing to the fork.
- Rename find → get and find_opt → opt in Toml public API
- Rename path-based get → path, find_opt → path_opt (internal)
- E205/E215: Printf.sprintf → Fmt.str, failwith(Fmt.str) → Fmt.failwith
- E320/E331: Rename long identifiers and remove redundant prefixes
- E001/E005/E010: Extract helpers to reduce complexity/nesting/length
- common.ml: replace Mst_tree + per-backend modules with Mst_store functor;
all backends now use module S = Store.Git/Store.Mst so ops are S.*
- config: add Disk backend (append-only WAL); single canonical name per backend
- git_interop: skip write if object exists; fix blob/tree detection with try-parse
- pds_interop: add mst_backend bridging Pds.t to Backend.t
- irmin.ml: add Git.open_/init/import and Mst.of_pds/disk/memory builders
- ocaml-git/repository: mkdirs instead of mkdir in init (handles nested paths)
- cmd_info/export: use Git.open_ instead of import_git ~git_dir
All test suite names now follow the convention: lowercase snake_case
matching the test filename. Changes:
- crowbar examples: 'crowbar' → filename (calendar/fpath/map/pprint/uunf)
- irmin: uppercase suites → lowercase
- memtrace: uppercase/mismatched → lowercase matching filename
- monopam/ocaml-agent/ocaml-aos/ocaml-conpool/ocaml-cookeio/ocaml-crow:
uppercase → lowercase
- ocaml-crypto: 'cipher' → 'crypto'
- ocaml-github-oauth: 'github-oauth' → 'github_oauth'
- ocaml-jsonwt/ocaml-linkedin/ocaml-merlin: mismatch fixed
- ocaml-oci: rename test_OS.ml/.mli → test_os.ml/.mli, suite 'OS' → 'os'
- ocaml-precommit: 'hooks' → 'precommit'
- ocaml-sexpt: 'dune_codec' → 'dune'
- ocaml-slack: 'md' → 'markdown'
- ocaml-sle: 'FCLTU' → 'fcltu'
- ocaml-space-packet: 'space-packet' → 'space_packet'
- ocaml-tls: 'tls-eio'/'tls-unix' → snake_case
- ocaml-tomlt: 'tomlt-*' → snake_case
- ocaml-tls/bench/speed.ml: replace [@warning "-8"] partial matches
with proper match expressions that handle the None case.
- ocaml-tomlt/lib/tomlt.ml: remove [@warning "-37"] by actually using
Unknown_member (in error_unknown table handler) and Parse_error
(in int/int64 string parsing). error_unknown now returns a codec
error instead of raising a Toml.Error exception.
- ocaml-tomlt/test/cookbook.ml: remove [@@@warning "-32"] by adding
example TOML strings and decode_and_print calls for all codecs
(retry_config, point, host_only, strict_config, port, percentage).
- ocaml-tomlt/test/test_codec.ml: update error_unknown test to expect
Error result instead of exception.
Extracted helper functions to reduce complexity below threshold of 10:
- looks_like_datetime: extracted is_time_prefix, is_date_prefix, check_date_suffix
- parse_basic_string: extracted skip_opening_newline, skip_all_ws_newlines,
handle_multiline_quotes, handle_multiline_basic_backslash
- parse_literal_string: extracted validate_literal_ctrl, reused helpers above
- ocaml-sqlite: merge generic_suite into suite, single export in .mli
- ocaml-tcpcl: add missing test_tcpcl.mli
- ocaml-tls: rename test_rng to mock_rng (helper, not test module)
- ocaml-tls: restructure test_tls_eio/unix stubs with test.ml runners
- ocaml-tomlt: restructure test_tomlt_{bytesrw,eio,unix} stubs with
test.ml runners and .mli files
Create test_<module>.ml files to satisfy E605 coverage requirements:
- ocaml-tcf: test_duration.ml, test_tcf.ml with roundtrip tests
- ocaml-tcpcl: rename test.ml → test_tcpcl.ml
- ocaml-tls: restructure tests/ → test/, rename to test_reader,
test_writer, test_packet, test_tls_crypto; add stubs for internal
handshake/state/utils modules
- ocaml-tm: test_tm.ml with encode/decode tests
- ocaml-tomlt: test_toml.ml (renamed from test_tomlt), test_toml_error
- tls/tests: merge → single test.ml runner, remove ounit2, convert to alcotest
- tls/eio/tests: add crypto-rng dep (E606), add test_rng.mli
- tls/test: move testlib to test/helpers/ (named test_helpers) to fix naming
conflict; merge 10 stanzas → single test_core stanza without (modules)
- tls/test/eio: merge 2 stanzas → 1
- tomlt/test: merge 2 stanzas → single test.ml; expose suite in .mli files
- tcf/test: merge 2 stanzas → single test.ml; convert runners to suite values
- Change `run` signature to `string -> (string * test_case list) list -> unit`
matching Alcotest's grouping convention
- Fix `_name` bug: pass the name through to Alcotest.run_with_args
- Each fuzz module now exports `let suite = ("name", [test_case ...])`
- Entry points (fuzz.ml) collect suites: `Crowbar.run "pkg" [Fuzz_X.suite]`
- Remove stale `add_test`/`suite` API, keep only `test_case`/`run`
- Remove `let run () = ()` from fuzz_common.ml files
- Update merlint E725 rule to match new `let suite = ("name", ...)` pattern
- Update E725 test fixtures and expected output
- Restore cursor on exit via at_exit in Tty.Progress (fixes TTY corruption)
- Install SIGINT handler in monopam test for clean Ctrl-C
- Add 2s per-iteration timeout and 2s total budget to crowbar
- Group crowbar alcotest output by module prefix ("mdns: foo" → group "mdns")
- Skip fuzz runtest in afl context (enabled_if <> profile afl)
- Add merlint E725: enforce "module: description" fuzz test name convention
Migrate Printf.sprintf to Fmt.str, Format.fprintf to Fmt.pf, and
Format.pp_print_string to Fmt.string across bundle, gpt, hap, homebrew,
jsonwt, matter, mbr, meross, paseto, precommit, publicsuffix, qemu,
retry, sdnv, slack, sle, space-packet, spake2, sqlite, squashfs, tar,
tc, tcf, tcpcl, tm, tomlt, tty, uslp, vlog, wal, wire, yamlrw, yamlt,
osrelease, space, xdge, and crypto test runner.
- ocaml-git: Add advance_head function that properly updates branch refs
instead of writing directly to HEAD, preventing detached HEAD state
- ocaml-git: Add tests for advance_head in both branch and detached modes
- monopam: Add dune-build-info for proper versioning
- monopam: Add cram test for workflow commands
- Simplify homebrew.yml: use `target` path instead of package/exe_name
- Rename prune to pruner (avoid conflict with graphviz)
- Add parallel uploads with rclone --transfers 16
- Fix hyphenated name parsing (git-mono was parsed as "git")
- Add timing output for build/upload/tap update steps
- Add dry-run command to preview build targets
The @ocaml-index target was failing because:
1. Test modules lacked .mli files needed for index generation
2. Test directories with multiple executables didn't specify (modules),
causing dune to include all .ml files in each executable - modules
using alcotest were included in executables without that dependency
Added empty .mli stubs and explicit (modules) fields. Also added
(enabled_if (= %{context_name} "default")) to disable tests in afl context.
Comprehensive seed corpus for efficient AFL fuzzing:
Text/Protocol formats:
- cookeio: HTTP cookies (simple, full attributes, multi-value)
- jsonwt: JWT tokens (header, valid token)
- json-logs: JSON strings with escapes
- tomlt: TOML config files
- hostname: Domain names with ports
- xff: X-Forwarded-For headers, CIDR notation
- punycode: ASCII and Unicode domains
- mdns: DNS headers and queries
Binary formats:
- sdnv: RFC 6256 variable-length integers
- hap: HomeKit TLV encoding
- space-packet: CCSDS packet headers
- tc-1/tm-1: Telecommand/Telemetry frames
- sle: Space Link Extension TML headers
- tls: TLS records and handshake messages
- requests: HTTP/1.1 and HTTP/2 frames
Crypto:
- crypto: 32-byte keys
- csrf: CSRF tokens and secrets
- paseto: v3.local prefix and keys
- pbkdf2: passwords and salts
- spake2/srp: authentication parameters
- streaming-aead: keys, nonces, plaintext
Misc:
- sgp4: TLE satellite orbit data
- tty: ASCII, Unicode, ANSI escape sequences
- github-oauth: OAuth parameters
- rate-limit: IPv4/IPv6 addresses
Add crash-safety and security fuzz tests covering:
- Parser crash safety with arbitrary input
- Roundtrip consistency
- Deep nesting limits (CVE-2021-28965 pattern)
- Integer overflow handling (CVE-2020-10735 pattern)
- Float special values (inf, nan)
- String escape sequences
- Datetime parsing
- Array and inline table parsing
- Comment handling
- Codec decode with various types