diff options
Diffstat (limited to 'tvix/store/src/nar')
-rw-r--r-- | tvix/store/src/nar/import.rs | 40 | ||||
-rw-r--r-- | tvix/store/src/nar/mod.rs | 6 | ||||
-rw-r--r-- | tvix/store/src/nar/renderer.rs | 33 |
3 files changed, 31 insertions, 48 deletions
diff --git a/tvix/store/src/nar/import.rs b/tvix/store/src/nar/import.rs index ac50e7e4301f..71ab9bd588cd 100644 --- a/tvix/store/src/nar/import.rs +++ b/tvix/store/src/nar/import.rs @@ -12,7 +12,7 @@ use tvix_castore::{ blobs::{self, ConcurrentBlobUploader}, ingest_entries, IngestionEntry, IngestionError, }, - PathBuf, {NamedNode, Node}, + Node, PathBuf, }; /// Ingests the contents from a [AsyncRead] providing NAR into the tvix store, @@ -97,9 +97,7 @@ where let (_, node) = try_join!(produce, consume)?; - // remove the fake "root" name again - debug_assert_eq!(&node.get_name()[..], b"root"); - Ok(node.rename("".into())) + Ok(node) } async fn produce_nar_inner<BS>( @@ -198,13 +196,7 @@ mod test { .expect("must parse"); assert_eq!( - Node::Symlink( - SymlinkNode::new( - "".into(), // name must be empty - "/nix/store/somewhereelse".into(), - ) - .unwrap() - ), + Node::Symlink(SymlinkNode::new("/nix/store/somewhereelse".into(),).unwrap()), root_node ); } @@ -224,15 +216,11 @@ mod test { .expect("must parse"); assert_eq!( - Node::File( - FileNode::new( - "".into(), // name must be empty - HELLOWORLD_BLOB_DIGEST.clone(), - HELLOWORLD_BLOB_CONTENTS.len() as u64, - false, - ) - .unwrap() - ), + Node::File(FileNode::new( + HELLOWORLD_BLOB_DIGEST.clone(), + HELLOWORLD_BLOB_CONTENTS.len() as u64, + false, + )), root_node ); @@ -255,14 +243,10 @@ mod test { .expect("must parse"); assert_eq!( - Node::Directory( - DirectoryNode::new( - "".into(), // name must be empty - DIRECTORY_COMPLICATED.digest(), - DIRECTORY_COMPLICATED.size(), - ) - .unwrap() - ), + Node::Directory(DirectoryNode::new( + DIRECTORY_COMPLICATED.digest(), + DIRECTORY_COMPLICATED.size(), + )), root_node, ); diff --git a/tvix/store/src/nar/mod.rs b/tvix/store/src/nar/mod.rs index ca2423b5ce59..da798bbf3a3c 100644 --- a/tvix/store/src/nar/mod.rs +++ b/tvix/store/src/nar/mod.rs @@ -37,13 +37,13 @@ pub enum RenderError { #[error("failure talking to a backing store client: {0}")] StoreError(#[source] std::io::Error), - #[error("unable to find directory {}, referred from {:?}", .0, .1)] + #[error("unable to find directory {0}, referred from {1:?}")] DirectoryNotFound(B3Digest, bytes::Bytes), - #[error("unable to find blob {}, referred from {:?}", .0, .1)] + #[error("unable to find blob {0}, referred from {1:?}")] BlobNotFound(B3Digest, bytes::Bytes), - #[error("unexpected size in metadata for blob {}, referred from {:?} returned, expected {}, got {}", .0, .1, .2, .3)] + #[error("unexpected size in metadata for blob {0}, referred from {1:?} returned, expected {2}, got {3}")] UnexpectedBlobMeta(B3Digest, bytes::Bytes, u32, u32), #[error("failure using the NAR writer: {0}")] diff --git a/tvix/store/src/nar/renderer.rs b/tvix/store/src/nar/renderer.rs index fefc76956e7e..d83ef9c354f6 100644 --- a/tvix/store/src/nar/renderer.rs +++ b/tvix/store/src/nar/renderer.rs @@ -8,11 +8,7 @@ use tokio::io::{self, AsyncWrite, BufReader}; use tonic::async_trait; use tracing::{instrument, Span}; use tracing_indicatif::span_ext::IndicatifSpanExt; -use tvix_castore::{ - blobservice::BlobService, - directoryservice::DirectoryService, - {NamedNode, Node}, -}; +use tvix_castore::{blobservice::BlobService, directoryservice::DirectoryService, Node}; pub struct SimpleRenderer<BS, DS> { blob_service: BS, @@ -103,6 +99,7 @@ where walk_node( nar_root_node, proto_root_node, + b"", blob_service, directory_service, ) @@ -115,7 +112,8 @@ where /// This consumes the node. async fn walk_node<BS, DS>( nar_node: nar_writer::Node<'_, '_>, - proto_node: &Node, + castore_node: &Node, + name: &[u8], blob_service: BS, directory_service: DS, ) -> Result<(BS, DS), RenderError> @@ -123,10 +121,10 @@ where BS: BlobService + Send, DS: DirectoryService + Send, { - match proto_node { - Node::Symlink(proto_symlink_node) => { + match castore_node { + Node::Symlink(symlink_node) => { nar_node - .symlink(proto_symlink_node.target()) + .symlink(symlink_node.target()) .await .map_err(RenderError::NARWriterError)?; } @@ -154,19 +152,19 @@ where .await .map_err(RenderError::NARWriterError)?; } - Node::Directory(proto_directory_node) => { + Node::Directory(directory_node) => { // look it up with the directory service match directory_service - .get(proto_directory_node.digest()) + .get(directory_node.digest()) .await .map_err(|e| RenderError::StoreError(e.into()))? { // if it's None, that's an error! None => Err(RenderError::DirectoryNotFound( - proto_directory_node.digest().clone(), - proto_directory_node.get_name().clone(), + directory_node.digest().clone(), + bytes::Bytes::copy_from_slice(name), ))?, - Some(proto_directory) => { + Some(directory) => { // start a directory node let mut nar_node_directory = nar_node .directory() @@ -180,15 +178,16 @@ where // for each node in the directory, create a new entry with its name, // and then recurse on that entry. - for proto_node in proto_directory.nodes() { + for (name, node) in directory.nodes() { let child_node = nar_node_directory - .entry(proto_node.get_name()) + .entry(name) .await .map_err(RenderError::NARWriterError)?; (blob_service, directory_service) = Box::pin(walk_node( child_node, - proto_node, + node, + name.as_ref(), blob_service, directory_service, )) |