Skip to contents

Validate unpacked packets. Over time, expect this function to become more fully featured, validating more.

Usage

orderly_validate_archive(
  expr = NULL,
  name = NULL,
  action = "inform",
  root = NULL
)

Arguments

expr

The query expression. A NULL expression matches everything.

name

Optionally, the name of the packet to scope the query on. This will be intersected with scope arg and is a shorthand way of running scope = list(name = "name")

action

The action to take on finding an invalid packet. See Details.

root

The path to the root directory, or NULL (the default) to search for one from the current working directory. This function does not require that the directory is configured for orderly, and can be any outpack root (see orderly_init for details).

Value

Invisibly, a character vector of repaired (or invalid) packets.

Details

The actions that we can take on finding an invalid packet are:

  • inform (the default): just print information about the problem

  • orphan: mark the packet as orphaned within the metadata, but do not touch the files in your archive (by default the directory archive/) - this is a safe option and will leave you in a consistent state without deleting anything.

  • delete: in addition to marking the packet as an orphan, also delete the files from your archive.

Later, we will add a "repair" option to try and fix broken packets.

The validation interacts with the option core.require_complete_tree; if this option is TRUE, then a packet is only valid if all its (recursive) dependencies are also valid, so the action will apply to packets that have also had their upstream dependencies invalidated. This validation will happen even if the query implied by ... does not include these packets if a complete tree is required.

The validation will also interact with core.use_file_store once repair is supported, as this becomes trivial.

Examples

# Start with an archive containing 4 simple packets
path <- orderly_example()
#>  Created orderly root at '/tmp/Rtmp3NBL3X/orderly2_ex_1cf1207f16ed'
ids <- vapply(1:4, function(i) orderly_run("data", root = path), "")
#>  Starting packet 'data' `20250807-155628-5c147b29` at 2025-08-07 15:56:28.364082
#> > orderly_description(
#> +   display = "A demo data set")
#> > x <- jitter(1:30)
#> > y <- 0.4 * x + 5 + rnorm(length(x), sd = 2)
#> > d <- data.frame(x, y)
#> > orderly_artefact("data.rds", description = "A synthetic dataset")
#> > saveRDS(d, "data.rds")
#>  Finished running data.R
#>  Finished 20250807-155628-5c147b29 at 2025-08-07 15:56:28.389315 (0.02523303 secs)
#>  Starting packet 'data' `20250807-155628-68776732` at 2025-08-07 15:56:28.412469
#> > orderly_description(
#> +   display = "A demo data set")
#> > x <- jitter(1:30)
#> > y <- 0.4 * x + 5 + rnorm(length(x), sd = 2)
#> > d <- data.frame(x, y)
#> > orderly_artefact("data.rds", description = "A synthetic dataset")
#> > saveRDS(d, "data.rds")
#>  Finished running data.R
#>  Finished 20250807-155628-68776732 at 2025-08-07 15:56:28.437455 (0.02498627 secs)
#>  Starting packet 'data' `20250807-155628-78c15765` at 2025-08-07 15:56:28.47611
#> > orderly_description(
#> +   display = "A demo data set")
#> > x <- jitter(1:30)
#> > y <- 0.4 * x + 5 + rnorm(length(x), sd = 2)
#> > d <- data.frame(x, y)
#> > orderly_artefact("data.rds", description = "A synthetic dataset")
#> > saveRDS(d, "data.rds")
#>  Finished running data.R
#>  Finished 20250807-155628-78c15765 at 2025-08-07 15:56:28.502224 (0.02611399 secs)
#>  Starting packet 'data' `20250807-155628-8623ca56` at 2025-08-07 15:56:28.528537
#> > orderly_description(
#> +   display = "A demo data set")
#> > x <- jitter(1:30)
#> > y <- 0.4 * x + 5 + rnorm(length(x), sd = 2)
#> > d <- data.frame(x, y)
#> > orderly_artefact("data.rds", description = "A synthetic dataset")
#> > saveRDS(d, "data.rds")
#>  Finished running data.R
#>  Finished 20250807-155628-8623ca56 at 2025-08-07 15:56:28.554291 (0.02575445 secs)

# Suppose someone corrupts a packet by deleting a file:
fs::file_delete(file.path(path, "archive", "data", ids[[3]], "data.rds"))

# We can check all packets, and report on validity
orderly_validate_archive(root = path)
#>  20250807-155628-5c147b29 (data) is valid
#>  20250807-155628-68776732 (data) is valid
#>  20250807-155628-78c15765 (data) is invalid due to its files
#>  20250807-155628-8623ca56 (data) is valid

# Alternatively, we can take action and orphan the invalid packet:
orderly_validate_archive(action = "orphan", root = path)
#>  20250807-155628-5c147b29 (data) is valid
#>  20250807-155628-68776732 (data) is valid
#>  20250807-155628-78c15765 (data) is invalid due to its files
#>  20250807-155628-8623ca56 (data) is valid

# At which point the validation will not find this packet anymore
orderly_validate_archive(root = path)
#>  20250807-155628-5c147b29 (data) is valid
#>  20250807-155628-68776732 (data) is valid
#>  20250807-155628-8623ca56 (data) is valid

# The orphaned packet will no longer be found in most operations:
orderly_search(root = path)
#> [1] "20250807-155628-5c147b29" "20250807-155628-68776732"
#> [3] "20250807-155628-8623ca56"