|
2 | 2 | local({ |
3 | 3 |
|
4 | 4 | # the requested version of renv |
5 | | - version <- "1.0.7" |
| 5 | + version <- "1.0.11" |
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 |
|
@@ -305,8 +368,11 @@ local({ |
305 | 368 | quiet = TRUE |
306 | 369 | ) |
307 | 370 |
|
308 | | - if ("headers" %in% names(formals(utils::download.file))) |
309 | | - args$headers <- renv_bootstrap_download_custom_headers(url) |
| 371 | + if ("headers" %in% names(formals(utils::download.file))) { |
| 372 | + headers <- renv_bootstrap_download_custom_headers(url) |
| 373 | + if (length(headers) && is.character(headers)) |
| 374 | + args$headers <- headers |
| 375 | + } |
310 | 376 |
|
311 | 377 | do.call(utils::download.file, args) |
312 | 378 |
|
@@ -385,10 +451,21 @@ local({ |
385 | 451 | for (type in types) { |
386 | 452 | for (repos in renv_bootstrap_repos()) { |
387 | 453 |
|
| 454 | + # build arguments for utils::available.packages() call |
| 455 | + args <- list(type = type, repos = repos) |
| 456 | + |
| 457 | + # add custom headers if available -- note that |
| 458 | + # utils::available.packages() will pass this to download.file() |
| 459 | + if ("headers" %in% names(formals(utils::download.file))) { |
| 460 | + headers <- renv_bootstrap_download_custom_headers(repos) |
| 461 | + if (length(headers) && is.character(headers)) |
| 462 | + args$headers <- headers |
| 463 | + } |
| 464 | + |
388 | 465 | # retrieve package database |
389 | 466 | db <- tryCatch( |
390 | 467 | as.data.frame( |
391 | | - utils::available.packages(type = type, repos = repos), |
| 468 | + do.call(utils::available.packages, args), |
392 | 469 | stringsAsFactors = FALSE |
393 | 470 | ), |
394 | 471 | error = identity |
@@ -470,23 +547,31 @@ local({ |
470 | 547 |
|
471 | 548 | } |
472 | 549 |
|
| 550 | + renv_bootstrap_github_token <- function() { |
| 551 | + for (envvar in c("GITHUB_TOKEN", "GITHUB_PAT", "GH_TOKEN")) { |
| 552 | + envval <- Sys.getenv(envvar, unset = NA) |
| 553 | + if (!is.na(envval)) |
| 554 | + return(envval) |
| 555 | + } |
| 556 | + } |
| 557 | + |
473 | 558 | renv_bootstrap_download_github <- function(version) { |
474 | 559 |
|
475 | 560 | enabled <- Sys.getenv("RENV_BOOTSTRAP_FROM_GITHUB", unset = "TRUE") |
476 | 561 | if (!identical(enabled, "TRUE")) |
477 | 562 | return(FALSE) |
478 | 563 |
|
479 | 564 | # prepare download options |
480 | | - pat <- Sys.getenv("GITHUB_PAT") |
481 | | - if (nzchar(Sys.which("curl")) && nzchar(pat)) { |
| 565 | + token <- renv_bootstrap_github_token() |
| 566 | + if (nzchar(Sys.which("curl")) && nzchar(token)) { |
482 | 567 | fmt <- "--location --fail --header \"Authorization: token %s\"" |
483 | | - extra <- sprintf(fmt, pat) |
| 568 | + extra <- sprintf(fmt, token) |
484 | 569 | saved <- options("download.file.method", "download.file.extra") |
485 | 570 | options(download.file.method = "curl", download.file.extra = extra) |
486 | 571 | on.exit(do.call(base::options, saved), add = TRUE) |
487 | | - } else if (nzchar(Sys.which("wget")) && nzchar(pat)) { |
| 572 | + } else if (nzchar(Sys.which("wget")) && nzchar(token)) { |
488 | 573 | fmt <- "--header=\"Authorization: token %s\"" |
489 | | - extra <- sprintf(fmt, pat) |
| 574 | + extra <- sprintf(fmt, token) |
490 | 575 | saved <- options("download.file.method", "download.file.extra") |
491 | 576 | options(download.file.method = "wget", download.file.extra = extra) |
492 | 577 | on.exit(do.call(base::options, saved), add = TRUE) |
|
0 commit comments