Modified behaviour to allow ignoring installed versions and force upgraded versions to be installed

This commit is contained in:
2025-11-17 11:09:46 +00:00
parent dfa517a8bd
commit e32df9daac
2 changed files with 50 additions and 37 deletions

View File

@@ -1,7 +1,7 @@
Package: Rpacman Package: Rpacman
Type: Package Type: Package
Title: Very simple package manager for R Title: Very simple package manager for R
Version: 1.0.17 Version: 1.0.18
Date: 2025-11-17 Date: 2025-11-17
Authors@R: person("Craig", "Williams", email = "craig@avsdev.uk", role = c("aut", "cre")) Authors@R: person("Craig", "Williams", email = "craig@avsdev.uk", role = c("aut", "cre"))
URL: https://avsdev.uk/R/Rpacman URL: https://avsdev.uk/R/Rpacman

View File

@@ -1,11 +1,47 @@
# Requires activate.R # 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( installedPackages <- as.data.frame(
utils::installed.packages()[,c("Package","Version")], utils::installed.packages()[,c("Package","Version")],
stringsAsFactors = FALSE 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( packageMatch <- merge(
packages, packages,
cbind(installedPackages, matched = TRUE), cbind(installedPackages, matched = TRUE),
@@ -13,40 +49,9 @@
by.y = c("Package", "Version"), by.y = c("Package", "Version"),
all.x = TRUE 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),] missingPackages <- packageMatch[is.na(packageMatch$matched),]
if (parallel) { .install_packages(missingPackages, installOpts, parallel, lockRequiredVersions)
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 #' Restores the project from a pacman snapshot file. Installs any missing
@@ -60,7 +65,7 @@
#' #'
#' @import parallel #' @import parallel
#' @export #' @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) old_opt <- options(stringsAsFactors = FALSE)
on.exit(options(old_opt)) 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)) # 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) installGroups <- 1:length(lastSnapshot$packages$install_order)
for(grpIdx in installGroups) { for(grpIdx in installGroups) {
installGroup <- lastSnapshot$packages$install_order[[grpIdx]] 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 <- simplePackages[simplePackages$package %in% installGroup,]
groupPackages <- groupPackages[!(groupPackages$package %in% groupCustomPackages$package),] groupPackages <- groupPackages[!(groupPackages$package %in% groupCustomPackages$package),]
if (nrow(groupPackages) > 0) { 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)
}
} }
} }
} }