docker run --rm -it --platform linux/arm64 alpine sh apk add --no-cache R R-dev g++ curl ca-certificates curl -fsSL https://raw.githubusercontent.com/nbafrank/uvr/main/install.sh | UVR_INSTALL_DIR=/usr/local/bin sh # `uvr add` always writes to .uvr/library/; only `uvr sync` honours UVR_LIBRARY, # so add without installing and let the sync place the packages. export UVR_LIBRARY=/usr/lib/R/library mkdir -p /uvr && cd /uvr && uvr init --here uvr add --no-install gert purrr && uvr sync --install-system-deps R package_name <- "DoE.base" gert::git_clone(sprintf("https://github.com/cran/%s", package_name), path = sprintf("%s/%s", tempdir(), "tmp1"), verbose = FALSE ) # Retrieve all tags all_tags <- gert::git_tag_list(repo = sprintf("%s/%s", tempdir(), "tmp1")) # filter out tags that start with R- (= non-valid ones) all_tags <- all_tags[!grepl("R-", all_tags$name), ] unlink(sprintf("%s/%s", tempdir(), "tmp1"), force = TRUE, recursive = TRUE) tag <- all_tags$name package_name <- rep(package_name, length(tag)) # uvr has no `pak::local_install_deps()`; read the DESCRIPTION of the checkout # and `uvr add` the dependency names instead. purrr::walk2(package_name[1], tag, \(x, y) { print(y) system("git config --global advice.detachedHead false") src <- sprintf("/tmp/%s_%s", x[1], y) system2("git", args = c( "clone", "-q", sprintf("--branch=%s", tail(y, 1)), sprintf("https://github.com/cran/%s", x[1]), src )) d <- read.dcf(file.path(src, "DESCRIPTION")) f <- intersect(colnames(d), c("Depends", "Imports", "LinkingTo")) deps <- trimws(sub("[(].*", "", unlist(strsplit(paste(d[, f], collapse = ","), ",")))) deps <- setdiff(deps[nzchar(deps)], "R") system2("uvr", c("add", "--no-install", deps)) system2("uvr", c("sync", "--install-system-deps")) })