diff options
Diffstat (limited to 'utils/install_if_not_exist.R')
| -rw-r--r-- | utils/install_if_not_exist.R | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/utils/install_if_not_exist.R b/utils/install_if_not_exist.R new file mode 100644 index 00000000..9daf21ca --- /dev/null +++ b/utils/install_if_not_exist.R @@ -0,0 +1,75 @@ +#!/usr/bin/env Rscript +# +# Install an R package from the command line. Supports CRAN, GitHub, and local +# packages. +# +# It is expected that this is only run through R_setup.sh. +# +# This file is part of RSimpleVenv: https://github.com/GjjvdBurg/RSimpleVenv +# +# Author: G.J.J. van den Burg +# Date: 2019-06-20 +# License: MIT + +REPOS <- c("https://cran.r-project.org") + +# Parse args +args <- commandArgs(trailingOnly=T) +if (!length(args) == 1) { + print("Please provide a package name") + quit() +} +pkg <- args[1] + +# As a sanity check, ensure that nothing overwrote the R_LIBS variable +if (Sys.getenv("R_LIBS") != .libPaths()[1]) { + print("Mismatch between R_LIBS and .libPaths()[1]") + quit(status=1, save="no") +} + +# Install the package +if (startsWith(pkg, "github:")) { + pkg <- substring(pkg, nchar("github:")+1, nchar(pkg)) + # this check only works if the package name matches the repo name + pkgName <- basename(pkg) + if (pkgName %in% installed.packages()) { + cat("Package", pkgName, "exists.\n") + quit() + } + Sys.setenv(R_REMOTES_NO_ERRORS_FROM_WARNINGS="true") + # install_github returns the package name (yay!) + pkgName <- devtools::install_github(pkg) +} else if (startsWith(pkg, "local:")) { + pkgPath <- substring(pkg, nchar("local:")+1, nchar(pkg)) + pkgName <- basename(pkgPath) + if (pkgName %in% installed.packages()) { + cat("Package", pkgName, "exists.\n") + quit() + } + devtools::build(pkgPath) + devtools::install(pkgPath) +} else { + version <- NULL + if (grepl('==', pkg)) { + pkgName <- sub('==(.*)', '', pkg) + version <- sub('(.*)==', '', pkg) + } else { + pkgName <- pkg + } + + if (pkgName %in% installed.packages()) { + cat("Package", pkg, "exists.\n") + quit() + } + + if (pkgName == 'devtools') { + install.packages(pkgName, Sys.getenv('R_LIBS'), repos=REPOS, + dependencies=c('Depends', 'Imports', 'LinkingTo')) + } else { + devtools::install_version(pkgName, version=version, repos=REPOS) + } +} + +# Test if it works +if (!library(pkgName, character.only=T, logical.return=T)) + quit(status=1, save='no') |
