|
2 | 2 | local({
|
3 | 3 |
|
4 | 4 | # the requested version of renv
|
5 |
| - version <- "1.0.7" |
| 5 | + version <- "1.0.9" |
6 | 6 | attr(version, "sha") <- NULL
|
7 | 7 |
|
8 | 8 | # the project directory
|
@@ -98,6 +98,66 @@ local({
|
98 | 98 | unloadNamespace("renv")
|
99 | 99 |
|
100 | 100 | # load bootstrap tools
|
| 101 | + ansify <- function(text) { |
| 102 | + if (renv_ansify_enabled()) |
| 103 | + renv_ansify_enhanced(text) |
| 104 | + else |
| 105 | + renv_ansify_default(text) |
| 106 | + } |
| 107 | + |
| 108 | + renv_ansify_enabled <- function() { |
| 109 | + |
| 110 | + override <- Sys.getenv("RENV_ANSIFY_ENABLED", unset = NA) |
| 111 | + if (!is.na(override)) |
| 112 | + return(as.logical(override)) |
| 113 | + |
| 114 | + pane <- Sys.getenv("RSTUDIO_CHILD_PROCESS_PANE", unset = NA) |
| 115 | + if (identical(pane, "build")) |
| 116 | + return(FALSE) |
| 117 | + |
| 118 | + testthat <- Sys.getenv("TESTTHAT", unset = "false") |
| 119 | + if (tolower(testthat) %in% "true") |
| 120 | + return(FALSE) |
| 121 | + |
| 122 | + iderun <- Sys.getenv("R_CLI_HAS_HYPERLINK_IDE_RUN", unset = "false") |
| 123 | + if (tolower(iderun) %in% "false") |
| 124 | + return(FALSE) |
| 125 | + |
| 126 | + TRUE |
| 127 | + |
| 128 | + } |
| 129 | + |
| 130 | + renv_ansify_default <- function(text) { |
| 131 | + text |
| 132 | + } |
| 133 | + |
| 134 | + renv_ansify_enhanced <- function(text) { |
| 135 | + |
| 136 | + # R help links |
| 137 | + pattern <- "`\\?(renv::(?:[^`])+)`" |
| 138 | + replacement <- "`\033]8;;ide:help:\\1\a?\\1\033]8;;\a`" |
| 139 | + text <- gsub(pattern, replacement, text, perl = TRUE) |
| 140 | + |
| 141 | + # runnable code |
| 142 | + pattern <- "`(renv::(?:[^`])+)`" |
| 143 | + replacement <- "`\033]8;;ide:run:\\1\a\\1\033]8;;\a`" |
| 144 | + text <- gsub(pattern, replacement, text, perl = TRUE) |
| 145 | + |
| 146 | + # return ansified text |
| 147 | + text |
| 148 | + |
| 149 | + } |
| 150 | + |
| 151 | + renv_ansify_init <- function() { |
| 152 | + |
| 153 | + envir <- renv_envir_self() |
| 154 | + if (renv_ansify_enabled()) |
| 155 | + assign("ansify", renv_ansify_enhanced, envir = envir) |
| 156 | + else |
| 157 | + assign("ansify", renv_ansify_default, envir = envir) |
| 158 | + |
| 159 | + } |
| 160 | + |
101 | 161 | `%||%` <- function(x, y) {
|
102 | 162 | if (is.null(x)) y else x
|
103 | 163 | }
|
@@ -142,7 +202,10 @@ local({
|
142 | 202 | # compute common indent
|
143 | 203 | indent <- regexpr("[^[:space:]]", lines)
|
144 | 204 | common <- min(setdiff(indent, -1L)) - leave
|
145 |
| - paste(substring(lines, common), collapse = "\n") |
| 205 | + text <- paste(substring(lines, common), collapse = "\n") |
| 206 | + |
| 207 | + # substitute in ANSI links for executable renv code |
| 208 | + ansify(text) |
146 | 209 |
|
147 | 210 | }
|
148 | 211 |
|
@@ -306,7 +369,11 @@ local({
|
306 | 369 | )
|
307 | 370 |
|
308 | 371 | if ("headers" %in% names(formals(utils::download.file)))
|
309 |
| - args$headers <- renv_bootstrap_download_custom_headers(url) |
| 372 | + { |
| 373 | + headers <- renv_bootstrap_download_custom_headers(url) |
| 374 | + if (length(headers) && is.character(headers)) |
| 375 | + args$headers <- headers |
| 376 | + } |
310 | 377 |
|
311 | 378 | do.call(utils::download.file, args)
|
312 | 379 |
|
@@ -385,10 +452,22 @@ local({
|
385 | 452 | for (type in types) {
|
386 | 453 | for (repos in renv_bootstrap_repos()) {
|
387 | 454 |
|
| 455 | + # build arguments for utils::available.packages() call |
| 456 | + args <- list(type = type, repos = repos) |
| 457 | + |
| 458 | + # add custom headers if available -- note that |
| 459 | + # utils::available.packages() will pass this to download.file() |
| 460 | + if ("headers" %in% names(formals(utils::download.file))) |
| 461 | + { |
| 462 | + headers <- renv_bootstrap_download_custom_headers(url) |
| 463 | + if (length(headers) && is.character(headers)) |
| 464 | + args$headers <- headers |
| 465 | + } |
| 466 | + |
388 | 467 | # retrieve package database
|
389 | 468 | db <- tryCatch(
|
390 | 469 | as.data.frame(
|
391 |
| - utils::available.packages(type = type, repos = repos), |
| 470 | + do.call(utils::available.packages, args), |
392 | 471 | stringsAsFactors = FALSE
|
393 | 472 | ),
|
394 | 473 | error = identity
|
@@ -470,23 +549,31 @@ local({
|
470 | 549 |
|
471 | 550 | }
|
472 | 551 |
|
| 552 | + renv_bootstrap_github_token <- function() { |
| 553 | + for (envvar in c("GITHUB_TOKEN", "GITHUB_PAT", "GH_TOKEN")) { |
| 554 | + envval <- Sys.getenv(envvar, unset = NA) |
| 555 | + if (!is.na(envval)) |
| 556 | + return(envval) |
| 557 | + } |
| 558 | + } |
| 559 | + |
473 | 560 | renv_bootstrap_download_github <- function(version) {
|
474 | 561 |
|
475 | 562 | enabled <- Sys.getenv("RENV_BOOTSTRAP_FROM_GITHUB", unset = "TRUE")
|
476 | 563 | if (!identical(enabled, "TRUE"))
|
477 | 564 | return(FALSE)
|
478 | 565 |
|
479 | 566 | # prepare download options
|
480 |
| - pat <- Sys.getenv("GITHUB_PAT") |
481 |
| - if (nzchar(Sys.which("curl")) && nzchar(pat)) { |
| 567 | + token <- renv_bootstrap_github_token() |
| 568 | + if (nzchar(Sys.which("curl")) && nzchar(token)) { |
482 | 569 | fmt <- "--location --fail --header \"Authorization: token %s\""
|
483 |
| - extra <- sprintf(fmt, pat) |
| 570 | + extra <- sprintf(fmt, token) |
484 | 571 | saved <- options("download.file.method", "download.file.extra")
|
485 | 572 | options(download.file.method = "curl", download.file.extra = extra)
|
486 | 573 | on.exit(do.call(base::options, saved), add = TRUE)
|
487 |
| - } else if (nzchar(Sys.which("wget")) && nzchar(pat)) { |
| 574 | + } else if (nzchar(Sys.which("wget")) && nzchar(token)) { |
488 | 575 | fmt <- "--header=\"Authorization: token %s\""
|
489 |
| - extra <- sprintf(fmt, pat) |
| 576 | + extra <- sprintf(fmt, token) |
490 | 577 | saved <- options("download.file.method", "download.file.extra")
|
491 | 578 | options(download.file.method = "wget", download.file.extra = extra)
|
492 | 579 | on.exit(do.call(base::options, saved), add = TRUE)
|
|
0 commit comments