R/timestamps.R

Defines functions init_timestamps timestamp un_timestamp check_timestamps

init_timestamps = function(targetnames, remakefile){
  unlink(timestampdir, recursive = TRUE)
  dir.create(timestampdir)
  zip = system.file("timestamp.zip", package = "parallelRemake", mustWork = TRUE)
  unzip(zip, setTimes = TRUE)
  current = targetnames[remake::is_current(targetnames, remake_file = remakefile)]
  current_timestamps = timestamp(current)
  lapply(unique(dirname(current_timestamps)), dir.create, recursive = TRUE, showWarnings = FALSE)
  lapply(current_timestamps, file.copy, from = ".timestamp", copy.date = TRUE)
  unlink(".timestamp")
  invisible()
}

timestampdir = ".makefile"

timestamp = function(x){
  if(!length(x)) return(character(0))
  dirs = dirname(x)
  dirs = unique(dirs[dirs != "."])
  x = paste0("t", base64url::base64_urlencode(x)) # must begin with alphanumeric
  file.path(timestampdir, x)
}

un_timestamp = function(x){
  # Matches timestampdir at the beginning, plus one character (path separator)
  rx = utils::glob2rx(paste0(timestampdir, "?*"))
  gsub(rx, "", x) %>% gsub(pattern = "^t", replacement = "") %>%
    base64url::base64_urldecode()
}

check_timestamps = function(){
  zip = system.file("timestamp.zip", package = "parallelRemake", mustWork = TRUE)
  unzip(zip, setTimes = TRUE)
  lapply(list.files(timestampdir, full.names = TRUE), 
    function(x) stopifnot(file.mtime(".timestamp") == file.mtime(x)))
}
wlandau/parallelRemake documentation built on May 4, 2019, 8:44 a.m.