diff --git a/DESCRIPTION b/DESCRIPTION index fd8dbdd..aa116ff 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -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 diff --git a/R/restore.R b/R/restore.R index a180790..3822ab3 100644 --- a/R/restore.R +++ b/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) + } } } }