build-cran-binaries/.superpowers/handoff/final-fix2-bincraft-report.md

2.2 KiB

final-fix2-bincraft-report

Summary

Critical correctness fix for the bincraftr package-patching feature. Without Built: in the PACKAGES index, pak recompiles from the source tarball, silently discarding build-time fixes baked in at patch time (e.g. RCPP_PARALLEL_USE_TBB=0).


Fix 1 — production code (R/patches.R)

One-line change in prepare_patched_repo():

# BEFORE (broken)
tools::write_PACKAGES(contrib, type = "source")

# AFTER (fixed)
tools::write_PACKAGES(contrib, type = "source", fields = "Built")

tools::write_PACKAGES only emits extra fields when explicitly requested via the fields argument. Without it, the Built: line present in the tarball's DESCRIPTION is silently dropped from the PACKAGES index.


Fix 2 — regression test (tests/testthat/test-patches.R)

Test: "prepare_patched_repo src/contrib layout is resolvable by available.packages"

Two additions:

  1. The minimal pkgfoo DESCRIPTION written into the tarball now includes a Built: line:

    Built: R 4.5.3; x86_64-pc-linux-gnu; 2026-06-30 00:00:00 UTC; unix
    

    This makes the tarball look like a real prebuilt binary package.

  2. After prepare_patched_repo(...), a new assertion checks the index:

    pkgs <- readLines(file.path(out, "src", "contrib", "PACKAGES"))
    expect_true(any(grepl("^Built:", pkgs)))
    

The real tools::write_PACKAGES is used (not mocked) so the assertion is meaningful. The older "serves a cached binary and writes an index" test continues to mock tools::write_PACKAGES — that is intentional (it tests orchestration only).


RED / GREEN evidence

Verified with a standalone script calling the real tools::write_PACKAGES on an identical tarball:

RED  (old, type="source", no fields)  — Built in PACKAGES: FALSE
GREEN (new, type="source", fields="Built") — Built in PACKAGES: TRUE

Test run (post-fix)

[ FAIL 0 | WARN 0 | SKIP 1 | PASS 42 ]

SKIP: e2e test (BINCRAFT_PATCH_E2E not set) — expected. All 42 unit/integration tests pass.


Commit

10e610f fix(patches): preserve Built field so pak installs patched binary without recompiling

Branch: feat/package-patching Repo: /Users/pjs/git/codefloe.com/rpkgs/bincraftr