diff --git a/DESCRIPTION b/DESCRIPTION index 4d9e5f0..0157d12 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -8,3 +8,4 @@ URL: https://avsdev.uk/R/Rpacman Description: Very simple package manager for R which allows scanning for used packages, finding their dependencies and versions, creating a lock file and installing the packages on a new build. License: GPL (>= 3) Depends: R (>= 3.1.0), dplyr, magrittr, renv +RoxygenNote: 7.1.1 diff --git a/NAMESPACE b/NAMESPACE new file mode 100644 index 0000000..6c3c1ff --- /dev/null +++ b/NAMESPACE @@ -0,0 +1,3 @@ +# Generated by roxygen2: do not edit by hand + +export(list_depends) diff --git a/R/list_depends.R b/R/list_depends.R new file mode 100644 index 0000000..34ecbc6 --- /dev/null +++ b/R/list_depends.R @@ -0,0 +1,39 @@ + +.list_depends <- function(depends, gen) { + packages <- installed.packages() + packages <- as.data.frame(packages) + packages <- packages[packages$Package %in% depends,] + packages <- packages[,c("Package", "Version", "Imports")] + packages$Imports <- gsub(packages$Imports, pattern = "\n", replacement = " ") + packages$Imports <- strsplit(packages$Imports, ", ") + packages <- data.frame( + package = rep(packages$Package, lengths(packages$Imports)), + version = rep(packages$Version, lengths(packages$Imports)), + imports = unlist(packages$Imports) + ) + packages$min_version <- gsub(packages$imports, pattern = "[^ ]*( \\([=> ]*([^)]+)\\))?", replacement = "\\2") + packages$min_version = ifelse(nchar(packages$min_version) == 0, NA_character_, packages$min_version) + packages$imports <- gsub(packages$imports, pattern = " \\([^)]*\\)", replacement = "") + packages$generation <- gen + + depends_next <- packages$imports[!is.na(packages$imports)] + depends_next <- sort(unique(depends_next)) + if (length(depends_next) > 0) { + packages_next <- list_imports(depends_next, gen + 1) + packages <- rbind(packages, packages_next) + } + + return(packages) +} + + +#' Recursively find all the installed dependencies of one or more installed +#' packages. +#' +#' @param depends A character vector of packages to find dependencies of +#' +#' @return A data frame with the dependency tree +#' @export +list_depends <- function(depends) { + .list_depends(depends, gen = 0) +} \ No newline at end of file diff --git a/man/list_depends.Rd b/man/list_depends.Rd new file mode 100644 index 0000000..103142c --- /dev/null +++ b/man/list_depends.Rd @@ -0,0 +1,17 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/list_depends.R +\name{list_depends} +\alias{list_depends} +\title{Recursively find all the installed dependencies of one or more packages.} +\usage{ +list_depends(depends) +} +\arguments{ +\item{depends}{A character vector of packages to find dependencies of} +} +\value{ +A data frame with the dependency tree +} +\description{ +Recursively find all the installed dependencies of one or more packages. +}