#!/usr/bin/env r # # Another example to check one or more packages, with option parsing # # Copyright (C) 2015 - 2023 Dirk Eddelbuettel # # Released under GPL (>= 2) ## load docopt package from CRAN library(docopt) ## configuration for docopt doc <- "Usage: check.r [-h] [-x] [--as-cran] [--repo REPO] [--no-manvig] [--install-deps] [--install-kitchen] [--deb-pkgs PKGS...] [--use-sudo] [--library LIB] [--setwd DIR] [TARGZ ...] -a --as-cran customization similar to CRAN's incoming [default: FALSE] -r --repo REPO repository to use, or NULL for file [default: https://cloud.r-project.org] -n --no-manvig set the '--no-manual --no-vignettes' options [default: FALSE] -i --install-deps also install packages along with their dependencies [default: FALSE] -k --install-kitchen even install packages 'kitchen sink'-style up to suggests [default: FALSE] -l --library LIB when installing use this library [default: /usr/local/lib/R/site-library] -s --setwd DIR change to this directory before undertaking the test [default: ] -d --deb-pkgs PKGS also install binary .deb packages with their dependencies [default: FALSE] -u --use-sudo use sudo when installing .deb packages [default: FALSE] -h --help show this help text -x --usage show help and short example usage" ## docopt parsing opt <- docopt(doc) if (opt$usage) { cat(doc, "\n\n") cat("Examples: check.r -a -i -s /tmp myPkg_1.2-3.tar.gz # run a check --as-cran with depends in /tmp # for package myPkg_1.2-3.tar.gz check.r is part of littler which brings 'r' to the command-line. See https://dirk.eddelbuettel.com/code/littler.html for more information.\n") q("no") } args <- character() if (opt$as_cran) args <- c(args, "--as-cran") if (opt$no_manvig) args <- c(args, "--no-manual", "--no-vignettes") if (!is.null(opt$libdir)) .libPaths(opt$libdir) r <- getOption("repos") r["CRAN"] <- opt$repo options(repos = r) hasRcmdcheck <- requireNamespace("rcmdcheck", quietly=TRUE) if (hasRcmdcheck) suppressMessages(library("rcmdcheck")) ## helper functions checkArg <- function(p, args) { if (hasRcmdcheck) { #if (length(args) == 0) args <- "" res <- rcmdcheck(p, args=args) } else { tools:::.check_packages(c(p, args)) res <- NULL } res } ## helper function which switches to local (ie NULL) repo if matching file is presented installArg <- function(p, lib, rep) { p <- gsub("_.*tar\\.gz$", "", p) install.packages(pkgs=p, lib=lib, repos=rep, dependencies=if(opt$install_kitchen) c("Depends", "Imports", "LinkingTo", "Suggests") else TRUE ) } ## if binary .deb files are to be installed first: if (length(opt$deb_pkgs) > 1 || opt$deb_pkgs != FALSE) { cmd <- paste0(if (opt$use_sudo) "sudo " else "", "apt-get install -y ", paste(opt$deb_pkgs, collapse=" ")) system(cmd) } ## if dependencies (or even suggests) are to be installed first: if (opt$install_deps || opt$install_kitchen) sapply(opt$TARGZ, installArg, opt$lib, opt$repo) ## change directory if a target directory was given if (!is.null(opt$setwd)) setwd(opt$setwd) ## installation given selected options and arguments sapply(opt$TARGZ, checkArg, args)