diff --git a/R/dependencies.R b/R/dependencies.R index 1ff1121..42d987e 100644 --- a/R/dependencies.R +++ b/R/dependencies.R @@ -345,6 +345,9 @@ dependencies_from_description <- function(package, dcf) { ## dcf does not contain any of these elements we have no dependencies to ## speak of dependency_levels <- c("Depends", "Imports", "LinkingTo", "Remotes") + if (package$is_dependency_package && isTRUE(getOption("lockbox.auto_install_suggests", TRUE))) { + dependency_levels <- c(dependency_levels, "Suggests") + } if (!any(dependency_levels %in% colnames(dcf))) return(list()) ## The parse_dcf function returns a matrix where rows correspond to packages @@ -356,6 +359,7 @@ dependencies_from_description <- function(package, dcf) { colnames(dcf)])[[package$name]]) if(NROW(dependencies_parsed) == 1 && NCOL(dependencies_parsed) == 1) return(list()) + suggests_dependencies <- dependencies_parsed[grepl("^Suggests", rownames(dependencies_parsed)), 1] ## We separate out non-remote dependencies from remote dependencies, because ## they require different logic @@ -367,9 +371,19 @@ dependencies_from_description <- function(package, dcf) { vapply(non_remote_list, `[[`, character(1), "name") , vapply(remote_list, `[[`, character(1), "name"))] + non_remote_list <- mark_suggests(non_remote_list, suggests_dependencies) c(non_remote_list, remote_list) } +mark_suggests <- function(non_remote_list, suggests_dependencies) { + lapply(non_remote_list, function(pkg) { + if (pkg$name %in% suggests_dependencies) { + pkg$is_suggests <- TRUE + } + pkg + }) +} + get_non_remote_list <- function(dependencies_parsed) { non_remote_dependencies <- dependencies_parsed[!grepl("^Remotes", rownames(dependencies_parsed)), ] diff --git a/R/library.R b/R/library.R index 11425aa..7c95dde 100644 --- a/R/library.R +++ b/R/library.R @@ -149,11 +149,19 @@ install_locked_package <- function(locked_package) { ## If we have an error during installation try again and show everything if (is(output, "error") || !file.exists(pkgdir)) { - try(install_package(locked_package, temp_library, FALSE)) - unlink(temp_library, TRUE, TRUE) - stop("Must have installed the package ", - crayon_red(as.character(locked_package$name)), - " of version ", sQuote(as.character(locked_package$version))) + if (is.null(locked_package$is_suggests)) { + try(install_package(locked_package, temp_library, FALSE)) + unlink(temp_library, TRUE, TRUE) + stop("Must have installed the package ", + crayon_red(as.character(locked_package$name)), + " of version ", sQuote(as.character(locked_package$version))) + } else { + warning("Tried and failed to install suggested package ", + crayon_red(as.character(locked_package$name)), + " of version ", sQuote(as.character(locked_package$version))) + unlink(temp_library, TRUE, TRUE) + return() + } } ver <- package_version_from_path(pkgdir) @@ -288,7 +296,7 @@ get_available_cran_version <- function(package, repo = "http://cran.r-project.or , filter = c("OS_type", "subarch", "duplicates")) available <- data.frame(unique(available[, c("Package", "Version")])) } - if (!package$name %in% available$Package) { + if (!package$name %in% available$Package && is.null(package$is_suggests)) { prefix <- "Locked" if (package$is_dependency_package) prefix <- "Dependency" stop(paste0(prefix, " Package ", package$name, " is not available on CRAN." diff --git a/tests/testthat/helper-random-dependencies.R b/tests/testthat/helper-random-dependencies.R index e3f354d..6876c57 100644 --- a/tests/testthat/helper-random-dependencies.R +++ b/tests/testthat/helper-random-dependencies.R @@ -45,10 +45,11 @@ get_rscript_command <- function(lockbox_dir, logfile_name, final_msg, install_di option_cmd1 <- paste0("options(lockbox.directory = '", lockbox_dir,"');") option_cmd2 <- paste0("options(lockbox.transient_dir = '", lockbox_dir , "_transient","');") - lock_cmd <- "library(methods);lockbox::lockbox('generated_lockfile.yml')" + lock_cmd <- paste0("setwd('", dirname(lockbox_dir),"');library(methods);lockbox::lockbox('generated_lockfile.yml');") + option_cmd_sink <- paste0("sink('", logfile_name,"', split = TRUE);") msg_cmd <- paste0("cat('", final_msg, "')") paste0("cd ", install_dir, ";Rscript -e ","\"", option_cmd1, option_cmd2 - , lock_cmd, ";", msg_cmd, "\" > ", logfile_name) + , lock_cmd, option_cmd_sink, msg_cmd, "\"") } ## Not currently in use, but left in case we want to do randomized tests in the future