diff options
Diffstat (limited to 'tvix/nix-compat/src/narinfo/mod.rs')
-rw-r--r-- | tvix/nix-compat/src/narinfo/mod.rs | 27 |
1 files changed, 15 insertions, 12 deletions
diff --git a/tvix/nix-compat/src/narinfo/mod.rs b/tvix/nix-compat/src/narinfo/mod.rs index 3fa73103bde6..8439403b59e9 100644 --- a/tvix/nix-compat/src/narinfo/mod.rs +++ b/tvix/nix-compat/src/narinfo/mod.rs @@ -53,7 +53,7 @@ pub struct NarInfo<'a> { // derivation metadata /// Nix system triple of [deriver] pub system: Option<&'a str>, - /// Store path of the derivation that produced this + /// Store path of the derivation that produced this. The last .drv suffix is stripped. pub deriver: Option<StorePathRef<'a>>, // cache-specific untrusted metadata /// Relative URL of the compressed NAR file @@ -227,16 +227,19 @@ impl<'a> NarInfo<'a> { } } "Deriver" => { - let val = StorePathRef::from_bytes(val.as_bytes()) - .map_err(Error::InvalidDeriverStorePath)?; - - if !val.name().ends_with(".drv") { - return Err(Error::InvalidDeriverStorePathMissingSuffix); - } - - if deriver.replace(val).is_some() { - return Err(Error::DuplicateField(tag.to_string())); - } + match val.strip_suffix(".drv") { + Some(val) => { + let val = StorePathRef::from_bytes(val.as_bytes()) + .map_err(Error::InvalidDeriverStorePath)?; + + if deriver.replace(val).is_some() { + return Err(Error::DuplicateField(tag.to_string())); + } + } + None => { + return Err(Error::InvalidDeriverStorePathMissingSuffix); + } + }; } "Sig" => { let val = Signature::parse(val) @@ -325,7 +328,7 @@ impl Display for NarInfo<'_> { writeln!(w)?; if let Some(deriver) = &self.deriver { - writeln!(w, "Deriver: {deriver}")?; + writeln!(w, "Deriver: {deriver}.drv")?; } if let Some(system) = self.system { |