R/ratpack.R

Defines functions symlink_packages get_user_packages import_user_packages

Documented in get_user_packages import_user_packages symlink_packages

#' Symlink installed packages to your new, empty, packrat directory
#'
#' @return NULL
#' @export symlink_packages
#' @import packrat
#' @import utils
#'
#' @examples symlink_packages()
symlink_packages <- function(){

  #Fail if it isn't in a packrat project
  if(packrat:::isPackratModeOn()==FALSE){
    stop('Packrat is not turned on, this function must be run in a packrat project')
  }


  #Work out the current packrat lib
  #Code from packrat package:
  getPackratLibDir <- function(projDir = NULL) {
    path <- file.path("packrat", "lib", R.version$platform, getRversion())

    if (!is.null(projDir)) {

      ## Strip trailing slashes if necessary
      projDir <- sub("/+$", "", projDir)

      ## Only prepend path if different from current working dir
      if (!identical(normalizePath(projDir), normalizePath(getwd())))
        path <- file.path(projDir, path)
    }

    path
  }

  target_lib<-
    getPackratLibDir(projDir = .rs.getProjectDirectory())

  user_packages <- get_user_packages()

  #Don't include duplicates.
  #This should priorities user installed packages, as the order goes
  #User, site, system for .libPath
  user_packages<-
    user_packages[!duplicated(user_packages[,'Package']),]

  for (pkg in 1:nrow(user_packages)) {
    r_path <-user_packages[pkg,'LibPath']
    r_name <- user_packages[pkg,'Package']

    source <- file.path(r_path, r_name)
    target <- file.path(target_lib, r_name)

    if (!packrat:::ensurePackageSymlink(source, target))
      return(FALSE)

    message(c('Symlinking ',r_name))
    message(c('    from ', r_path, ' to ', target_lib))
    message('---------------------')

  }

  message('Once you\'re done developing run packrat::clean(); packrat::snapshot()')
}

#' returns users packages from outside the packrat library
#'
#' @return users installed packages
#' @export get_user_packages
#'
#' @examples get_user_packages()
get_user_packages <- function(){
  #Grab the lists from a fresh user R session, so it'll work within a packrat
  original_dir <-
    "R  --slave --no-init-file -e \"cat(.libPaths())\""
  list_of_libs<-
    system(original_dir, intern=TRUE)
  list_of_libs<-
    unlist(strsplit(list_of_libs, split = ' '))

  user_packages<-
    utils::installed.packages(list_of_libs)[is.na(utils::installed.packages(list_of_libs)[,"Priority"]),]

  #Dont include packrat, or it will fail!
  user_packages<-
    user_packages[!user_packages[,'Package']=='packrat',]

  #Don't include duplicates.
  #This should priorities user installed packages, as the order goes
  #User, site, system for .libPath
  user_packages<-
    user_packages[!duplicated(user_packages[,'Package']),]
}


#' Add users installed packages to the external.packages option of packrat
#' This means that package sources wont be included in the packrat, so best
#' to run packrat::set_opts(external.packages=NULL) before packrat::snapshot
#'
#' @export import_user_packages
#'
#' @examples import_user_packages()
import_user_packages <- function(){
  #Fail if it isn't in a packrat project
  if(packrat:::isPackratModeOn()==FALSE){
    stop('Packrat is not turned on, this function must be run in a packrat project')
  }

  u_p<-get_user_packages()
  u_p<-row.names(u_p)
  u_p_string <- paste(u_p, collapse=",")

  do.call(packrat::set_opts,
          args=list(external.packages=u_p_string))


  writeLines(paste(u_p, collapse = '\n'))
  message('^ The above packages were added to packrat\'s external packages')

  }
willbowditch/ratpack documentation built on May 24, 2019, 7:50 a.m.