about summary refs log tree commit diff
diff options
context:
space:
mode:
authorFlorian Klink <flokli@flokli.de>2023-11-22T18·11+0200
committerclbot <clbot@tvl.fyi>2023-11-22T18·24+0000
commiteb84898c177b5c4157efebc44c56459b9cf1ccf7 (patch)
treed5acea05c31366f0d65cf04cad264c0fc79ea1c9
parentef8a8af0bfa5963a4a19023acb2c94c3bc61f4d6 (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.rs27
-rw-r--r--tvix/store/src/proto/mod.rs5
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 3fa73103bd..8439403b59 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 558d7bc283..3e14f26e27 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,