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
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

View File

@@ -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)
}
}
}
}