getDependentPackagesToInstall <- function()

in R/R/sqlPackage.R [1122:1194]


getDependentPackagesToInstall <- function(pkgs, availablePackages, installedPackages, skipMissing = FALSE,
                                            verbose = getOption("verbose"))
{
    #
    # prune requested packages to exclude base packages
    #
    basePackages <- installedPackages[installedPackages[,"Priority"] %in% c("base", "recommended"), c("Package", "Priority"), drop = FALSE]$Package
    droppedPackages <- pkgs[pkgs %in% basePackages]

    if (length(droppedPackages) > 0)
    {
        warning(sprintf("Skipping base packages (%s)", paste(droppedPackages, collapse = ', ')), call. = FALSE)
    }

    pkgs <- pkgs[!(pkgs %in% droppedPackages)]

    if (length(pkgs) < 1)
    {
        return (NULL)
    }

    #
    # get dependency closure for all given packages
    # note: by default we obtain a package+dependencies from one CRAN which should have versions that work together without conflicts.
    #
    if (verbose)
    {
        write(sprintf("%s  Resolving package dependencies for (%s)...", pkgTime(), paste(pkgs, collapse = ', ')), stdout())
    }

    dependencies <- tools::package_dependencies(packages = pkgs, db = availablePackages, recursive = TRUE, verbose = FALSE)

    #
    # get combined dependency closure w/o base packages
    #
    dependencies <- unique(unlist(c(dependencies, names(dependencies)), recursive = FALSE, use.names = FALSE))
    dependencies <- dependencies[dependencies != "NA"]
    dependencies <- dependencies[!(dependencies %in% basePackages)]

    if (length(dependencies) < 1)
    {
        return (NULL)
    }

    #
    # are there any missing packages in dependency closure?
    #
    availablePackageNames <- rownames(availablePackages)
    missingPackages <- dependencies[!(dependencies %in% availablePackageNames)]

    if (length(missingPackages) > 0)
    {
        missingPackagesStr <- sprintf("Missing dependency packages (%s)", paste(missingPackages, collapse = ', '))

        if (!skipMissing)
        {
            stop(missingPackagesStr, call. = FALSE)
        }
        else
        {
            warning(missingPackagesStr, call. = FALSE)
        }
    }

    #
    # get the packages in order of dependency closure
    #
    dependencies <- unique(dependencies)
    pkgsToInstall <- availablePackages[match(dependencies, availablePackageNames),]
    pkgsToInstall <- pkgsToInstall[!is.na(pkgsToInstall$Package),]

    return (pkgsToInstall)
}