feat(tvix/derivation): add validate_output_paths flag for validate

This allows calling validate() on a derivation that doesn't have its
output paths already calculated yet. It allows offloading some of the
error checking in builtins.derivation* to be offloaded to that function.

Change-Id: Ib4aeadc0eb6583ef8cd765f33e9a9ec32be62729
Reviewed-on: https://cl.tvl.fyi/c/depot/+/7848
Reviewed-by: tazjin <tazjin@tvl.su>
Autosubmit: flokli <flokli@flokli.de>
Tested-by: BuildkiteCI
This commit is contained in:
Florian Klink 2023-01-16 15:55:16 +01:00 committed by flokli
parent b1e8fe7212
commit 083e24bbb1
3 changed files with 12 additions and 6 deletions

View file

@ -24,10 +24,12 @@ impl Output {
self.hash.is_some()
}
pub fn validate(&self) -> Result<(), OutputError> {
pub fn validate(&self, validate_output_paths: bool) -> Result<(), OutputError> {
// TODO: add validation for hash, hashAlgo
if let Err(e) = StorePath::from_absolute_path(&self.path) {
return Err(OutputError::InvalidOutputPath(self.path.to_string(), e));
if validate_output_paths {
if let Err(e) = StorePath::from_absolute_path(&self.path) {
return Err(OutputError::InvalidOutputPath(self.path.to_string(), e));
}
}
Ok(())
}

View file

@ -39,7 +39,7 @@ fn validate(path_to_drv_file: &str) {
let derivation: Derivation = serde_json::from_str(&data).expect("JSON was not well-formatted");
derivation
.validate()
.validate(true)
.expect("derivation failed to validate")
}

View file

@ -4,7 +4,11 @@ use tvix_store::store_path::StorePath;
impl Derivation {
/// validate ensures a Derivation struct is properly populated,
/// and returns a [ValidateDerivationError] if not.
pub fn validate(&self) -> Result<(), DerivationError> {
/// if `validate_output_paths` is set to false, the output paths are
/// excluded from validation.
/// This is helpful to validate struct population before invoking
/// [Derivation::calculate_output_paths].
pub fn validate(&self, validate_output_paths: bool) -> Result<(), DerivationError> {
// Ensure the number of outputs is > 1
if self.outputs.is_empty() {
return Err(DerivationError::NoOutputs());
@ -41,7 +45,7 @@ impl Derivation {
break;
}
if let Err(e) = output.validate() {
if let Err(e) = output.validate(validate_output_paths) {
return Err(DerivationError::InvalidOutput(output_name.to_string(), e));
}
}