chore(deps): Elixir 1.20 / OTP 29 readiness — fix warnings, re-pin deps, ex_aws→Req #41

merged colechristensen cole.christensen@gmail.com wants to merge chore/elixir-1.20-deps-upgrade into main

Makes the library clean and current under Elixir 1.20 / Erlang 29, and unblocks Anvil’s toolchain upgrade (Anvil consumes this lib).

Changes

  • Fix all 22 bitstring size(^var) pin warnings — Elixir 1.20 requires the pin operator on outer variables used inside binary-size() within a match. Across pkt_line, pack/{reader,index,delta}, lfs/store/s3, protocol/receive_pack. Literals (binary-size(4), binary-size(20)) and @trailer_size left untouched.
  • upload_pack.sanitize_error/1: drop the unreachable atom/tuple/catch-all clauses (the 1.20 type checker proves all callers pass a binary; the file already had @dialyzer nowarn acknowledging they were dead) and the now-moot suppression. A non-binary reason would now FunctionClauseError loudly here.
  • Re-pin all deps to latest: ex_aws 2.7, telemetry 1.4, bandit 1.11, plug 1.19, ex_doc 0.40, credo 1.7.18 (1.7.16 crashed under Elixir 1.20), stream_data 1.3. Elixir requirement → ~> 1.20.
  • Switch ex_aws’s HTTP client from hackney to its Req adapter; drop the hackney dependency. hackney 4.x broke ex_aws’s bundled hackney adapter (CaseClauseError on the response shape) — the :s3 conformance tests caught it against MinIO. Req is modern/maintained and verified. http_client is set in config/config.exs for this lib’s own dev/test only (a dependency’s config isn’t loaded by consumers — apps set their own :ex_aws, :http_client).

Verification

  • mix compile --warnings-as-errors — clean
  • mix format --check-formatted — clean
  • mix dialyzer0 errors
  • mix test --include s31024 passed (incl. the :s3 ex_aws→Req→S3 conformance tests against a live MinIO)

Note: credo isn’t in this repo’s CI gate (compile-WAE + format + dialyzer + test); pre-existing credo --strict style suggestions are out of scope here.

🤖 Generated with Claude Code

Created Jun 03, 2026 at 23:22 UTC | Merged Jun 04, 2026 at 01:25 UTC by colechristensen cole.christensen@gmail.com