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
73 changes: 50 additions & 23 deletions crates/ark/src/modules/positron/packages_pane.R
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,49 @@
# This file contains RPC functions for the packages pane.
# These functions are called via callMethod from the Positron R extension.

# Normalize a DESCRIPTION field value for display: collapse whitespace/newlines
# into single spaces so a multi-line Description fits on one line in the UI.
.ps.pkg_description_text <- function(value) {
if (is.null(value) || is.na(value)) {
return("")
}
value <- as.character(value)
value <- gsub("\\s+", " ", value, perl = TRUE)
trimws(value)
}

# Normalize a Maintainer/Author value for display: collapse whitespace and strip
# trailing email addresses in angle brackets (e.g., "Hadley Wickham <h@posit.co>"
# becomes "Hadley Wickham").
.ps.pkg_author_text <- function(value) {
if (is.null(value) || is.na(value)) {
return("")
}
value <- as.character(value)
value <- gsub("\\s+", " ", value, perl = TRUE)
value <- gsub("\\s*<[^>]+>", "", value, perl = TRUE)
trimws(value)
}

# Build the package list via utils::installed.packages(), optionally scoped to a
# specific library path (used by the renv method).
.ps.pkg_list_installed <- function(lib.loc = NULL) {
ip <- utils::installed.packages(
lib.loc = lib.loc,
fields = c("Description", "Maintainer")
)
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"],
description = .ps.pkg_description_text(ip[i, "Description"]),
author = .ps.pkg_author_text(ip[i, "Maintainer"])
)
})
}

# Return a list of installed packages
#' @export
.ps.rpc.pkg_list <- function(method = c("pak", "base", "renv")) {
Expand All @@ -23,32 +66,16 @@
id = paste0(pkgs$package[[i]], "-", pkgs$version[[i]]),
name = pkgs$package[[i]],
displayName = pkgs$package[[i]],
version = as.character(pkgs$version[[i]])
version = as.character(pkgs$version[[i]]),
description = .ps.pkg_description_text(pkgs$description[[
i
]]),
author = .ps.pkg_author_text(pkgs$maintainer[[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"]
)
})
}
base = .ps.pkg_list_installed(),
renv = .ps.pkg_list_installed(lib.loc = renv::paths$library())
)
}

Expand Down
Loading