Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
84 changes: 45 additions & 39 deletions crates/ark/src/modules/positron/packages_pane.R
Original file line number Diff line number Diff line change
Expand Up @@ -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 "<email>" markers so "Hadley Wickham <h@posit.co>" 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)
}


Expand Down
Loading