#' Creates a new repository backed by the given storage.
#'
#' @param store Read and write objects into this storage.
#'
#' @rdname repository
#'
#' @importFrom proto proto
#' @export
#'
repository <- function (store)
{
stopifnot(storage::is_object_store(store))
r <- proto::proto(expr = {
store = store
last_png = NULL
last_commit = list(objects = list(), id = NA_character_)
})
class(r) <- c('repository', class(r))
r
}
#' @description `is_repository` verifies whether `x` is a repository
#' object.
#'
#' @param x Object to be tested, converted or printed.
#'
#' @rdname repository
#' @export
#'
is_repository <- function (x) inherits(x, 'repository')
#' @param ... further arguments passed to or from other methods.
#'
#' @rdname repository
#' @export
#'
print.repository <- function (x, ...) {
cat(toString(x), '\n')
invisible(x)
}
#' @rdname repository
#' @export
#'
toString.repository <- function (x, ...) {
paste0('<repository:', toString(x$store), '>')
}
#' @description `repository_update` appends a new commit to the repository.
#'
#' @param repo A repository object.
#' @param env Environment to create a commit from (e.g. [globalenv]).
#' @param plot A recorded plot (see [grDevices::recordPlot]).
#' @param expr The expression related to the most recent changed in `env`.
#'
#' @rdname repository
#' @export
#'
repository_update <- function (repo, env, plot, expr) {
guard()
stopifnot(is_repository(repo))
updater <- repository_updater(repo, env, plot, expr)
updater$process_objects()
updater$process_plot()
# if there are new artifacts, store a new commit
if (updater$introduced_changes()) {
updater$write()
updater$sync_repo()
}
}
#' @description `repository_rewind` changes the internal pointer to the
#' _last commit_ and, if `id` denotes a historical commit, sets it to
#' that value. Subsequent commits will be recorded as descendants of
#' commit `id`.
#'
#' @param id commit identifier.
#'
#' @export
#' @rdname repository
repository_rewind <- function (repo, id) {
guard()
stopifnot(is_repository(repo))
tryCatch({
tags <- storage::os_read_tags(repo$store, id)
stopifnot(identical(tags$class, "commit"))
}, error = function (e) {
stop("cannot find commit matching id ", id, call. = FALSE)
})
repo$last_commit <- list(
id = id,
objects = storage::os_read_object(repo$store, id)$objects
)
invisible()
}
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.