From e853a2f45f2d568f42ecdc1531e7d66fe8970415 Mon Sep 17 00:00:00 2001 From: davidboren Date: Tue, 3 May 2016 15:49:11 -0700 Subject: [PATCH 1/8] First pass at suggested packages fix --- R/dependencies.R | 14 ++++++++++++++ R/library.R | 18 +++++++++++++----- 2 files changed, 27 insertions(+), 5 deletions(-) diff --git a/R/dependencies.R b/R/dependencies.R index 1ff1121..169440b 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 && getOption("lockbox.auto_install_suggests", FALSE)) { + 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..aedd598 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) From 93e93f7a61bf5ed77f63bc5f7165643bcd4d6b51 Mon Sep 17 00:00:00 2001 From: davidboren Date: Wed, 4 May 2016 07:44:26 -0700 Subject: [PATCH 2/8] Add isTRUE --- R/dependencies.R | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/R/dependencies.R b/R/dependencies.R index 169440b..a18bfd6 100644 --- a/R/dependencies.R +++ b/R/dependencies.R @@ -345,7 +345,7 @@ 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 && getOption("lockbox.auto_install_suggests", FALSE)) { + if (package$is_dependency_package && isTRUE(getOption("lockbox.auto_install_suggests", FALSE))) { dependency_levels <- c(dependency_levels, "Suggests") } if (!any(dependency_levels %in% colnames(dcf))) return(list()) From 5ad0596dfcefad572dab222f3c1cadf26cc86dc5 Mon Sep 17 00:00:00 2001 From: davidboren Date: Wed, 4 May 2016 14:53:59 -0700 Subject: [PATCH 3/8] Default to TRUE --- R/dependencies.R | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/R/dependencies.R b/R/dependencies.R index a18bfd6..42d987e 100644 --- a/R/dependencies.R +++ b/R/dependencies.R @@ -345,7 +345,7 @@ 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", FALSE))) { + 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()) From 6fe7d7e3c53322edbeab1811a9f61cb8de1bbe28 Mon Sep 17 00:00:00 2001 From: davidboren Date: Wed, 4 May 2016 15:16:28 -0700 Subject: [PATCH 4/8] Repo specification not required for "suggests" --- R/library.R | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/R/library.R b/R/library.R index aedd598..7c95dde 100644 --- a/R/library.R +++ b/R/library.R @@ -296,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." From 58831f30229ec1adb8be363c205f2a6e6394e73e Mon Sep 17 00:00:00 2001 From: davidboren Date: Thu, 12 May 2016 09:05:06 -0700 Subject: [PATCH 5/8] Remove some packages for the test --- tests/testthat/helper-random-dependencies.R | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/testthat/helper-random-dependencies.R b/tests/testthat/helper-random-dependencies.R index e3f354d..e8d59e7 100644 --- a/tests/testthat/helper-random-dependencies.R +++ b/tests/testthat/helper-random-dependencies.R @@ -1,4 +1,4 @@ -get_hardcoded_github_yml <- function() return("packages:\n- name: stagerunner\n version: 0.5.2\n repo: syberia/stagerunner\n- name: objectdiff\n version: 0.2.3.9000\n repo: robertzk/objectdiff\n ref: ab641a58523e7a1d78f82491838c70d5334d9603\n- name: tundra\n version: 0.2.3\n repo: syberia/tundra\n- name: director\n version: 0.2.1\n repo: syberia/director\n- name: mungebits\n version: 0.3.13\n repo: robertzk/mungebits\n- name: mungebits2\n version: 0.1.0\n repo: syberia/mungebits2\n load: no\n- name: syberiaStages\n version: 0.2.3\n repo: robertzk/syberiaStages\n- name: statsUtils\n version: 0.1.4\n repo: robertzk/statsUtils\n- name: syberiaStructure\n version: 0.2.2\n repo: robertzk/syberiaStructure\n- name: devtools\n repo: hadley/devtools\n version: 1.10.0.9000\n ref: 2b42b846534ceec47a867ad0376a7024ff80eb01\ndevelopment: ~\ntest: ~\nnothing: ~\n") +get_hardcoded_github_yml <- function() return("packages:\n- name: stagerunner\n version: 0.5.2\n repo: syberia/stagerunner\n- name: objectdiff\n version: 0.2.3.9000\n repo: robertzk/objectdiff\n ref: ab641a58523e7a1d78f82491838c70d5334d9603\n- name: tundra\n version: 0.2.3\n repo: syberia/tundra\n- name: director\n version: 0.2.1\ndevelopment: ~\ntest: ~\nnothing: ~\n") get_hardcoded_cran_yml <- function() return("packages:\n- name: Rcpp\n version: 0.12.3\n- name: foreign\n version: 0.8-66\n load: no\n- name: crayon\n version: 1.2.1\n load: no\n- name: lubridate\n version: 1.5.0\n- name: knitr\n version: 1.12.3\n- name: memoise\n version: 1.0.0\n") From 988cd62eacf797e9bd41640822f2379fa7cd424d Mon Sep 17 00:00:00 2001 From: davidboren Date: Thu, 12 May 2016 09:18:19 -0700 Subject: [PATCH 6/8] Just remove devtools --- tests/testthat/helper-random-dependencies.R | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/testthat/helper-random-dependencies.R b/tests/testthat/helper-random-dependencies.R index e8d59e7..3a5fee8 100644 --- a/tests/testthat/helper-random-dependencies.R +++ b/tests/testthat/helper-random-dependencies.R @@ -1,4 +1,4 @@ -get_hardcoded_github_yml <- function() return("packages:\n- name: stagerunner\n version: 0.5.2\n repo: syberia/stagerunner\n- name: objectdiff\n version: 0.2.3.9000\n repo: robertzk/objectdiff\n ref: ab641a58523e7a1d78f82491838c70d5334d9603\n- name: tundra\n version: 0.2.3\n repo: syberia/tundra\n- name: director\n version: 0.2.1\ndevelopment: ~\ntest: ~\nnothing: ~\n") +get_hardcoded_github_yml <- function() return("packages:\n- name: stagerunner\n version: 0.5.2\n repo: syberia/stagerunner\n- name: objectdiff\n version: 0.2.3.9000\n repo: robertzk/objectdiff\n ref: ab641a58523e7a1d78f82491838c70d5334d9603\n- name: tundra\n version: 0.2.3\n repo: syberia/tundra\n- name: director\n version: 0.2.1\n repo: syberia/director\n- name: mungebits\n version: 0.3.13\n repo: robertzk/mungebits\n- name: mungebits2\n version: 0.1.0\n repo: syberia/mungebits2\n load: no\n- name: syberiaStages\n version: 0.2.3\n repo: robertzk/syberiaStages\n- name: statsUtils\n version: 0.1.4\n repo: robertzk/statsUtils\n- name: syberiaStructure\n version: 0.2.2\n repo: robertzk/syberiaStructure\ndevelopment: ~\ntest: ~\nnothing: ~\n") get_hardcoded_cran_yml <- function() return("packages:\n- name: Rcpp\n version: 0.12.3\n- name: foreign\n version: 0.8-66\n load: no\n- name: crayon\n version: 1.2.1\n load: no\n- name: lubridate\n version: 1.5.0\n- name: knitr\n version: 1.12.3\n- name: memoise\n version: 1.0.0\n") From 5d96400b71453506faaa48a31701d7a961383b2a Mon Sep 17 00:00:00 2001 From: davidboren Date: Thu, 12 May 2016 09:42:22 -0700 Subject: [PATCH 7/8] Trying to be verbose --- tests/testthat/helper-random-dependencies.R | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/testthat/helper-random-dependencies.R b/tests/testthat/helper-random-dependencies.R index 3a5fee8..20ebada 100644 --- a/tests/testthat/helper-random-dependencies.R +++ b/tests/testthat/helper-random-dependencies.R @@ -1,4 +1,4 @@ -get_hardcoded_github_yml <- function() return("packages:\n- name: stagerunner\n version: 0.5.2\n repo: syberia/stagerunner\n- name: objectdiff\n version: 0.2.3.9000\n repo: robertzk/objectdiff\n ref: ab641a58523e7a1d78f82491838c70d5334d9603\n- name: tundra\n version: 0.2.3\n repo: syberia/tundra\n- name: director\n version: 0.2.1\n repo: syberia/director\n- name: mungebits\n version: 0.3.13\n repo: robertzk/mungebits\n- name: mungebits2\n version: 0.1.0\n repo: syberia/mungebits2\n load: no\n- name: syberiaStages\n version: 0.2.3\n repo: robertzk/syberiaStages\n- name: statsUtils\n version: 0.1.4\n repo: robertzk/statsUtils\n- name: syberiaStructure\n version: 0.2.2\n repo: robertzk/syberiaStructure\ndevelopment: ~\ntest: ~\nnothing: ~\n") +get_hardcoded_github_yml <- function() return("packages:\n- name: stagerunner\n version: 0.5.2\n repo: syberia/stagerunner\n- name: objectdiff\n version: 0.2.3.9000\n repo: robertzk/objectdiff\n ref: ab641a58523e7a1d78f82491838c70d5334d9603\n- name: tundra\n version: 0.2.3\n repo: syberia/tundra\n- name: director\n version: 0.2.1\n repo: syberia/director\n- name: mungebits\n version: 0.3.13\n repo: robertzk/mungebits\n- name: mungebits2\n version: 0.1.0\n repo: syberia/mungebits2\n load: no\n- name: syberiaStages\n version: 0.2.3\n repo: robertzk/syberiaStages\n- name: statsUtils\n version: 0.1.4\n repo: robertzk/statsUtils\n- name: syberiaStructure\n version: 0.2.2\n repo: robertzk/syberiaStructure\n- name: devtools\n repo: hadley/devtools\n version: 1.10.0.9000\n ref: 2b42b846534ceec47a867ad0376a7024ff80eb01\ndevelopment: ~\ntest: ~\nnothing: ~\n") get_hardcoded_cran_yml <- function() return("packages:\n- name: Rcpp\n version: 0.12.3\n- name: foreign\n version: 0.8-66\n load: no\n- name: crayon\n version: 1.2.1\n load: no\n- name: lubridate\n version: 1.5.0\n- name: knitr\n version: 1.12.3\n- name: memoise\n version: 1.0.0\n") @@ -48,7 +48,7 @@ get_rscript_command <- function(lockbox_dir, logfile_name, final_msg, install_di lock_cmd <- "library(methods);lockbox::lockbox('generated_lockfile.yml')" msg_cmd <- paste0("cat('", final_msg, "')") paste0("cd ", install_dir, ";Rscript -e ","\"", option_cmd1, option_cmd2 - , lock_cmd, ";", msg_cmd, "\" > ", logfile_name) + , lock_cmd, ";", msg_cmd, "\" | tee ", logfile_name) } ## Not currently in use, but left in case we want to do randomized tests in the future From ba67789abddc74076058835c63dcb1593141800f Mon Sep 17 00:00:00 2001 From: davidboren Date: Thu, 12 May 2016 11:17:21 -0700 Subject: [PATCH 8/8] Use sink --- tests/testthat/helper-random-dependencies.R | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/tests/testthat/helper-random-dependencies.R b/tests/testthat/helper-random-dependencies.R index 20ebada..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, "\" | tee ", 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