Clone the directory structure for a versioned asset into a separate location. This is typically used to prepare a new version for a lightweight upload.
cloneVersion(project, asset, version, destination, registry)
The directory structure of the specified version is cloned to destination
,
and a NULL
is invisibly returned.
Cloning involves creating a directory at destination
that has the same structure as that of the specified project-asset-version.
All files in the version are represented as symlinks from destination
to the corresponding file in the registry
.
The idea is that, when destination
is used in uploadDirectory
, the symlinks are converted into upload links.
This allows users to create new versions very cheaply as duplicate files are not uploaded to/stored in the backend.
Users can more-or-less do whatever they want inside the cloned destination
,
but the symlink targets should be read-only as they refer to immutable files in the registry
.
If a file in destination
needs to be modified, the symlink should be deleted and replaced with a new file.
allocateUploadDirectory
, to obtain a possible value for destination
.
uploadDirectory
, to prepare an upload based on the directory contents.
info <- startGobbler()
removeProject("test", info$staging, url=info$url) # start with a clean slate.
createProject("test", info$staging, url=info$url)
# Mocking up an upload.
src <- allocateUploadDirectory(info$staging)
write(file=file.path(src, "foo"), "BAR")
uploadDirectory("test", "simple", "v1", src, staging=info$staging, url=info$url)
# Creating a clone.
dest <- tempfile()
out <- cloneVersion("test", "simple", "v1", dest, registry=info$registry)
list.files(dest, recursive=TRUE)
#> [1] "foo"
Sys.readlink(file.path(dest, "foo"))
#> [1] "/tmp/Rtmpk5zsYr/file21928641d8f/test/simple/v1/foo"
readLines(file.path(dest, "foo"))
#> [1] "BAR"
# Files should be replaced rather than modified via the symlink:
existing <- file.path(dest, "foo")
unlink(existing) # Deleting the symlink...
write(file=existing, "YAY") # ... and writing a replacement file.