diff options
author | Florian Klink <flokli@flokli.de> | 2023-10-10T22·22+0200 |
---|---|---|
committer | flokli <flokli@flokli.de> | 2023-10-14T13·23+0000 |
commit | 2d2c4322d93308ddffe1647466abd91025af6a68 (patch) | |
tree | 37ead8574df6eb98d76ca95636b50bf8fe1945cb /tvix/store/src/proto/mod.rs | |
parent | 5f8eb4eeaaad31aedc45efee3143e6b0bbc982a4 (diff) |
feat(tvix/store/protos): add Deriver field to PathInfo r/6805
This uses the newly introduced StorePath message type to add a Deriver field to the PathInfo message. Support for validation is added to both the golang and rust implementation. This includes extending unit tests. Change-Id: Ifc3eb3263fa25b9eec260db354cd74234c40af7e Reviewed-on: https://cl.tvl.fyi/c/depot/+/9647 Reviewed-by: Connor Brewster <cbrewster@hey.com> Tested-by: BuildkiteCI
Diffstat (limited to 'tvix/store/src/proto/mod.rs')
-rw-r--r-- | tvix/store/src/proto/mod.rs | 16 |
1 files changed, 15 insertions, 1 deletions
diff --git a/tvix/store/src/proto/mod.rs b/tvix/store/src/proto/mod.rs index 718e24912de1..4ebd4a31908f 100644 --- a/tvix/store/src/proto/mod.rs +++ b/tvix/store/src/proto/mod.rs @@ -48,7 +48,7 @@ pub enum ValidatePathInfoError { #[error("Inconsistent Number of References: {0} (references) vs {1} (narinfo)")] InconsistentNumberOfReferences(usize, usize), - /// A string in narinfo.reference_names does not parse to a StorePath. + /// A string in narinfo.reference_names does not parse to a [store_path::StorePath]. #[error("Invalid reference_name at position {0}: {1}")] InvalidNarinfoReferenceName(usize, String), @@ -60,6 +60,10 @@ pub enum ValidatePathInfoError { [u8; store_path::DIGEST_SIZE], [u8; store_path::DIGEST_SIZE], ), + + /// The deriver field is invalid. + #[error("deriver field is invalid: {0}")] + InvalidDeriverField(store_path::Error), } /// Parses a root node name. @@ -152,6 +156,16 @@ impl PathInfo { } }; + // If the Deriver field is populated, ensure it parses to a + // [store_path::StorePath]. + // We can't check for it to *not* end with .drv, as the .drv files produced by + // recursive Nix end with multiple .drv suffixes, and only one is popped when + // converting to this field. + if let Some(deriver) = &self.deriver { + store_path::StorePath::from_name_and_digest(deriver.name.clone(), &deriver.digest) + .map_err(ValidatePathInfoError::InvalidDeriverField)?; + } + // return the root nix path Ok(root_nix_path) } |