diff options
author | Florian Klink <flokli@flokli.de> | 2023-11-22T18·11+0200 |
---|---|---|
committer | clbot <clbot@tvl.fyi> | 2023-11-22T18·24+0000 |
commit | eb84898c177b5c4157efebc44c56459b9cf1ccf7 (patch) | |
tree | d5acea05c31366f0d65cf04cad264c0fc79ea1c9 | |
parent | ef8a8af0bfa5963a4a19023acb2c94c3bc61f4d6 (diff) |
feat(nix-compat/narinfo): drop .drv from Narinfo.deriver field r/7046
We always know this needs to end with a .drv, and fail parsing if it doesn't, so there's no need to hang onto these 4 bytes. This will make it much easier to synthesize a NarInfo<'_> later on from a PathInfo proto, because we don't have to make this ".drv" appear out of thin air. Change-Id: Id95e7fd937d7c9a420a39b5a4bab73985640ca3b Reviewed-on: https://cl.tvl.fyi/c/depot/+/10084 Tested-by: BuildkiteCI Reviewed-by: edef <edef@edef.eu> Reviewed-by: raitobezarius <tvl@lahfa.xyz> Autosubmit: flokli <flokli@flokli.de>
-rw-r--r-- | tvix/nix-compat/src/narinfo/mod.rs | 27 | ||||
-rw-r--r-- | tvix/store/src/proto/mod.rs | 5 |
2 files changed, 16 insertions, 16 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 { diff --git a/tvix/store/src/proto/mod.rs b/tvix/store/src/proto/mod.rs index 558d7bc2831d..3e14f26e2761 100644 --- a/tvix/store/src/proto/mod.rs +++ b/tvix/store/src/proto/mod.rs @@ -212,10 +212,7 @@ impl From<&nix_compat::narinfo::NarInfo<'_>> for NarInfo { signatures, reference_names: value.references.iter().map(|r| r.to_string()).collect(), deriver: value.deriver.as_ref().map(|sp| StorePath { - // The parser already errors out with an error if the .drv suffix was missing, - // so you can only miss the suffix if you're manually constructing, - // which means we can unwrap here. - name: sp.name().strip_suffix(".drv").unwrap().to_owned(), + name: sp.name().to_owned(), digest: Bytes::copy_from_slice(sp.digest()), }), ca, |