Modified behaviour to allow ignoring installed versions and force upgraded versions to be installed
This commit is contained in:
@@ -1,7 +1,7 @@
|
||||
Package: Rpacman
|
||||
Type: Package
|
||||
Title: Very simple package manager for R
|
||||
Version: 1.0.17
|
||||
Version: 1.0.18
|
||||
Date: 2025-11-17
|
||||
Authors@R: person("Craig", "Williams", email = "craig@avsdev.uk", role = c("aut", "cre"))
|
||||
URL: https://avsdev.uk/R/Rpacman
|
||||
|
||||
85
R/restore.R
85
R/restore.R
@@ -1,11 +1,47 @@
|
||||
# Requires activate.R
|
||||
|
||||
.install_if_missing <- function(packages, installOpts, lockVersion = TRUE, parallel = FALSE) {
|
||||
.install_packages <- function(packages, installOpts, parallel, lockVersion = TRUE)
|
||||
{
|
||||
if (parallel) {
|
||||
cl <- parallel::makeCluster(parallel::detectCores() - 1)
|
||||
parallel::parLapply(cl, seq_along(packages$package), function(ridx, packages, installOpts, repos) {
|
||||
options(repos = repos)
|
||||
do.call(remotes::install_version, c(
|
||||
packages$package[[ridx]],
|
||||
ifelse(lockVersion, packages$version[[ridx]], NULL),
|
||||
upgrade = "never",
|
||||
dependencies = FALSE,
|
||||
installOpts
|
||||
))
|
||||
}, packages, installOpts, getOption("repos"))
|
||||
parallel::stopCluster(cl)
|
||||
} else {
|
||||
lapply(seq_along(packages$package), function(ridx) {
|
||||
cat("Installing", packages$package[[ridx]], "now...\n")
|
||||
do.call(remotes::install_version, c(
|
||||
packages$package[[ridx]],
|
||||
ifelse(lockVersion, packages$version[[ridx]], NULL),
|
||||
upgrade = "never",
|
||||
dependencies = FALSE,
|
||||
installOpts
|
||||
))
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
.install_if_missing <- function(packages, installOpts, lockRequiredVersions = TRUE, ignoreInstalledVersions = FALSE, parallel = FALSE) {
|
||||
installedPackages <- as.data.frame(
|
||||
utils::installed.packages()[,c("Package","Version")],
|
||||
stringsAsFactors = FALSE
|
||||
)
|
||||
if (lockVersion) {
|
||||
if (ignoreInstalledVersions) {
|
||||
packageMatch <- merge(
|
||||
packages,
|
||||
cbind(installedPackages, matched = TRUE),
|
||||
by.x = "package", by.y = "Package",
|
||||
all.x = TRUE
|
||||
)
|
||||
} else {
|
||||
packageMatch <- merge(
|
||||
packages,
|
||||
cbind(installedPackages, matched = TRUE),
|
||||
@@ -13,40 +49,9 @@
|
||||
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
|
||||
))
|
||||
})
|
||||
}
|
||||
.install_packages(missingPackages, installOpts, parallel, lockRequiredVersions)
|
||||
}
|
||||
|
||||
#' Restores the project from a pacman snapshot file. Installs any missing
|
||||
@@ -60,7 +65,7 @@
|
||||
#'
|
||||
#' @import parallel
|
||||
#' @export
|
||||
restore <- function(totalIsolation = FALSE, lib_path = NULL, installOpts = list(Ncpus = parallel::detectCores()), lockVersions = TRUE, parallel = FALSE) {
|
||||
restore <- function(totalIsolation = FALSE, lib_path = NULL, installOpts = list(Ncpus = parallel::detectCores()), lockRequiredVersions = TRUE, latestVersions = c("none", "new", "all")[[1]], parallel = FALSE) {
|
||||
old_opt <- options(stringsAsFactors = FALSE)
|
||||
on.exit(options(old_opt))
|
||||
|
||||
@@ -98,6 +103,10 @@ restore <- function(totalIsolation = FALSE, lib_path = NULL, installOpts = list(
|
||||
|
||||
# corePackages <- as.data.frame(apply(do.call(rbind, lastSnapshot$packages$core), 2, unlist))
|
||||
|
||||
if (sum(latestVersions %in% c("new")) != 0) {
|
||||
lockRequiredVersions <- FALSE
|
||||
}
|
||||
|
||||
installGroups <- 1:length(lastSnapshot$packages$install_order)
|
||||
for(grpIdx in installGroups) {
|
||||
installGroup <- lastSnapshot$packages$install_order[[grpIdx]]
|
||||
@@ -110,7 +119,11 @@ restore <- function(totalIsolation = FALSE, lib_path = NULL, installOpts = list(
|
||||
groupPackages <- simplePackages[simplePackages$package %in% installGroup,]
|
||||
groupPackages <- groupPackages[!(groupPackages$package %in% groupCustomPackages$package),]
|
||||
if (nrow(groupPackages) > 0) {
|
||||
.install_if_missing(groupPackages, installOpts, lockVersions, parallel)
|
||||
if (sum(latestVersions %in% c("all")) != 0) {
|
||||
.install_packages(groupPackages, installOpts, parallel, FALSE)
|
||||
} else {
|
||||
.install_if_missing(groupPackages, installOpts, lockRequiredVersions, FALSE, parallel)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user