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
|
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
|
||||||
|
|||||||
85
R/restore.R
85
R/restore.R
@@ -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)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user