99 lines
3.4 KiB
Markdown
99 lines
3.4 KiB
Markdown
### Task A7: Thread `patches` through the public build API
|
|
|
|
**Files:**
|
|
- Modify: `R/build_binaries.R` (`build_binary_package`, `execute_package_builds`, `build_single_tag`, `handle_system_dependencies`)
|
|
- Create: `man-roxygen/param-patches.R`
|
|
- Test: `tests/testthat/test-patches.R`
|
|
|
|
**Interfaces:**
|
|
- Produces: `build_binary_package(..., patches = NULL)` and the internal chain each carry `patches` down to `install_pkg_sys_deps()`. `handle_system_dependencies(..., patches = NULL)` passes `patches` and `arch` through.
|
|
|
|
- [ ] **Step 1: Write the failing test**
|
|
|
|
```r
|
|
test_that("handle_system_dependencies forwards patches and arch", {
|
|
captured <- list()
|
|
local_mocked_bindings(
|
|
install_pkg_sys_deps = function(package_name, tag, local_clone_dir_single,
|
|
platform, patches = NULL, arch = NULL) {
|
|
captured <<- list(patches = patches, arch = arch)
|
|
invisible(TRUE)
|
|
}
|
|
)
|
|
handle_system_dependencies(
|
|
"RcppParallel", "5.1.11-2", "ubuntu-2604", tempfile(), "amd64",
|
|
NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
|
patches = "local/patches"
|
|
)
|
|
expect_identical(captured$patches, "local/patches")
|
|
expect_identical(captured$arch, "amd64")
|
|
})
|
|
```
|
|
|
|
- [ ] **Step 2: Run test to verify it fails**
|
|
|
|
Run: `Rscript -e 'devtools::load_all("."); testthat::test_file("tests/testthat/test-patches.R")'`
|
|
Expected: FAIL — `handle_system_dependencies` has no `patches` argument.
|
|
|
|
- [ ] **Step 3: Create the roxygen template**
|
|
|
|
```r
|
|
# man-roxygen/param-patches.R
|
|
#' @param patches Optional path to a patch registry directory containing a
|
|
#' `registry.json` (and any referenced diff files). When set, matching
|
|
#' packages are pre-built as patched binaries and served to `pak` during
|
|
#' dependency installation. Defaults to `NULL` (no patching).
|
|
```
|
|
|
|
- [ ] **Step 4: Edit the four functions in `R/build_binaries.R`**
|
|
|
|
In `build_single_tag()`'s call to `handle_system_dependencies(...)`, add `patches = patches` as the final argument, and add `patches = NULL` to `build_single_tag`'s own signature plus `#' @template param-patches` to its roxygen block.
|
|
|
|
Change `handle_system_dependencies` signature to end with `metadata_db_sslmode,` then add `patches = NULL`, and change its inner `install_pkg_sys_deps(...)` call from:
|
|
|
|
```r
|
|
install_pkg_sys_deps(
|
|
package_name,
|
|
tag,
|
|
local_clone_dir_single,
|
|
platform
|
|
)
|
|
```
|
|
|
|
to:
|
|
|
|
```r
|
|
install_pkg_sys_deps(
|
|
package_name,
|
|
tag,
|
|
local_clone_dir_single,
|
|
platform,
|
|
patches = patches,
|
|
arch = arch
|
|
)
|
|
```
|
|
|
|
In `execute_package_builds()`, add `patches = NULL` to the signature and pass `patches = patches` into its `build_single_tag(...)` call inside `worker_function`.
|
|
|
|
In `build_binary_package()`, add `patches = NULL` to the signature (after `s3_package_cache`), add `#' @template param-patches` to its roxygen, and pass `patches = patches` into the `execute_package_builds(...)` call.
|
|
|
|
- [ ] **Step 5: Document, test, and run package check**
|
|
|
|
Run:
|
|
|
|
```bash
|
|
Rscript -e 'devtools::document()'
|
|
Rscript -e 'devtools::load_all("."); testthat::test_file("tests/testthat/test-patches.R")'
|
|
```
|
|
|
|
Expected: PASS for the new test; `man/build_binary_package.Rd` etc. regenerated.
|
|
|
|
- [ ] **Step 6: Commit**
|
|
|
|
```bash
|
|
git add R/build_binaries.R man-roxygen/param-patches.R man NAMESPACE tests/testthat/test-patches.R
|
|
git commit -m "feat(patches): thread patches argument through build_binary_package"
|
|
```
|
|
|
|
---
|
|
|