Files
Rpacman/R/restore.R
2023-09-28 09:44:06 +01:00

100 lines
3.4 KiB
R

# Requires activate.R
.install_if_missing <- function(packages, installOpts, lockVersion = TRUE, parallel = FALSE) {
installedPackages <- as.data.frame(utils::installed.packages()[,c("Package","Version")])
if (lockVersion) {
packageMatch <- merge(
packages,
cbind(installedPackages, matched = TRUE),
by.x = c("package", "version"),
by.y = c("Package", "Version"),
all.x = TRUE
)
} else {
packageMatch <- merge(
packages,
cbind(installedPackages, matched = TRUE),
by.x = "package", by.y = "Package",
all.x = TRUE
)
}
missingPackages <- packageMatch[is.na(packageMatch$matched),]
if (parallel) {
cl <- parallel::makeCluster(parallel::detectCores() - 1)
parallel::parLapply(cl, seq_along(missingPackages$package), function(ridx, missingPackages, installOpts, repos) {
options(repos = repos)
do.call(remotes::install_version, c(
missingPackages$package[[ridx]],
missingPackages$version[[ridx]],
upgrade = "never",
dependencies = FALSE,
installOpts
))
}, missingPackages, installOpts, getOption("repos"))
parallel::stopCluster(cl)
} else {
lapply(seq_along(missingPackages$package), function(ridx) {
cat("Installing", missingPackages$package[[ridx]], "now...\n")
do.call(remotes::install_version, c(
missingPackages$package[[ridx]],
missingPackages$version[[ridx]],
upgrade = "never",
dependencies = FALSE,
installOpts
))
})
}
}
#' Restores the project from a pacman snapshot file. Installs any missing
#' packages. This can be done into the user library or the packman library
#' (see totalIsolation)
#'
#' @param totalIsolation boolean Only refer to the pacman library, do not use
#' any user library paths
#' @param installOpts list Settings to be passed to install.packages etc.
#' Defaults to installing with multiple cores.
#'
#' @import parallel
#' @export
restore <- function(totalIsolation = FALSE, installOpts = list(Ncpus = parallel::detectCores())) {
activate(totalIsolation)
get_cran_repo()
lastSnapshot <- snapshot_latest()
requiredPackages <- lastSnapshot$packages
if (is.null(requiredPackages$direct)) {
requiredPackages$direct <- list()
}
if (is.null(requiredPackages$indirect)) {
requiredPackages$indirect <- list()
}
if (is.null(requiredPackages$custom)) {
requiredPackages$custom <- list()
}
simplePackages <- as.data.frame(apply(rbind(
do.call(rbind, requiredPackages$direct),
do.call(rbind, requiredPackages$indirect)
), 2, unlist))
customPackages <- as.data.frame(do.call(rbind, requiredPackages$custom))
# corePackages <- as.data.frame(apply(do.call(rbind, lastSnapshot$packages$core), 2, unlist))
installGroups <- 1:length(lastSnapshot$packages$install_order)
for(grpIdx in installGroups) {
installGroup <- lastSnapshot$packages$install_order[[grpIdx]]
groupCustomPackages <- customPackages[customPackages$package %in% installGroup,]
lapply(seq_along(groupCustomPackages$package), function(pkgIdx) {
install_package_source(groupCustomPackages[pkgIdx,], installOpts)
})
groupPackages <- simplePackages[simplePackages$package %in% installGroup,]
groupPackages <- groupPackages[!(groupPackages$package %in% groupCustomPackages$package),]
if (nrow(groupPackages) > 0) {
.install_if_missing(groupPackages, installOpts)
}
}
}