diff --git a/crates/ark/src/modules/positron/packages_pane.R b/crates/ark/src/modules/positron/packages_pane.R index 38dd3ce48..f8c4ede9a 100644 --- a/crates/ark/src/modules/positron/packages_pane.R +++ b/crates/ark/src/modules/positron/packages_pane.R @@ -8,48 +8,54 @@ # This file contains RPC functions for the packages pane. # These functions are called via callMethod from the Positron R extension. -# Return a list of installed packages +.ps.pkg_list_installed <- function(lib.loc = NULL) { + ip <- utils::installed.packages( + lib.loc = lib.loc, + fields = c("Description", "Maintainer") + ) + + name <- ip[, "Package"] + version <- ip[, "Version"] + id <- paste0(name, "-", version) + # Collapse whitespace so a multi-line Description fits on one line in the UI. + description <- trimws(gsub( + "\\s+", + " ", + ifelse(is.na(ip[, "Description"]), "", ip[, "Description"]), + perl = TRUE + )) + # Strip "" markers so "Hadley Wickham " becomes "Hadley Wickham". + author <- trimws(gsub( + "\\s*<[^>]+>", + "", + gsub( + "\\s+", + " ", + ifelse(is.na(ip[, "Maintainer"]), "", ip[, "Maintainer"]), + perl = TRUE + ), + perl = TRUE + )) + + unname(Map( + list, + id = id, + name = name, + displayName = name, + version = version, + description = description, + author = author + )) +} + +# Return a list of installed packages. The pak/base/renv methods exist for +# parity with install/update operations; for listing we always use +# utils::installed.packages(), scoped to the renv library when requested. #' @export .ps.rpc.pkg_list <- function(method = c("pak", "base", "renv")) { method <- match.arg(method) - switch( - method, - pak = { - old_opt <- options(pak.no_extra_messages = TRUE) - on.exit(options(old_opt), add = TRUE) - pkgs <- pak::lib_status() - lapply(seq_len(nrow(pkgs)), function(i) { - list( - id = paste0(pkgs$package[[i]], "-", pkgs$version[[i]]), - name = pkgs$package[[i]], - displayName = pkgs$package[[i]], - version = as.character(pkgs$version[[i]]) - ) - }) - }, - base = { - ip <- utils::installed.packages() - lapply(seq_len(nrow(ip)), function(i) { - list( - id = paste0(ip[i, "Package"], "-", ip[i, "Version"]), - name = ip[i, "Package"], - displayName = ip[i, "Package"], - version = ip[i, "Version"] - ) - }) - }, - renv = { - ip <- utils::installed.packages(lib.loc = renv::paths$library()) - lapply(seq_len(nrow(ip)), function(i) { - list( - id = paste0(ip[i, "Package"], "-", ip[i, "Version"]), - name = ip[i, "Package"], - displayName = ip[i, "Package"], - version = ip[i, "Version"] - ) - }) - } - ) + lib.loc <- if (method == "renv") renv::paths$library() else NULL + .ps.pkg_list_installed(lib.loc = lib.loc) }