R/renv.R

#' Activate a Project
#'
#' Use `activate()` to write the infrastructure needed to ensure that
#' newly-launched \R projects will load the project's private library on launch,
#' alongside any other project-specific state recorded for the project.
#'
#' @inheritParams renv-params
#'
#' @family renv
#'
#' @export
activate <- function(project = NULL) {
  renv_scope_error_handler()
  project <- project %||% renv_project()
  renv_activate_impl(project, NULL)
}

renv_activate_impl <- function(project, version) {

  # prepare renv infrastructure
  renv_infrastructure_write(project, version)
  renv_bootstrap_impl()

  # set library paths now so that they're properly restored in new sessions
  renv_load_libpaths(project)

  # restart session
  renv_request_restart(project, reason = "renv activated")

}

#' Deactivate a Project
#'
#' Use `deactivate()` to remove the infrastructure used by `renv` to activate
#' projects for newly-launched \R sessions. In particular, this implies removing
#' the requisite code from the project `.Rprofile` that automatically activates
#' the project when new \R sessions are launched in the project directory.
#'
#' @inheritParams renv-params
#'
#' @family renv
#'
#' @export
deactivate <- function(project = NULL) {
  renv_scope_error_handler()
  project <- project %||% renv_project()

  renv_infrastructure_remove_rprofile(project)
  renv_envvars_restore()

  renv_request_restart(project, reason = "renv deactivated")
}

#' Load a Project
#'
#' Normally, this is done automatically on session startup by the infrastructure
#' generated by [activate()] -- users should not need to call this function
#' directly.
#'
#' @inheritParams renv-params
#'
#' @export
load <- function(project = NULL) {
  renv_scope_error_handler()
  project <- project %||% renv_project()

  renv_envvars_save()
  renv_load_renviron(project)
  renv_load_project(project)
  renv_load_profile(project)
  renv_load_envvars(project)
  renv_load_libpaths(project)
  renv_load_sandbox(project)

  lockfile <- renv_lockfile_load(project)
  if (length(lockfile)) {
    renv_load_r(lockfile$R)
    renv_load_bioconductor(lockfile$Bioconductor)
    renv_load_python(lockfile$Python)
  }

  renv_infrastructure_write(project)
  renv_load_finish()

  fmt <- "* Project '%s' loaded. [renv %s]"
  vwritef(fmt, aliased_path(project), renv_package_version("renv"))

  invisible(project)
}

renv_activate_version <- function(project) {

  # try to get version from activate.R
  methods <- list(
    renv_activate_version_activate,
    renv_activate_version_lockfile,
    renv_activate_version_default
  )

  for (method in methods) {
    version <- catch(method(project))
    if (is.character(version))
      return(version)
  }

  fmt <- "failed to determine renv version for project '%s'"
  stopf(fmt, aliased_path(project))

}

renv_activate_version_activate <- function(project) {

  activate <- file.path(project, "renv/activate.R")
  if (!file.exists(activate))
    return(NULL)

  contents <- readLines(activate, warn = FALSE)
  line <- grep("^\\s*version", contents, value = TRUE)
  parsed <- parse(text = line)[[1]]
  parsed[[3]]

}

renv_activate_version_lockfile <- function(project) {

  path <- renv_lockfile_path(project)
  if (!file.exists(path))
    return(NULL)

  lockfile <- renv_lockfile_read(path)
  lockfile$renv$Version

}

renv_activate_version_default <- function(project) {
  spec <- .getNamespaceInfo(.getNamespace("renv"), "spec")
  spec[["version"]]
}
slopp/renv documentation built on July 6, 2019, 12:08 a.m.