3.9 KiB
3.9 KiB
Task A6 Report: Wire patched repo into the pak install path
Status: COMPLETE
TDD Evidence
RED (failing test)
Added the new test to tests/testthat/test-patches.R (before the prepare_patched_repo serves a cached binary test).
Run output:
ERROR: 'test-patches.R:184:3' ---------------------
Error in `run_pak_install_with_mutex(tempfile(), list(), patched_repo = "/tmp/patched")`: unused argument (patched_repo = "/tmp/patched")
[ FAIL 1 | WARN 0 | SKIP 0 | PASS 35 ]
GREEN (all pass)
After applying the two file edits:
[ FAIL 0 | WARN 0 | SKIP 0 | PASS 36 ]
Commit
SHA: e2c74c9
Subject: feat(patches): serve patched binaries to pak during dep install
Branch: feat/package-patching
Files changed: 3 (60 insertions, 8 deletions)
Diff Hunks Applied
R/install_helpers.R — signature expansion + repos-prepend wrapper
-run_pak_install_with_mutex <- function(local_clone_dir_single, env_vars) {
+run_pak_install_with_mutex <- function(
+ local_clone_dir_single,
+ env_vars,
+ patched_repo = NULL
+) {
- retry_with_backoff(function() {
- withr::with_envvar(env_vars, {
- # Default to non-verbose (suppressed messages)
- suppressMessages(pak::local_install_deps(sprintf(
- "%s",
- local_clone_dir_single
- )))
- })
- })
+ retry_with_backoff(function() {
+ withr::with_envvar(env_vars, {
+ repos <- getOption("repos")
+ if (!is.null(patched_repo)) {
+ repos <- c(
+ patched = sprintf("file://%s", patched_repo),
+ repos
+ )
+ }
+ withr::with_options(list(repos = repos), {
+ # Default to non-verbose (suppressed messages)
+ suppressMessages(pak::local_install_deps(sprintf(
+ "%s",
+ local_clone_dir_single
+ )))
+ })
+ })
+ })
R/install-deps.R — signature expansion + patched_repo block
install_pkg_sys_deps <- function(
package_name,
tag,
local_clone_dir,
platform = platform,
- aggressive_cleanup = FALSE
+ aggressive_cleanup = FALSE,
+ patches = NULL,
+ arch = NULL
) {
+ # Build a local repo of patched binaries (if any apply) and serve it to pak.
+ r_minor <- paste(
+ R.version$major,
+ strsplit(R.version$minor, ".", fixed = TRUE)[[1L]][1L],
+ sep = "."
+ )
+ patched_repo <- tryCatch(
+ prepare_patched_repo(patches, platform, arch, r_minor),
+ error = function(e) {
+ log_warn(sprintf("Patch preparation failed: %s", conditionMessage(e)))
+ NULL
+ }
+ )
+
# Run installation with mutex protection
run_pak_install_with_mutex(
local_clone_dir_single,
- env_vars
+ env_vars,
+ patched_repo = patched_repo
)
tests/testthat/test-patches.R — new test appended before the cached-binary test
test_that("run_pak_install_with_mutex prepends the patched repo to repos", {
seen <- NULL
local_mocked_bindings(
acquire_pak_mutex = function(...) tempfile(),
release_pak_mutex = function(...) invisible(NULL),
retry_with_backoff = function(func, ...) func()
)
local_mocked_bindings(
local_install_deps = function(...) {
seen <<- getOption("repos")
invisible(TRUE)
},
.package = "pak"
)
run_pak_install_with_mutex(
tempfile(), list(), patched_repo = "/tmp/patched"
)
expect_true(any(grepl("file:///tmp/patched", seen)))
})
Concerns
None.
The existing brace-escaping patterns in the error handler of run_pak_install_with_mutex were left untouched.
No refactoring was done beyond the specified additions.
prepare_patched_repo errors are caught and logged via log_warn with NULL fallback, so a missing/empty patch registry causes no disruption to existing install flows.