100 lines
3.4 KiB
R
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)
|
|
}
|
|
}
|
|
} |