diff --git a/setup-r/README.Rmd b/setup-r/README.Rmd index fd20e8bd3..16873855b 100644 --- a/setup-r/README.Rmd +++ b/setup-r/README.Rmd @@ -47,7 +47,8 @@ steps: - uses: actions/checkout@v3 - uses: r-lib/actions/setup-r@v2 with: - r-version: '3.5.3' # The R version to download (if necessary) and use. + r-version: '3.5.3' # The R version to download (if necessary) and use. + # Use "renv" to retrieve R version recorded in renv.lock file. - run: Rscript -e 'print("hello")' ``` diff --git a/setup-r/README.md b/setup-r/README.md index 3a486d67f..44b6142dd 100644 --- a/setup-r/README.md +++ b/setup-r/README.md @@ -8,62 +8,63 @@ community](https://img.shields.io/badge/community-github--actions-blue?style=soc This action sets up an R environment for use in actions by: -- Downloading and caching a version of R by version and adding to PATH -- Registering [problem - matchers](https://github.com/r-lib/actions/tree/v2/setup-r/.github) - for error output -- Setting the following environment variables - - `NOT_CRAN=true` - - `TZ=UTC` - - `R_LIBS_USER=tempdir/Library` - - `_R_CHECK_SYSTEM_CLOCK_=FALSE` -- Removing the `-fopenmp` flags from Makeconf on macOS, which are not - supported with Apple’s default Command Line Tools compilers. -- Appending ‘on GitHub Actions’ to the default HTTP user agent. This - is useful to distinguish GitHub Actions package requests from other - sources. -- Supplying the installed R version as a `installed-r-version` output. +- Downloading and caching a version of R by version and adding to PATH +- Registering [problem + matchers](https://github.com/r-lib/actions/tree/v2/setup-r/.github) + for error output +- Setting the following environment variables + - `NOT_CRAN=true` + - `TZ=UTC` + - `R_LIBS_USER=tempdir/Library` + - `_R_CHECK_SYSTEM_CLOCK_=FALSE` +- Removing the `-fopenmp` flags from Makeconf on macOS, which are not + supported with Apple’s default Command Line Tools compilers. +- Appending ‘on GitHub Actions’ to the default HTTP user agent. This is + useful to distinguish GitHub Actions package requests from other + sources. +- Supplying the installed R version as a `installed-r-version` output. ## Inputs -- **r-version** (`'release'`) - Version range or exact version of an R - version to use. “devel” is the current development version, and - “next” is the next version of R, either R-patched, or R-alpha, - R-beta, R-rc or R-prerelease. -- **rtools-version** (`''`) - Exact version of Rtools to use. Default - uses latest suitable rtools for the given version of R. Set it to - “42” for Rtools42. -- **Ncpus** (`'1'`) - Value to set the R option `Ncpus` to. -- **remove-openmp-macos** (`true`) - If true, remove `-fopenmp` from - the default compilation flags, e.g. `SHLIB_OPENMP_CFLAGS`, as the - macOS Command Line Tools do not support OpenMP. -- **http-user-agent** (`'default'`) - If `"default"` or `""`, sets the - HTTPUserAgent option to e.g. for R 3.6.3 running on macOS Catalina, - `"R/3.6.3 R (3.6.3 x86_64-apple-darwin17.0 x86_64 darwin17.0) on GitHub Actions"`. - If `"release"` sets the user agent to the default user agent for the - current R release. Otherwise uses whatever value is passed to - `http-user-agent`. -- **install-r** (`true`) - If “true” download and install R during the - setup. If “false” use the existing installation in the GitHub Action - image. Note that if it is “false”, you probably need to run - `sudo apt-get update` yourself. -- **windows-path-include-rtools** (`true`) - Whether to add Rtools to - the PATH, on Windows. -- **windows-path-include-mingw** (`true`) - If “true” put the 64 bit - mingw directory from Rtools on the PATH for Windows builds. This - argument is now defunct on Rtools40 and later, which never add the - mingw directory to the path. -- **update-rtools** (`false`) - Update rtools40 compilers and - libraries to the latest builds. -- **use-public-rspm** (`false`) - Use the public version of Posit - package manager available at - to serve binaries for Linux and Windows. -- **extra-repositories** (`''`) - One or more extra CRAN-like - repositories to include in the `repos` global option +- **r-version** (`'release'`) - Version range or exact version of an R + version to use. “devel” is the current development version, and “next” + is the next version of R, either R-patched, or R-alpha, R-beta, R-rc + or R-prerelease. Use “renv” to retrieve R version recorded in + renv.lock file. +- **rtools-version** (`''`) - Exact version of Rtools to use. Default + uses latest suitable rtools for the given version of R. Set it to “42” + for Rtools42. +- **Ncpus** (`'1'`) - Value to set the R option `Ncpus` to. +- **remove-openmp-macos** (`true`) - If true, remove `-fopenmp` from the + default compilation flags, e.g. `SHLIB_OPENMP_CFLAGS`, as the macOS + Command Line Tools do not support OpenMP. +- **http-user-agent** (`'default'`) - If `"default"` or `""`, sets the + HTTPUserAgent option to e.g. for R 3.6.3 running on macOS Catalina, + `"R/3.6.3 R (3.6.3 x86_64-apple-darwin17.0 x86_64 darwin17.0) on GitHub Actions"`. + If `"release"` sets the user agent to the default user agent for the + current R release. Otherwise uses whatever value is passed to + `http-user-agent`. +- **install-r** (`true`) - If “true” download and install R during the + setup. If “false” use the existing installation in the GitHub Action + image. Note that if it is “false”, you probably need to run + `sudo apt-get update` yourself. +- **windows-path-include-rtools** (`true`) - Whether to add Rtools to + the PATH. +- **windows-path-include-mingw** (`true`) - If “true” put the 64 bit + mingw directory from Rtools on the PATH for Windows builds. This + argument is now defunct on Rtools40 and later, which never add the + mingw directory to the path. +- **update-rtools** (`false`) - Update rtools40 compilers and libraries + to the latest builds. +- **use-public-rspm** (`false`) - Use the public version of Posit + package manager available at to + serve binaries for Linux and Windows. +- **extra-repositories** (`''`) - One or more extra CRAN-like + repositories to include in the `repos` global option ## Outputs -- **installed-r-version** - The full R version installed by the action +- **installed-r-version** - The full R version installed by the action ## Usage @@ -74,7 +75,8 @@ steps: - uses: actions/checkout@v3 - uses: r-lib/actions/setup-r@v2 with: - r-version: '3.5.3' # The R version to download (if necessary) and use. + r-version: '3.5.3' # The R version to download (if necessary) and use. + # Use "renv" to retrieve R version recorded in renv.lock file. - run: Rscript -e 'print("hello")' ``` diff --git a/setup-r/action.yml b/setup-r/action.yml index 15a571dc4..87ef61a61 100644 --- a/setup-r/action.yml +++ b/setup-r/action.yml @@ -5,7 +5,8 @@ inputs: r-version: description: 'Version range or exact version of an R version to use. "devel" is the current development version, and "next" is the next version of R, either - R-patched, or R-alpha, R-beta, R-rc or R-prerelease.' + R-patched, or R-alpha, R-beta, R-rc or R-prerelease. Use "renv" to retrieve R + version recorded in renv.lock file.' default: 'release' rtools-version: description: 'Exact version of Rtools to use. Default uses latest suitable diff --git a/setup-r/lib/setup-r.js b/setup-r/lib/setup-r.js index d65978ace..f2840f59e 100644 --- a/setup-r/lib/setup-r.js +++ b/setup-r/lib/setup-r.js @@ -35,12 +35,28 @@ Object.defineProperty(exports, "__esModule", { value: true }); const core = __importStar(require("@actions/core")); const installer_1 = require("./installer"); const path = __importStar(require("path")); +const fs = __importStar(require("fs")); function run() { return __awaiter(this, void 0, void 0, function* () { try { core.debug(`started action`); - let version = core.getInput("r-version"); - core.debug(`got version ${version}`); + var version; + version = core.getInput("r-version"); + if (version === "renv") { + let renv_lock_path = "./renv.lock"; + if (fs.existsSync(renv_lock_path)) { + let renv_lock = fs.readFileSync(renv_lock_path).toString(); + version = JSON.parse(renv_lock).R.Version; + core.debug(`got version ${version} from renv.lock`); + } + else { + core.setFailed("./renv.lock does not exist."); + } + } + else { + version = version; + core.debug(`got version ${version} from input`); + } yield (0, installer_1.getR)(version); const matchersPath = path.join(__dirname, "..", ".github"); console.log(`##[add-matcher]${path.join(matchersPath, "rcmdcheck.json")}`); diff --git a/setup-r/src/setup-r.ts b/setup-r/src/setup-r.ts index fcb9ba9e8..05d508809 100644 --- a/setup-r/src/setup-r.ts +++ b/setup-r/src/setup-r.ts @@ -1,12 +1,28 @@ import * as core from "@actions/core"; import { getR } from "./installer"; import * as path from "path"; +import * as fs from "fs"; async function run() { try { core.debug(`started action`); - let version = core.getInput("r-version"); - core.debug(`got version ${version}`); + + var version: string + version = core.getInput("r-version") + + if (version === "renv") { + let renv_lock_path = "./renv.lock"; + if (fs.existsSync(renv_lock_path)) { + let renv_lock = fs.readFileSync(renv_lock_path).toString(); + version = JSON.parse(renv_lock).R.Version; + core.debug(`got version ${version} from renv.lock`); + } else { + core.setFailed("./renv.lock does not exist."); + } + } else { + version = version + core.debug(`got version ${version} from input`); + } await getR(version);