## ----setup, include = FALSE------------------------------------------------------ library(knitr) opts_chunk$set( collapse = TRUE, comment = "#>" ) set.seed(20120225) ## ----initialize------------------------------------------------------------------ # initialize a bare git repo to be used as remote remote <- tempfile("git2rdata-workflow-remote") remote <- normalizePath(remote, winslash = "/") dir.create(remote) git2r::init(remote, bare = TRUE) # initialize a local git repo path <- tempfile("git2rdata-workflow") path <- normalizePath(path, winslash = "/") dir.create(path) init_repo <- git2r::clone(remote, path, progress = FALSE) git2r::config(init_repo, user.name = "me", user.email = "me@me.com") # add an initial commit with .gitignore file writeLines("*extra*", file.path(path, ".gitignore")) git2r::add(init_repo, ".gitignore", force = TRUE) git2r::commit(init_repo, message = "Initial commit") # push initial commit to remote branch_name <- git2r::branches(init_repo)[[1]]$name git2r::push( init_repo, "origin", file.path("refs", "heads", branch_name, fsep = "/") ) rm(init_repo) ## ----store_data_1---------------------------------------------------------------- library(git2rdata) repo <- repository(path) fn <- write_vc(beaver1, "beaver", repo, sorting = "time", stage = TRUE) ## ----avoid_subsecond_commit, echo = FALSE---------------------------------------- Sys.sleep(1.2) ## ----commit_data_1--------------------------------------------------------------- status(repo) cm1 <- commit(repo, message = "First commit") cat(cm1$message) ## ----store_data_2---------------------------------------------------------------- fn <- write_vc(beaver2, "extra_beaver", repo, sorting = "time", stage = TRUE) status(repo) ## ----avoid_subsecond_commit2, echo = FALSE--------------------------------------- Sys.sleep(1.2) ## -------------------------------------------------------------------------------- status(repo, ignored = TRUE) fn <- write_vc(beaver2, "extra_beaver", repo, sorting = "time", stage = TRUE, force = TRUE) status(repo) cm2 <- commit(repo, message = "Second commit") ## ----avoid_subsecond_commit3, echo = FALSE--------------------------------------- Sys.sleep(1.2) ## ----store_data_3---------------------------------------------------------------- beaver1$beaver <- 1 beaver2$beaver <- 2 beaver <- rbind(beaver1, beaver2) fn <- write_vc(beaver, "beaver", repo, sorting = c("beaver", "time"), strict = FALSE, stage = TRUE) file.remove(list.files(path, "extra", full.names = TRUE)) status(repo) cm3 <- commit(repo, message = "Third commit", all = TRUE) status(repo) ## ----eval = FALSE---------------------------------------------------------------- # # load package # library(git2rdata) # # step 1: setup the repository and data path # repo <- repository(".") # data_path <- file.path("data", "beaver") # # step 1b: sync the repository with the remote # pull(repo = repo) # # step 2: remove all existing data files # rm_data(root = repo, path = data_path, stage = TRUE) # # # step 3: write all relevant git2rdata objects to the data path # beaver1$beaver <- 1 # beaver2$beaver <- 2 # body_temp <- rbind(beaver1, beaver2) # fn <- write_vc(x = body_temp, file = file.path(data_path, "body_temperature"), # root = repo, sorting = c("beaver", "time"), stage = TRUE) # # # step 4: remove any dangling metadata files # prune_meta(root = repo, path = data_path, stage = TRUE) # # # step 5: commit the changes # cm <- commit(repo = repo, message = "import") # # step 5b: sync the repository with the remote # push(repo = repo) ## ----eval = FALSE---------------------------------------------------------------- # #' Import the beaver body temperature data # #' @param path the root of the git repository # #' @importFrom git2rdata repository pull rm_data write_vc prune_meta commit push # #' @export # import_body_temp <- function(path) { # # step 1: setup the repository and data path # repo <- repository(path) # data_path <- file.path("data", "beaver") # # step 1b: sync the repository with the remote # pull(repo = repo) # # step 2: remove all existing data files # rm_data(root = repo, path = data_path, stage = TRUE) # # # step 3: write all relevant git2rdata objects to the data path # beaver1$beaver <- 1 # beaver2$beaver <- 2 # body_temp <- rbind(beaver1, beaver2) # write_vc(x = body_temp, file = file.path(data_path, "body_temperature"), # root = repo, sorting = c("beaver", "time"), stage = TRUE) # # # step 4: remove any dangling metadata files # prune_meta(root = repo, path = data_path, stage = TRUE) # # # step 5: commit the changes # commit(repo = repo, message = "import", session = TRUE) # # step 5b: sync the repository with the remote # push(object = repo) # } ## ----standardized_analysis------------------------------------------------------- analysis <- function(ds_name, repo) { ds <- read_vc(ds_name, repo) list( dataset = ds_name, repository = git2r::remote_url(repo), commit = recent_commit(ds_name, repo, data = TRUE), model = lm(temp ~ activ, data = ds) ) } report <- function(x) { knitr::kable( coef(summary(x$model)), caption = sprintf("**dataset:** %s \n**commit:** %s \n**repository:** %s", x$dataset, x$commit$commit, x$repository) ) } ## ----run_current_analyses, results = "asis"-------------------------------------- repo <- repository(path) current <- lapply(list_data(repo), analysis, repo = repo) names(current) <- list_data(repo) result <- lapply(current, report) junk <- lapply(result, print) ## ----run_previous_analyses, results = "asis"------------------------------------- # checkout first commit git2r::checkout(cm1) # do analysis previous <- lapply(list_data(repo), analysis, repo = repo) names(previous) <- list_data(repo) result <- lapply(previous, report) junk <- lapply(result, print) # checkout second commit git2r::checkout(cm2) # do analysis previous <- lapply(list_data(repo), analysis, repo = repo) names(previous) <- list_data(repo) result <- lapply(previous, report) junk <- lapply(result, print)