refactor(snix): address upcoming clippy lints
This uses variables inside `format!()` strings directly, and switches to using `std::io::Error::other(e.to_string())` instead of std::io::Error::new(io::ErrorKind::Other, e.to_string()). It also found an unnecessary `mut` in the test harness. Change-Id: I406c709091e87ec64bfbdbcdc7f460af9b83d3bc Reviewed-on: https://cl.snix.dev/c/snix/+/30630 Autosubmit: Florian Klink <flokli@flokli.de> Tested-by: besadii Reviewed-by: Ryan Lahfa <ryan@lahfa.xyz>
This commit is contained in:
parent
632bc09350
commit
a9d5c184d5
77 changed files with 224 additions and 325 deletions
|
|
@ -11,8 +11,7 @@ pub struct DummyBuildService {}
|
||||||
impl BuildService for DummyBuildService {
|
impl BuildService for DummyBuildService {
|
||||||
#[instrument(skip(self), ret, err)]
|
#[instrument(skip(self), ret, err)]
|
||||||
async fn do_build(&self, _request: BuildRequest) -> std::io::Result<BuildResult> {
|
async fn do_build(&self, _request: BuildRequest) -> std::io::Result<BuildResult> {
|
||||||
Err(std::io::Error::new(
|
Err(std::io::Error::other(
|
||||||
std::io::ErrorKind::Other,
|
|
||||||
"builds are not supported with DummyBuildService",
|
"builds are not supported with DummyBuildService",
|
||||||
))
|
))
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -24,8 +24,8 @@ where
|
||||||
BS: BlobService + Send + Sync + Clone + 'static,
|
BS: BlobService + Send + Sync + Clone + 'static,
|
||||||
DS: DirectoryService + Send + Sync + Clone + 'static,
|
DS: DirectoryService + Send + Sync + Clone + 'static,
|
||||||
{
|
{
|
||||||
let url = Url::parse(uri)
|
let url =
|
||||||
.map_err(|e| std::io::Error::other(format!("unable to parse url: {}", e)))?;
|
Url::parse(uri).map_err(|e| std::io::Error::other(format!("unable to parse url: {e}")))?;
|
||||||
|
|
||||||
Ok(match url.scheme() {
|
Ok(match url.scheme() {
|
||||||
// dummy doesn't care about parameters.
|
// dummy doesn't care about parameters.
|
||||||
|
|
|
||||||
|
|
@ -132,10 +132,7 @@ where
|
||||||
|
|
||||||
warn!(stdout=%stdout, stderr=%stderr, exit_code=%child_output.status, "build failed");
|
warn!(stdout=%stdout, stderr=%stderr, exit_code=%child_output.status, "build failed");
|
||||||
|
|
||||||
return Err(std::io::Error::new(
|
return Err(std::io::Error::other("nonzero exit code".to_string()));
|
||||||
std::io::ErrorKind::Other,
|
|
||||||
"nonzero exit code".to_string(),
|
|
||||||
));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Ingest build outputs into the castore.
|
// Ingest build outputs into the castore.
|
||||||
|
|
@ -161,7 +158,7 @@ where
|
||||||
.map_err(|e| {
|
.map_err(|e| {
|
||||||
std::io::Error::new(
|
std::io::Error::new(
|
||||||
std::io::ErrorKind::InvalidData,
|
std::io::ErrorKind::InvalidData,
|
||||||
format!("Unable to ingest output: {}", e),
|
format!("Unable to ingest output: {e}"),
|
||||||
)
|
)
|
||||||
})?,
|
})?,
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -125,7 +125,7 @@ fn configure_process<'a>(
|
||||||
.args(command_args)
|
.args(command_args)
|
||||||
.env(
|
.env(
|
||||||
env.into_iter()
|
env.into_iter()
|
||||||
.map(|(k, v)| format!("{}={}", k, v))
|
.map(|(k, v)| format!("{k}={v}"))
|
||||||
.collect::<Vec<_>>(),
|
.collect::<Vec<_>>(),
|
||||||
)
|
)
|
||||||
.terminal(true)
|
.terminal(true)
|
||||||
|
|
|
||||||
|
|
@ -115,7 +115,7 @@ mod tests {
|
||||||
use std::io::Write;
|
use std::io::Write;
|
||||||
let mut file = tempfile::NamedTempFile::new().expect("Could not create tempfile");
|
let mut file = tempfile::NamedTempFile::new().expect("Could not create tempfile");
|
||||||
for line in content.into_iter() {
|
for line in content.into_iter() {
|
||||||
writeln!(file, "{}", line).expect("");
|
writeln!(file, "{line}").expect("");
|
||||||
}
|
}
|
||||||
file
|
file
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -20,7 +20,7 @@ pub async fn from_addr(
|
||||||
uri: &str,
|
uri: &str,
|
||||||
) -> Result<Arc<dyn BlobService>, Box<dyn std::error::Error + Send + Sync>> {
|
) -> Result<Arc<dyn BlobService>, Box<dyn std::error::Error + Send + Sync>> {
|
||||||
let url = Url::parse(uri)
|
let url = Url::parse(uri)
|
||||||
.map_err(|e| crate::Error::StorageError(format!("unable to parse url: {}", e)))?;
|
.map_err(|e| crate::Error::StorageError(format!("unable to parse url: {e}")))?;
|
||||||
|
|
||||||
let blob_service_config = with_registry(®, || {
|
let blob_service_config = with_registry(®, || {
|
||||||
<DeserializeWithRegistry<Box<dyn ServiceBuilder<Output = dyn BlobService>>>>::try_from(url)
|
<DeserializeWithRegistry<Box<dyn ServiceBuilder<Output = dyn BlobService>>>>::try_from(url)
|
||||||
|
|
|
||||||
|
|
@ -64,7 +64,7 @@ where
|
||||||
{
|
{
|
||||||
Ok(_blob_meta) => Ok(true),
|
Ok(_blob_meta) => Ok(true),
|
||||||
Err(e) if e.code() == Code::NotFound => Ok(false),
|
Err(e) if e.code() == Code::NotFound => Ok(false),
|
||||||
Err(e) => Err(io::Error::new(io::ErrorKind::Other, e)),
|
Err(e) => Err(io::Error::other(e)),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -106,7 +106,7 @@ where
|
||||||
Ok(Some(Box::new(Cursor::new(buf))))
|
Ok(Some(Box::new(Cursor::new(buf))))
|
||||||
}
|
}
|
||||||
Err(e) if e.code() == Code::NotFound => Ok(None),
|
Err(e) if e.code() == Code::NotFound => Ok(None),
|
||||||
Err(e) => Err(io::Error::new(io::ErrorKind::Other, e)),
|
Err(e) => Err(io::Error::other(e)),
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -175,7 +175,7 @@ where
|
||||||
|
|
||||||
match resp {
|
match resp {
|
||||||
Err(e) if e.code() == Code::NotFound => Ok(None),
|
Err(e) if e.code() == Code::NotFound => Ok(None),
|
||||||
Err(e) => Err(io::Error::new(io::ErrorKind::Other, e)),
|
Err(e) => Err(io::Error::other(e)),
|
||||||
Ok(resp) => {
|
Ok(resp) => {
|
||||||
let resp = resp.into_inner();
|
let resp = resp.into_inner();
|
||||||
|
|
||||||
|
|
@ -259,15 +259,14 @@ impl<W: tokio::io::AsyncWrite + Send + Sync + Unpin + 'static> BlobWriter for GR
|
||||||
// return the digest from the response, and store it in self.digest for subsequent closes.
|
// return the digest from the response, and store it in self.digest for subsequent closes.
|
||||||
let digest_len = resp.digest.len();
|
let digest_len = resp.digest.len();
|
||||||
let digest: B3Digest = resp.digest.try_into().map_err(|_| {
|
let digest: B3Digest = resp.digest.try_into().map_err(|_| {
|
||||||
io::Error::new(
|
io::Error::other(format!(
|
||||||
io::ErrorKind::Other,
|
"invalid root digest length {digest_len} in response"
|
||||||
format!("invalid root digest length {} in response", digest_len),
|
))
|
||||||
)
|
|
||||||
})?;
|
})?;
|
||||||
self.digest = Some(digest.clone());
|
self.digest = Some(digest.clone());
|
||||||
Ok(digest)
|
Ok(digest)
|
||||||
}
|
}
|
||||||
Err(e) => Err(io::Error::new(io::ErrorKind::Other, e.to_string())),
|
Err(e) => Err(io::Error::other(e.to_string())),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -98,7 +98,7 @@ async fn put_has_get(blob_service: impl BlobService) {
|
||||||
"blob service should now have the blob"
|
"blob service should now have the blob"
|
||||||
);
|
);
|
||||||
|
|
||||||
let mut r = blob_service
|
let r = blob_service
|
||||||
.open_read(blob_digest)
|
.open_read(blob_digest)
|
||||||
.await
|
.await
|
||||||
.expect("open_read must succeed")
|
.expect("open_read must succeed")
|
||||||
|
|
|
||||||
|
|
@ -155,7 +155,7 @@ impl<'r, 'de: 'r, T: 'static> SeedFactory<'de, TagString<'de>> for RegistryWithF
|
||||||
.0
|
.0
|
||||||
.iter()
|
.iter()
|
||||||
.find(|(k, _)| *k == &(TypeId::of::<T>(), tag.as_ref()))
|
.find(|(k, _)| *k == &(TypeId::of::<T>(), tag.as_ref()))
|
||||||
.ok_or_else(|| serde::de::Error::custom(format!("Unknown type: {}", tag)))?
|
.ok_or_else(|| serde::de::Error::custom(format!("Unknown type: {tag}")))?
|
||||||
.1;
|
.1;
|
||||||
|
|
||||||
let entry: &RegistryEntry<T> = <dyn Any>::downcast_ref(&**seed).unwrap();
|
let entry: &RegistryEntry<T> = <dyn Any>::downcast_ref(&**seed).unwrap();
|
||||||
|
|
|
||||||
|
|
@ -202,7 +202,7 @@ impl DirectoryService for BigtableDirectoryService {
|
||||||
let mut response = client
|
let mut response = client
|
||||||
.read_rows(request)
|
.read_rows(request)
|
||||||
.await
|
.await
|
||||||
.map_err(|e| Error::StorageError(format!("unable to read rows: {}", e)))?;
|
.map_err(|e| Error::StorageError(format!("unable to read rows: {e}")))?;
|
||||||
|
|
||||||
if response.len() != 1 {
|
if response.len() != 1 {
|
||||||
if response.len() > 1 {
|
if response.len() > 1 {
|
||||||
|
|
@ -244,17 +244,14 @@ impl DirectoryService for BigtableDirectoryService {
|
||||||
// For the data in that cell, ensure the digest matches what's requested, before parsing.
|
// For the data in that cell, ensure the digest matches what's requested, before parsing.
|
||||||
let got_digest = B3Digest::from(blake3::hash(&row_cell.value).as_bytes());
|
let got_digest = B3Digest::from(blake3::hash(&row_cell.value).as_bytes());
|
||||||
if got_digest != *digest {
|
if got_digest != *digest {
|
||||||
return Err(Error::StorageError(format!(
|
return Err(Error::StorageError(format!("invalid digest: {got_digest}")));
|
||||||
"invalid digest: {}",
|
|
||||||
got_digest
|
|
||||||
)));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Try to parse the value into a Directory message.
|
// Try to parse the value into a Directory message.
|
||||||
let directory = proto::Directory::decode(Bytes::from(row_cell.value))
|
let directory = proto::Directory::decode(Bytes::from(row_cell.value))
|
||||||
.map_err(|e| Error::StorageError(format!("unable to decode directory proto: {}", e)))?
|
.map_err(|e| Error::StorageError(format!("unable to decode directory proto: {e}")))?
|
||||||
.try_into()
|
.try_into()
|
||||||
.map_err(|e| Error::StorageError(format!("invalid Directory message: {}", e)))?;
|
.map_err(|e| Error::StorageError(format!("invalid Directory message: {e}")))?;
|
||||||
|
|
||||||
Ok(Some(directory))
|
Ok(Some(directory))
|
||||||
}
|
}
|
||||||
|
|
@ -301,7 +298,7 @@ impl DirectoryService for BigtableDirectoryService {
|
||||||
],
|
],
|
||||||
})
|
})
|
||||||
.await
|
.await
|
||||||
.map_err(|e| Error::StorageError(format!("unable to mutate rows: {}", e)))?;
|
.map_err(|e| Error::StorageError(format!("unable to mutate rows: {e}")))?;
|
||||||
|
|
||||||
if resp.predicate_matched {
|
if resp.predicate_matched {
|
||||||
trace!("already existed")
|
trace!("already existed")
|
||||||
|
|
@ -376,7 +373,7 @@ impl TryFrom<url::Url> for BigtableParameters {
|
||||||
.append_pair("instance_name", &instance_name);
|
.append_pair("instance_name", &instance_name);
|
||||||
|
|
||||||
let params: BigtableParameters = serde_qs::from_str(url.query().unwrap_or_default())
|
let params: BigtableParameters = serde_qs::from_str(url.query().unwrap_or_default())
|
||||||
.map_err(|e| Error::InvalidRequest(format!("failed to parse parameters: {}", e)))?;
|
.map_err(|e| Error::InvalidRequest(format!("failed to parse parameters: {e}")))?;
|
||||||
|
|
||||||
Ok(params)
|
Ok(params)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -28,7 +28,7 @@ pub async fn from_addr(
|
||||||
) -> Result<Arc<dyn DirectoryService>, Box<dyn std::error::Error + Send + Sync>> {
|
) -> Result<Arc<dyn DirectoryService>, Box<dyn std::error::Error + Send + Sync>> {
|
||||||
#[allow(unused_mut)]
|
#[allow(unused_mut)]
|
||||||
let mut url = Url::parse(uri)
|
let mut url = Url::parse(uri)
|
||||||
.map_err(|e| crate::Error::StorageError(format!("unable to parse url: {}", e)))?;
|
.map_err(|e| crate::Error::StorageError(format!("unable to parse url: {e}")))?;
|
||||||
|
|
||||||
let directory_service_config = with_registry(®, || {
|
let directory_service_config = with_registry(®, || {
|
||||||
<DeserializeWithRegistry<Box<dyn ServiceBuilder<Output = dyn DirectoryService>>>>::try_from(
|
<DeserializeWithRegistry<Box<dyn ServiceBuilder<Output = dyn DirectoryService>>>>::try_from(
|
||||||
|
|
|
||||||
|
|
@ -71,8 +71,7 @@ where
|
||||||
let actual_digest = directory.digest();
|
let actual_digest = directory.digest();
|
||||||
if actual_digest != digest {
|
if actual_digest != digest {
|
||||||
Err(crate::Error::StorageError(format!(
|
Err(crate::Error::StorageError(format!(
|
||||||
"requested directory with digest {}, but got {}",
|
"requested directory with digest {digest}, but got {actual_digest}"
|
||||||
digest, actual_digest
|
|
||||||
)))
|
)))
|
||||||
} else {
|
} else {
|
||||||
Ok(Some(directory.try_into().map_err(|_| {
|
Ok(Some(directory.try_into().map_err(|_| {
|
||||||
|
|
@ -141,8 +140,7 @@ where
|
||||||
// it if it's in received_directory_digests (as that
|
// it if it's in received_directory_digests (as that
|
||||||
// means it once was in expected_directory_digests)
|
// means it once was in expected_directory_digests)
|
||||||
Err(crate::Error::StorageError(format!(
|
Err(crate::Error::StorageError(format!(
|
||||||
"received unexpected directory {}",
|
"received unexpected directory {directory_digest}"
|
||||||
directory_digest
|
|
||||||
)))?;
|
)))?;
|
||||||
}
|
}
|
||||||
received_directory_digests.insert(directory_digest);
|
received_directory_digests.insert(directory_digest);
|
||||||
|
|
@ -177,8 +175,7 @@ where
|
||||||
// If this is not empty, then the closure is incomplete
|
// If this is not empty, then the closure is incomplete
|
||||||
if diff_len != 0 {
|
if diff_len != 0 {
|
||||||
Err(crate::Error::StorageError(format!(
|
Err(crate::Error::StorageError(format!(
|
||||||
"still expected {} directories, but got premature end of stream",
|
"still expected {diff_len} directories, but got premature end of stream"
|
||||||
diff_len
|
|
||||||
)))?
|
)))?
|
||||||
} else {
|
} else {
|
||||||
return
|
return
|
||||||
|
|
|
||||||
|
|
@ -34,13 +34,12 @@ impl DirectoryService for MemoryDirectoryService {
|
||||||
let actual_digest = directory.digest();
|
let actual_digest = directory.digest();
|
||||||
if actual_digest != *digest {
|
if actual_digest != *digest {
|
||||||
return Err(Error::StorageError(format!(
|
return Err(Error::StorageError(format!(
|
||||||
"requested directory with digest {}, but got {}",
|
"requested directory with digest {digest}, but got {actual_digest}"
|
||||||
digest, actual_digest
|
|
||||||
)));
|
)));
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok(Some(directory.clone().try_into().map_err(|e| {
|
Ok(Some(directory.clone().try_into().map_err(|e| {
|
||||||
crate::Error::StorageError(format!("corrupted directory: {}", e))
|
crate::Error::StorageError(format!("corrupted directory: {e}"))
|
||||||
})?))
|
})?))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -152,8 +152,7 @@ impl DirectoryService for ObjectStoreDirectoryService {
|
||||||
// Ensure to only decode the directory objects whose digests we trust
|
// Ensure to only decode the directory objects whose digests we trust
|
||||||
if !order_validator.digest_allowed(&digest) {
|
if !order_validator.digest_allowed(&digest) {
|
||||||
return Err(crate::Error::StorageError(format!(
|
return Err(crate::Error::StorageError(format!(
|
||||||
"received unexpected directory {}",
|
"received unexpected directory {digest}"
|
||||||
digest
|
|
||||||
)));
|
)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -167,7 +167,7 @@ async fn put_get_foo(directory_service: impl DirectoryService) {
|
||||||
],
|
],
|
||||||
];
|
];
|
||||||
if !valid_closures.contains(&retrieved_closure) {
|
if !valid_closures.contains(&retrieved_closure) {
|
||||||
panic!("invalid closure returned: {:?}", retrieved_closure);
|
panic!("invalid closure returned: {retrieved_closure:?}");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -26,7 +26,7 @@ where
|
||||||
// If we didn't get the directory node that's linked, that's a store inconsistency, bail out!
|
// If we didn't get the directory node that's linked, that's a store inconsistency, bail out!
|
||||||
warn!(directory.digest = %digest, "directory does not exist");
|
warn!(directory.digest = %digest, "directory does not exist");
|
||||||
|
|
||||||
Error::StorageError(format!("directory {} does not exist", digest))
|
Error::StorageError(format!("directory {digest} does not exist"))
|
||||||
})?;
|
})?;
|
||||||
|
|
||||||
// look for the component in the [Directory].
|
// look for the component in the [Directory].
|
||||||
|
|
|
||||||
|
|
@ -33,8 +33,7 @@ pub fn traverse_directory<'a, DS: DirectoryService + 'static>(
|
||||||
let current_directory = match directory_service.get(¤t_directory_digest).await.map_err(|e| {
|
let current_directory = match directory_service.get(¤t_directory_digest).await.map_err(|e| {
|
||||||
warn!("failed to look up directory");
|
warn!("failed to look up directory");
|
||||||
Error::StorageError(format!(
|
Error::StorageError(format!(
|
||||||
"unable to look up directory {}: {}",
|
"unable to look up directory {current_directory_digest}: {e}"
|
||||||
current_directory_digest, e
|
|
||||||
))
|
))
|
||||||
})? {
|
})? {
|
||||||
// the root node of the requested closure was not found, return an empty list
|
// the root node of the requested closure was not found, return an empty list
|
||||||
|
|
@ -43,8 +42,7 @@ pub fn traverse_directory<'a, DS: DirectoryService + 'static>(
|
||||||
None => {
|
None => {
|
||||||
warn!("directory {} does not exist", current_directory_digest);
|
warn!("directory {} does not exist", current_directory_digest);
|
||||||
Err(Error::StorageError(format!(
|
Err(Error::StorageError(format!(
|
||||||
"directory {} does not exist",
|
"directory {current_directory_digest} does not exist"
|
||||||
current_directory_digest
|
|
||||||
)))?;
|
)))?;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -78,7 +78,7 @@ impl From<Error> for Status {
|
||||||
fn from(value: Error) -> Self {
|
fn from(value: Error) -> Self {
|
||||||
match value {
|
match value {
|
||||||
Error::InvalidRequest(msg) => Status::invalid_argument(msg),
|
Error::InvalidRequest(msg) => Status::invalid_argument(msg),
|
||||||
Error::StorageError(msg) => Status::data_loss(format!("storage error: {}", msg)),
|
Error::StorageError(msg) => Status::data_loss(format!("storage error: {msg}")),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -140,7 +140,7 @@ impl From<Error> for std::io::Error {
|
||||||
fn from(value: Error) -> Self {
|
fn from(value: Error) -> Self {
|
||||||
match value {
|
match value {
|
||||||
Error::InvalidRequest(msg) => Self::new(std::io::ErrorKind::InvalidInput, msg),
|
Error::InvalidRequest(msg) => Self::new(std::io::ErrorKind::InvalidInput, msg),
|
||||||
Error::StorageError(msg) => Self::new(std::io::ErrorKind::Other, msg),
|
Error::StorageError(msg) => Self::other(msg),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -76,13 +76,13 @@ impl FuseDaemon {
|
||||||
let server = Arc::new(fuse_backend_rs::api::server::Server::new(Arc::new(fs)));
|
let server = Arc::new(fuse_backend_rs::api::server::Server::new(Arc::new(fs)));
|
||||||
|
|
||||||
let mut session = FuseSession::new(mountpoint.as_ref(), "snix-castore", "", true)
|
let mut session = FuseSession::new(mountpoint.as_ref(), "snix-castore", "", true)
|
||||||
.map_err(|e| io::Error::new(io::ErrorKind::Other, e.to_string()))?;
|
.map_err(|e| io::Error::other(e.to_string()))?;
|
||||||
|
|
||||||
#[cfg(target_os = "linux")]
|
#[cfg(target_os = "linux")]
|
||||||
session.set_allow_other(allow_other);
|
session.set_allow_other(allow_other);
|
||||||
session
|
session
|
||||||
.mount()
|
.mount()
|
||||||
.map_err(|e| io::Error::new(io::ErrorKind::Other, e.to_string()))?;
|
.map_err(|e| io::Error::other(e.to_string()))?;
|
||||||
|
|
||||||
// construct a thread pool
|
// construct a thread pool
|
||||||
let threads = threadpool::Builder::new()
|
let threads = threadpool::Builder::new()
|
||||||
|
|
@ -99,7 +99,7 @@ impl FuseDaemon {
|
||||||
server: server.clone(),
|
server: server.clone(),
|
||||||
channel: session
|
channel: session
|
||||||
.new_channel()
|
.new_channel()
|
||||||
.map_err(|e| io::Error::new(io::ErrorKind::Other, e.to_string()))?,
|
.map_err(|e| io::Error::other(e.to_string()))?,
|
||||||
};
|
};
|
||||||
|
|
||||||
// Start the FuseServer in each thread, and enter the tokio runtime context,
|
// Start the FuseServer in each thread, and enter the tokio runtime context,
|
||||||
|
|
@ -131,7 +131,7 @@ impl FuseDaemon {
|
||||||
self.session
|
self.session
|
||||||
.lock()
|
.lock()
|
||||||
.umount()
|
.umount()
|
||||||
.map_err(|e| io::Error::new(io::ErrorKind::Other, e.to_string()))?;
|
.map_err(|e| io::Error::other(e.to_string()))?;
|
||||||
|
|
||||||
self.wait();
|
self.wait();
|
||||||
Ok(())
|
Ok(())
|
||||||
|
|
|
||||||
|
|
@ -54,7 +54,7 @@ impl error::Error for Error {}
|
||||||
|
|
||||||
impl convert::From<Error> for io::Error {
|
impl convert::From<Error> for io::Error {
|
||||||
fn from(e: Error) -> Self {
|
fn from(e: Error) -> Self {
|
||||||
io::Error::new(io::ErrorKind::Other, e)
|
io::Error::other(e)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -195,7 +195,7 @@ where
|
||||||
queue
|
queue
|
||||||
.get_queue_mut()
|
.get_queue_mut()
|
||||||
.enable_notification(self.guest_mem.memory().deref())
|
.enable_notification(self.guest_mem.memory().deref())
|
||||||
.map_err(|e| io::Error::new(io::ErrorKind::Other, e.to_string()))?;
|
.map_err(|e| io::Error::other(e.to_string()))?;
|
||||||
if !self.process_queue(&mut queue)? {
|
if !self.process_queue(&mut queue)? {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -143,7 +143,7 @@ where
|
||||||
|
|
||||||
// convert to castore PathBuf
|
// convert to castore PathBuf
|
||||||
let path = crate::path::PathBuf::from_host_path(fs_path, false)
|
let path = crate::path::PathBuf::from_host_path(fs_path, false)
|
||||||
.unwrap_or_else(|e| panic!("Snix bug: walkdir direntry cannot be parsed: {}", e));
|
.unwrap_or_else(|e| panic!("Snix bug: walkdir direntry cannot be parsed: {e}"));
|
||||||
|
|
||||||
if file_type.is_dir() {
|
if file_type.is_dir() {
|
||||||
Ok(IngestionEntry::Dir { path })
|
Ok(IngestionEntry::Dir { path })
|
||||||
|
|
@ -166,7 +166,7 @@ where
|
||||||
let digest = upload_blob(blob_service, entry.path().to_path_buf(), reference_scanner)
|
let digest = upload_blob(blob_service, entry.path().to_path_buf(), reference_scanner)
|
||||||
.instrument({
|
.instrument({
|
||||||
let span = info_span!("upload_blob", "indicatif.pb_show" = tracing::field::Empty);
|
let span = info_span!("upload_blob", "indicatif.pb_show" = tracing::field::Empty);
|
||||||
span.pb_set_message(&format!("Uploading blob for {:?}", fs_path));
|
span.pb_set_message(&format!("Uploading blob for {fs_path:?}"));
|
||||||
span.pb_set_style(&snix_tracing::PB_TRANSFER_STYLE);
|
span.pb_set_style(&snix_tracing::PB_TRANSFER_STYLE);
|
||||||
|
|
||||||
span
|
span
|
||||||
|
|
|
||||||
|
|
@ -98,7 +98,7 @@ where
|
||||||
Err(e) => {
|
Err(e) => {
|
||||||
return Err(IngestionError::UploadDirectoryError(
|
return Err(IngestionError::UploadDirectoryError(
|
||||||
path,
|
path,
|
||||||
crate::Error::StorageError(format!("invalid symlink target: {}", e)),
|
crate::Error::StorageError(format!("invalid symlink target: {e}")),
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -53,7 +53,7 @@ where
|
||||||
tonic::Status::new(tonic::Code::Internal, e.to_string())
|
tonic::Status::new(tonic::Code::Internal, e.to_string())
|
||||||
})?
|
})?
|
||||||
.ok_or_else(|| {
|
.ok_or_else(|| {
|
||||||
Status::not_found(format!("directory {} not found", digest))
|
Status::not_found(format!("directory {digest} not found"))
|
||||||
})?;
|
})?;
|
||||||
|
|
||||||
Box::pin(once(Ok(directory.into())))
|
Box::pin(once(Ok(directory.into())))
|
||||||
|
|
|
||||||
|
|
@ -155,7 +155,7 @@ impl<'a> Repl<'a> {
|
||||||
Err(ReadlineError::Interrupted) | Err(ReadlineError::Eof) => break,
|
Err(ReadlineError::Interrupted) | Err(ReadlineError::Eof) => break,
|
||||||
|
|
||||||
Err(err) => {
|
Err(err) => {
|
||||||
writeln!(stderr, "error: {}", err).unwrap();
|
writeln!(stderr, "error: {err}").unwrap();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -542,7 +542,7 @@ mod pure_builtins {
|
||||||
let len = length.as_int()?;
|
let len = length.as_int()?;
|
||||||
let mut out = Vec::with_capacity(
|
let mut out = Vec::with_capacity(
|
||||||
len.try_into()
|
len.try_into()
|
||||||
.map_err(|_| ErrorKind::Abort(format!("can not create list of size {}", len)))?,
|
.map_err(|_| ErrorKind::Abort(format!("can not create list of size {len}")))?,
|
||||||
);
|
);
|
||||||
|
|
||||||
// the best span we can get…
|
// the best span we can get…
|
||||||
|
|
@ -655,17 +655,17 @@ mod pure_builtins {
|
||||||
for ctx_element in group {
|
for ctx_element in group {
|
||||||
match ctx_element {
|
match ctx_element {
|
||||||
NixContextElement::Plain(spath) => {
|
NixContextElement::Plain(spath) => {
|
||||||
debug_assert!(spath == key, "Unexpected group containing mixed keys, expected: {:?}, encountered {:?}", key, spath);
|
debug_assert!(spath == key, "Unexpected group containing mixed keys, expected: {key:?}, encountered {spath:?}");
|
||||||
is_path = true;
|
is_path = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
NixContextElement::Single { name, derivation } => {
|
NixContextElement::Single { name, derivation } => {
|
||||||
debug_assert!(derivation == key, "Unexpected group containing mixed keys, expected: {:?}, encountered {:?}", key, derivation);
|
debug_assert!(derivation == key, "Unexpected group containing mixed keys, expected: {key:?}, encountered {derivation:?}");
|
||||||
outputs.push(name.clone().into());
|
outputs.push(name.clone().into());
|
||||||
}
|
}
|
||||||
|
|
||||||
NixContextElement::Derivation(drv_path) => {
|
NixContextElement::Derivation(drv_path) => {
|
||||||
debug_assert!(drv_path == key, "Unexpected group containing mixed keys, expected: {:?}, encountered {:?}", key, drv_path);
|
debug_assert!(drv_path == key, "Unexpected group containing mixed keys, expected: {key:?}, encountered {drv_path:?}");
|
||||||
all_outputs = true;
|
all_outputs = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -992,7 +992,7 @@ mod pure_builtins {
|
||||||
}
|
}
|
||||||
let re = re.to_str()?;
|
let re = re.to_str()?;
|
||||||
let re = re.to_str()?;
|
let re = re.to_str()?;
|
||||||
let re: Regex = cached_regex(&format!("^{}$", re))
|
let re: Regex = cached_regex(&format!("^{re}$"))
|
||||||
.map_err(|_| ErrorKind::InvalidRegex(re.to_string()))?;
|
.map_err(|_| ErrorKind::InvalidRegex(re.to_string()))?;
|
||||||
|
|
||||||
match re.captures(s.to_str()?) {
|
match re.captures(s.to_str()?) {
|
||||||
|
|
|
||||||
|
|
@ -298,15 +298,15 @@ mod tests {
|
||||||
fn xml_escape() {
|
fn xml_escape() {
|
||||||
match XmlEmitter::<Writer<Vec<u8>>>::escape_attr_value("ab<>c&de") {
|
match XmlEmitter::<Writer<Vec<u8>>>::escape_attr_value("ab<>c&de") {
|
||||||
Cow::Owned(s) => assert_eq!(s, "ab<>c&de".to_string(), "escape stuff"),
|
Cow::Owned(s) => assert_eq!(s, "ab<>c&de".to_string(), "escape stuff"),
|
||||||
Cow::Borrowed(s) => panic!("s should be owned {}", s),
|
Cow::Borrowed(s) => panic!("s should be owned {s}"),
|
||||||
}
|
}
|
||||||
match XmlEmitter::<Writer<Vec<u8>>>::escape_attr_value("") {
|
match XmlEmitter::<Writer<Vec<u8>>>::escape_attr_value("") {
|
||||||
Cow::Borrowed(s) => assert_eq!(s, "", "empty escape is borrowed"),
|
Cow::Borrowed(s) => assert_eq!(s, "", "empty escape is borrowed"),
|
||||||
Cow::Owned(s) => panic!("s should be borrowed {}", s),
|
Cow::Owned(s) => panic!("s should be borrowed {s}"),
|
||||||
}
|
}
|
||||||
match XmlEmitter::<Writer<Vec<u8>>>::escape_attr_value("hi!ŷbla") {
|
match XmlEmitter::<Writer<Vec<u8>>>::escape_attr_value("hi!ŷbla") {
|
||||||
Cow::Borrowed(s) => assert_eq!(s, "hi!ŷbla", "no escape is borrowed"),
|
Cow::Borrowed(s) => assert_eq!(s, "hi!ŷbla", "no escape is borrowed"),
|
||||||
Cow::Owned(s) => panic!("s should be borrowed {}", s),
|
Cow::Owned(s) => panic!("s should be borrowed {s}"),
|
||||||
}
|
}
|
||||||
match XmlEmitter::<Writer<Vec<u8>>>::escape_attr_value("hi!<ŷ>bla") {
|
match XmlEmitter::<Writer<Vec<u8>>>::escape_attr_value("hi!<ŷ>bla") {
|
||||||
Cow::Owned(s) => assert_eq!(
|
Cow::Owned(s) => assert_eq!(
|
||||||
|
|
@ -314,7 +314,7 @@ mod tests {
|
||||||
"hi!<ŷ>bla".to_string(),
|
"hi!<ŷ>bla".to_string(),
|
||||||
"multi-byte chars are correctly used"
|
"multi-byte chars are correctly used"
|
||||||
),
|
),
|
||||||
Cow::Borrowed(s) => panic!("s should be owned {}", s),
|
Cow::Borrowed(s) => panic!("s should be owned {s}"),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -172,40 +172,40 @@ impl Chunk {
|
||||||
if idx.0 > 0 && source.get_line(self.get_span(idx - 1)) == line {
|
if idx.0 > 0 && source.get_line(self.get_span(idx - 1)) == line {
|
||||||
write!(writer, " |\t")?;
|
write!(writer, " |\t")?;
|
||||||
} else {
|
} else {
|
||||||
write!(writer, "{:4}\t", line)?;
|
write!(writer, "{line:4}\t")?;
|
||||||
}
|
}
|
||||||
|
|
||||||
let _fmt_constant = |idx: ConstantIdx| match &self.constants[idx.0] {
|
let _fmt_constant = |idx: ConstantIdx| match &self.constants[idx.0] {
|
||||||
Value::Thunk(t) => t.debug_repr(),
|
Value::Thunk(t) => t.debug_repr(),
|
||||||
Value::Closure(c) => format!("closure({:p})", c.lambda),
|
Value::Closure(c) => format!("closure({:p})", c.lambda),
|
||||||
Value::Blueprint(b) => format!("blueprint({:p})", b),
|
Value::Blueprint(b) => format!("blueprint({b:p})"),
|
||||||
val => format!("{}", val),
|
val => format!("{val}"),
|
||||||
};
|
};
|
||||||
|
|
||||||
let op: Op = self.code[idx.0].into();
|
let op: Op = self.code[idx.0].into();
|
||||||
|
|
||||||
match op.arg_type() {
|
match op.arg_type() {
|
||||||
OpArg::None => {
|
OpArg::None => {
|
||||||
writeln!(writer, "Op{:?}", op)?;
|
writeln!(writer, "Op{op:?}")?;
|
||||||
Ok(1)
|
Ok(1)
|
||||||
}
|
}
|
||||||
|
|
||||||
OpArg::Fixed => {
|
OpArg::Fixed => {
|
||||||
let arg = self.read_u16(idx.0 + 1);
|
let arg = self.read_u16(idx.0 + 1);
|
||||||
writeln!(writer, "Op{:?}({})", op, arg)?;
|
writeln!(writer, "Op{op:?}({arg})")?;
|
||||||
Ok(3)
|
Ok(3)
|
||||||
}
|
}
|
||||||
|
|
||||||
OpArg::Uvarint => {
|
OpArg::Uvarint => {
|
||||||
let (arg, size) = self.read_uvarint(idx.0 + 1);
|
let (arg, size) = self.read_uvarint(idx.0 + 1);
|
||||||
writeln!(writer, "Op{:?}({})", op, arg)?;
|
writeln!(writer, "Op{op:?}({arg})")?;
|
||||||
Ok(1 + size)
|
Ok(1 + size)
|
||||||
}
|
}
|
||||||
|
|
||||||
_ => match op {
|
_ => match op {
|
||||||
Op::CoerceToString => {
|
Op::CoerceToString => {
|
||||||
let kind: CoercionKind = self.code[idx.0 + 1].into();
|
let kind: CoercionKind = self.code[idx.0 + 1].into();
|
||||||
writeln!(writer, "Op{:?}({:?})", op, kind)?;
|
writeln!(writer, "Op{op:?}({kind:?})")?;
|
||||||
Ok(2)
|
Ok(2)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -221,11 +221,11 @@ impl Chunk {
|
||||||
let captures_with = packed_count & 0b1 == 1;
|
let captures_with = packed_count & 0b1 == 1;
|
||||||
let count = packed_count >> 1;
|
let count = packed_count >> 1;
|
||||||
|
|
||||||
write!(writer, "Op{:?}(BP @ {}, ", op, bp_idx)?;
|
write!(writer, "Op{op:?}(BP @ {bp_idx}, ")?;
|
||||||
if captures_with {
|
if captures_with {
|
||||||
write!(writer, "captures with, ")?;
|
write!(writer, "captures with, ")?;
|
||||||
}
|
}
|
||||||
writeln!(writer, "{} upvalues)", count)?;
|
writeln!(writer, "{count} upvalues)")?;
|
||||||
|
|
||||||
for _ in 0..count {
|
for _ in 0..count {
|
||||||
let (_, size) = self.read_uvarint(cidx);
|
let (_, size) = self.read_uvarint(cidx);
|
||||||
|
|
@ -234,7 +234,7 @@ impl Chunk {
|
||||||
|
|
||||||
Ok(cidx - idx.0)
|
Ok(cidx - idx.0)
|
||||||
}
|
}
|
||||||
_ => panic!("Snix bug: don't know how to format argument for Op{:?}", op),
|
_ => panic!("Snix bug: don't know how to format argument for Op{op:?}"),
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -196,8 +196,7 @@ impl<'source, 'observer> Compiler<'source, 'observer> {
|
||||||
let current_dir = std::env::current_dir().map_err(|e| {
|
let current_dir = std::env::current_dir().map_err(|e| {
|
||||||
Error::new(
|
Error::new(
|
||||||
ErrorKind::RelativePathResolution(format!(
|
ErrorKind::RelativePathResolution(format!(
|
||||||
"could not determine current directory: {}",
|
"could not determine current directory: {e}"
|
||||||
e
|
|
||||||
)),
|
)),
|
||||||
file.span,
|
file.span,
|
||||||
source.clone(),
|
source.clone(),
|
||||||
|
|
@ -1527,15 +1526,15 @@ fn compile_src_builtin(
|
||||||
let parsed = rnix::ast::Root::parse(code);
|
let parsed = rnix::ast::Root::parse(code);
|
||||||
|
|
||||||
if !parsed.errors().is_empty() {
|
if !parsed.errors().is_empty() {
|
||||||
let mut out = format!("BUG: code for source-builtin '{}' had parser errors", name);
|
let mut out = format!("BUG: code for source-builtin '{name}' had parser errors");
|
||||||
for error in parsed.errors() {
|
for error in parsed.errors() {
|
||||||
writeln!(out, "{}", error).unwrap();
|
writeln!(out, "{error}").unwrap();
|
||||||
}
|
}
|
||||||
|
|
||||||
panic!("{}", out);
|
panic!("{}", out);
|
||||||
}
|
}
|
||||||
|
|
||||||
let file = source.add_file(format!("<src-builtins/{}.nix>", name), code.to_string());
|
let file = source.add_file(format!("<src-builtins/{name}.nix>"), code.to_string());
|
||||||
let weak = weak.clone();
|
let weak = weak.clone();
|
||||||
|
|
||||||
Value::Thunk(Thunk::new_suspended_native(Box::new(move || {
|
Value::Thunk(Thunk::new_suspended_native(Box::new(move || {
|
||||||
|
|
@ -1555,7 +1554,7 @@ fn compile_src_builtin(
|
||||||
|
|
||||||
if !result.errors.is_empty() {
|
if !result.errors.is_empty() {
|
||||||
return Err(ErrorKind::ImportCompilerError {
|
return Err(ErrorKind::ImportCompilerError {
|
||||||
path: format!("src-builtins/{}.nix", name).into(),
|
path: format!("src-builtins/{name}.nix").into(),
|
||||||
errors: result.errors,
|
errors: result.errors,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -253,7 +253,7 @@ to a missing value in the attribute set(s) included via `with`."#
|
||||||
let mut disp = format!("Snix bug: {}", .msg);
|
let mut disp = format!("Snix bug: {}", .msg);
|
||||||
|
|
||||||
if let Some(metadata) = .metadata {
|
if let Some(metadata) = .metadata {
|
||||||
disp.push_str(&format!("; metadata: {:?}", metadata));
|
disp.push_str(&format!("; metadata: {metadata:?}"));
|
||||||
}
|
}
|
||||||
|
|
||||||
disp
|
disp
|
||||||
|
|
@ -588,10 +588,7 @@ fn spans_for_parse_errors(file: &File, errors: &[rnix::parser::ParseError]) -> V
|
||||||
|
|
||||||
rnix::parser::ParseError::DuplicatedArgs(range, name) => (
|
rnix::parser::ParseError::DuplicatedArgs(range, name) => (
|
||||||
range.span_for(file),
|
range.span_for(file),
|
||||||
format!(
|
format!("the function argument pattern '{name}' was bound more than once"),
|
||||||
"the function argument pattern '{}' was bound more than once",
|
|
||||||
name
|
|
||||||
),
|
|
||||||
),
|
),
|
||||||
|
|
||||||
rnix::parser::ParseError::RecursionLimitExceeded => (
|
rnix::parser::ParseError::RecursionLimitExceeded => (
|
||||||
|
|
@ -843,7 +840,7 @@ impl Error {
|
||||||
|
|
||||||
for ctx in &self.contexts {
|
for ctx in &self.contexts {
|
||||||
spans.push(SpanLabel {
|
spans.push(SpanLabel {
|
||||||
label: Some(format!("while {}", ctx)),
|
label: Some(format!("while {ctx}")),
|
||||||
span: self.span,
|
span: self.span,
|
||||||
style: SpanStyle::Secondary,
|
style: SpanStyle::Secondary,
|
||||||
});
|
});
|
||||||
|
|
|
||||||
|
|
@ -44,7 +44,7 @@ impl std::fmt::Display for FileType {
|
||||||
FileType::Unknown => "unknown",
|
FileType::Unknown => "unknown",
|
||||||
};
|
};
|
||||||
|
|
||||||
write!(f, "{}", type_as_str)
|
write!(f, "{type_as_str}")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -182,7 +182,7 @@ impl<W: Write> TracingObserver<W> {
|
||||||
}
|
}
|
||||||
|
|
||||||
// For other value types, defer to the standard value printer.
|
// For other value types, defer to the standard value printer.
|
||||||
_ => write!(&mut self.writer, "{} ", val),
|
_ => write!(&mut self.writer, "{val} "),
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -222,7 +222,7 @@ impl<W: Write> RuntimeObserver for TracingObserver<W> {
|
||||||
};
|
};
|
||||||
|
|
||||||
if let Some(name) = &lambda.name {
|
if let Some(name) = &lambda.name {
|
||||||
let _ = write!(&mut self.writer, "'{}' ", name);
|
let _ = write!(&mut self.writer, "'{name}' ");
|
||||||
}
|
}
|
||||||
|
|
||||||
let _ = writeln!(
|
let _ = writeln!(
|
||||||
|
|
@ -235,13 +235,13 @@ impl<W: Write> RuntimeObserver for TracingObserver<W> {
|
||||||
/// Called when the runtime exits a call frame.
|
/// Called when the runtime exits a call frame.
|
||||||
fn observe_exit_call_frame(&mut self, frame_at: usize, stack: &[Value]) {
|
fn observe_exit_call_frame(&mut self, frame_at: usize, stack: &[Value]) {
|
||||||
self.maybe_write_time();
|
self.maybe_write_time();
|
||||||
let _ = write!(&mut self.writer, "=== exiting frame {} ===\t ", frame_at);
|
let _ = write!(&mut self.writer, "=== exiting frame {frame_at} ===\t ");
|
||||||
self.write_stack(stack);
|
self.write_stack(stack);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn observe_suspend_call_frame(&mut self, frame_at: usize, stack: &[Value]) {
|
fn observe_suspend_call_frame(&mut self, frame_at: usize, stack: &[Value]) {
|
||||||
self.maybe_write_time();
|
self.maybe_write_time();
|
||||||
let _ = write!(&mut self.writer, "=== suspending frame {} ===\t", frame_at);
|
let _ = write!(&mut self.writer, "=== suspending frame {frame_at} ===\t");
|
||||||
|
|
||||||
self.write_stack(stack);
|
self.write_stack(stack);
|
||||||
}
|
}
|
||||||
|
|
@ -250,8 +250,7 @@ impl<W: Write> RuntimeObserver for TracingObserver<W> {
|
||||||
self.maybe_write_time();
|
self.maybe_write_time();
|
||||||
let _ = write!(
|
let _ = write!(
|
||||||
&mut self.writer,
|
&mut self.writer,
|
||||||
"=== entering generator frame '{}' [{}] ===\t",
|
"=== entering generator frame '{name}' [{frame_at}] ===\t",
|
||||||
name, frame_at,
|
|
||||||
);
|
);
|
||||||
|
|
||||||
self.write_stack(stack);
|
self.write_stack(stack);
|
||||||
|
|
@ -261,8 +260,7 @@ impl<W: Write> RuntimeObserver for TracingObserver<W> {
|
||||||
self.maybe_write_time();
|
self.maybe_write_time();
|
||||||
let _ = write!(
|
let _ = write!(
|
||||||
&mut self.writer,
|
&mut self.writer,
|
||||||
"=== exiting generator '{}' [{}] ===\t",
|
"=== exiting generator '{name}' [{frame_at}] ===\t"
|
||||||
name, frame_at
|
|
||||||
);
|
);
|
||||||
|
|
||||||
self.write_stack(stack);
|
self.write_stack(stack);
|
||||||
|
|
@ -272,8 +270,7 @@ impl<W: Write> RuntimeObserver for TracingObserver<W> {
|
||||||
self.maybe_write_time();
|
self.maybe_write_time();
|
||||||
let _ = write!(
|
let _ = write!(
|
||||||
&mut self.writer,
|
&mut self.writer,
|
||||||
"=== suspending generator '{}' [{}] ===\t",
|
"=== suspending generator '{name}' [{frame_at}] ===\t"
|
||||||
name, frame_at
|
|
||||||
);
|
);
|
||||||
|
|
||||||
self.write_stack(stack);
|
self.write_stack(stack);
|
||||||
|
|
@ -283,19 +280,18 @@ impl<W: Write> RuntimeObserver for TracingObserver<W> {
|
||||||
self.maybe_write_time();
|
self.maybe_write_time();
|
||||||
let _ = writeln!(
|
let _ = writeln!(
|
||||||
&mut self.writer,
|
&mut self.writer,
|
||||||
"=== generator '{}' requested {} ===",
|
"=== generator '{name}' requested {msg} ==="
|
||||||
name, msg
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn observe_enter_builtin(&mut self, name: &'static str) {
|
fn observe_enter_builtin(&mut self, name: &'static str) {
|
||||||
self.maybe_write_time();
|
self.maybe_write_time();
|
||||||
let _ = writeln!(&mut self.writer, "=== entering builtin {} ===", name);
|
let _ = writeln!(&mut self.writer, "=== entering builtin {name} ===");
|
||||||
}
|
}
|
||||||
|
|
||||||
fn observe_exit_builtin(&mut self, name: &'static str, stack: &[Value]) {
|
fn observe_exit_builtin(&mut self, name: &'static str, stack: &[Value]) {
|
||||||
self.maybe_write_time();
|
self.maybe_write_time();
|
||||||
let _ = write!(&mut self.writer, "=== exiting builtin {} ===\t", name);
|
let _ = write!(&mut self.writer, "=== exiting builtin {name} ===\t");
|
||||||
self.write_stack(stack);
|
self.write_stack(stack);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -50,10 +50,7 @@ fn test_kv_attrs() {
|
||||||
if name.to_str().unwrap() == meaning_val.to_str().unwrap()
|
if name.to_str().unwrap() == meaning_val.to_str().unwrap()
|
||||||
|| value.to_str().unwrap() == forty_two_val.to_str().unwrap() => {}
|
|| value.to_str().unwrap() == forty_two_val.to_str().unwrap() => {}
|
||||||
|
|
||||||
_ => panic!(
|
_ => panic!("K/V attribute set should use optimised representation, but got {kv_attrs:?}"),
|
||||||
"K/V attribute set should use optimised representation, but got {:?}",
|
|
||||||
kv_attrs
|
|
||||||
),
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -410,7 +410,7 @@ impl Value {
|
||||||
(Value::Float(f), CoercionKind { strong: true, .. }) => {
|
(Value::Float(f), CoercionKind { strong: true, .. }) => {
|
||||||
// contrary to normal Display, coercing a float to a string will
|
// contrary to normal Display, coercing a float to a string will
|
||||||
// result in unconditional 6 decimal places
|
// result in unconditional 6 decimal places
|
||||||
Ok(format!("{:.6}", f).into())
|
Ok(format!("{f:.6}").into())
|
||||||
}
|
}
|
||||||
|
|
||||||
// Lists are coerced by coercing their elements and interspersing spaces
|
// Lists are coerced by coercing their elements and interspersing spaces
|
||||||
|
|
@ -842,18 +842,18 @@ impl Value {
|
||||||
pub fn explain(&self) -> String {
|
pub fn explain(&self) -> String {
|
||||||
match self {
|
match self {
|
||||||
Value::Null => "the 'null' value".into(),
|
Value::Null => "the 'null' value".into(),
|
||||||
Value::Bool(b) => format!("the boolean value '{}'", b),
|
Value::Bool(b) => format!("the boolean value '{b}'"),
|
||||||
Value::Integer(i) => format!("the integer '{}'", i),
|
Value::Integer(i) => format!("the integer '{i}'"),
|
||||||
Value::Float(f) => format!("the float '{}'", f),
|
Value::Float(f) => format!("the float '{f}'"),
|
||||||
Value::String(s) if s.has_context() => format!("the contextful string '{}'", s),
|
Value::String(s) if s.has_context() => format!("the contextful string '{s}'"),
|
||||||
Value::String(s) => format!("the contextless string '{}'", s),
|
Value::String(s) => format!("the contextless string '{s}'"),
|
||||||
Value::Path(p) => format!("the path '{}'", p.to_string_lossy()),
|
Value::Path(p) => format!("the path '{}'", p.to_string_lossy()),
|
||||||
Value::Attrs(attrs) => format!("a {}-item attribute set", attrs.len()),
|
Value::Attrs(attrs) => format!("a {}-item attribute set", attrs.len()),
|
||||||
Value::List(list) => format!("a {}-item list", list.len()),
|
Value::List(list) => format!("a {}-item list", list.len()),
|
||||||
|
|
||||||
Value::Closure(f) => {
|
Value::Closure(f) => {
|
||||||
if let Some(name) = &f.lambda.name {
|
if let Some(name) = &f.lambda.name {
|
||||||
format!("the user-defined Nix function '{}'", name)
|
format!("the user-defined Nix function '{name}'")
|
||||||
} else {
|
} else {
|
||||||
"a user-defined Nix function".to_string()
|
"a user-defined Nix function".to_string()
|
||||||
}
|
}
|
||||||
|
|
@ -977,7 +977,7 @@ impl TotalDisplay for Value {
|
||||||
Value::Null => f.write_str("null"),
|
Value::Null => f.write_str("null"),
|
||||||
Value::Bool(true) => f.write_str("true"),
|
Value::Bool(true) => f.write_str("true"),
|
||||||
Value::Bool(false) => f.write_str("false"),
|
Value::Bool(false) => f.write_str("false"),
|
||||||
Value::Integer(num) => write!(f, "{}", num),
|
Value::Integer(num) => write!(f, "{num}"),
|
||||||
Value::String(s) => s.fmt(f),
|
Value::String(s) => s.fmt(f),
|
||||||
Value::Path(p) => p.display().fmt(f),
|
Value::Path(p) => p.display().fmt(f),
|
||||||
Value::Attrs(attrs) => attrs.total_fmt(f, set),
|
Value::Attrs(attrs) => attrs.total_fmt(f, set),
|
||||||
|
|
|
||||||
|
|
@ -656,13 +656,13 @@ impl NixString {
|
||||||
if is_valid_nix_identifier(&escaped) && !is_keyword(&escaped) {
|
if is_valid_nix_identifier(&escaped) && !is_keyword(&escaped) {
|
||||||
escaped
|
escaped
|
||||||
} else {
|
} else {
|
||||||
Cow::Owned(format!("\"{}\"", escaped))
|
Cow::Owned(format!("\"{escaped}\""))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// An owned string has escapes, and needs the outer quotes
|
// An owned string has escapes, and needs the outer quotes
|
||||||
// for display.
|
// for display.
|
||||||
Cow::Owned(s) => Cow::Owned(format!("\"{}\"", s)),
|
Cow::Owned(s) => Cow::Owned(format!("\"{s}\"")),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -87,7 +87,7 @@ enum ThunkRepr {
|
||||||
impl ThunkRepr {
|
impl ThunkRepr {
|
||||||
fn debug_repr(&self) -> String {
|
fn debug_repr(&self) -> String {
|
||||||
match self {
|
match self {
|
||||||
ThunkRepr::Evaluated(v) => format!("thunk(val|{})", v),
|
ThunkRepr::Evaluated(v) => format!("thunk(val|{v})"),
|
||||||
ThunkRepr::Blackhole { .. } => "thunk(blackhole)".to_string(),
|
ThunkRepr::Blackhole { .. } => "thunk(blackhole)".to_string(),
|
||||||
ThunkRepr::Native(_) => "thunk(native)".to_string(),
|
ThunkRepr::Native(_) => "thunk(native)".to_string(),
|
||||||
ThunkRepr::Suspended { lambda, .. } => format!("thunk({:p})", *lambda),
|
ThunkRepr::Suspended { lambda, .. } => format!("thunk({:p})", *lambda),
|
||||||
|
|
|
||||||
|
|
@ -155,7 +155,7 @@ impl Display for VMRequest {
|
||||||
if *import_paths { "" } else { "non_" },
|
if *import_paths { "" } else { "non_" },
|
||||||
v.type_of()
|
v.type_of()
|
||||||
),
|
),
|
||||||
VMRequest::Call(v) => write!(f, "call({})", v),
|
VMRequest::Call(v) => write!(f, "call({v})"),
|
||||||
VMRequest::EnterLambda { lambda, .. } => {
|
VMRequest::EnterLambda { lambda, .. } => {
|
||||||
write!(f, "enter_lambda({:p})", *lambda)
|
write!(f, "enter_lambda({:p})", *lambda)
|
||||||
}
|
}
|
||||||
|
|
@ -208,12 +208,12 @@ impl Display for VMResponse {
|
||||||
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
||||||
match self {
|
match self {
|
||||||
VMResponse::Empty => write!(f, "empty"),
|
VMResponse::Empty => write!(f, "empty"),
|
||||||
VMResponse::Value(v) => write!(f, "value({})", v),
|
VMResponse::Value(v) => write!(f, "value({v})"),
|
||||||
VMResponse::Path(p) => write!(f, "path({})", p.to_string_lossy()),
|
VMResponse::Path(p) => write!(f, "path({})", p.to_string_lossy()),
|
||||||
VMResponse::Directory(d) => write!(f, "dir(len = {})", d.len()),
|
VMResponse::Directory(d) => write!(f, "dir(len = {})", d.len()),
|
||||||
VMResponse::Span(_) => write!(f, "span"),
|
VMResponse::Span(_) => write!(f, "span"),
|
||||||
VMResponse::Reader(_) => write!(f, "reader"),
|
VMResponse::Reader(_) => write!(f, "reader"),
|
||||||
VMResponse::FileType(t) => write!(f, "file_type({})", t),
|
VMResponse::FileType(t) => write!(f, "file_type({t})"),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -527,10 +527,7 @@ pub type GenCo = Co<VMRequest, VMResponse>;
|
||||||
pub async fn request_stack_push(co: &GenCo, val: Value) {
|
pub async fn request_stack_push(co: &GenCo, val: Value) {
|
||||||
match co.yield_(VMRequest::StackPush(val)).await {
|
match co.yield_(VMRequest::StackPush(val)).await {
|
||||||
VMResponse::Empty => {}
|
VMResponse::Empty => {}
|
||||||
msg => panic!(
|
msg => panic!("Snix bug: VM responded with incorrect generator message: {msg}"),
|
||||||
"Snix bug: VM responded with incorrect generator message: {}",
|
|
||||||
msg
|
|
||||||
),
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -539,10 +536,7 @@ pub async fn request_stack_push(co: &GenCo, val: Value) {
|
||||||
pub async fn request_stack_pop(co: &GenCo) -> Value {
|
pub async fn request_stack_pop(co: &GenCo) -> Value {
|
||||||
match co.yield_(VMRequest::StackPop).await {
|
match co.yield_(VMRequest::StackPop).await {
|
||||||
VMResponse::Value(value) => value,
|
VMResponse::Value(value) => value,
|
||||||
msg => panic!(
|
msg => panic!("Snix bug: VM responded with incorrect generator message: {msg}"),
|
||||||
"Snix bug: VM responded with incorrect generator message: {}",
|
|
||||||
msg
|
|
||||||
),
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -551,10 +545,7 @@ pub async fn request_force(co: &GenCo, val: Value) -> Value {
|
||||||
if let Value::Thunk(_) = val {
|
if let Value::Thunk(_) = val {
|
||||||
match co.yield_(VMRequest::ForceValue(val)).await {
|
match co.yield_(VMRequest::ForceValue(val)).await {
|
||||||
VMResponse::Value(value) => value,
|
VMResponse::Value(value) => value,
|
||||||
msg => panic!(
|
msg => panic!("Snix bug: VM responded with incorrect generator message: {msg}"),
|
||||||
"Snix bug: VM responded with incorrect generator message: {}",
|
|
||||||
msg
|
|
||||||
),
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
val
|
val
|
||||||
|
|
@ -566,10 +557,7 @@ pub(crate) async fn request_try_force(co: &GenCo, val: Value) -> Value {
|
||||||
if let Value::Thunk(_) = val {
|
if let Value::Thunk(_) = val {
|
||||||
match co.yield_(VMRequest::TryForce(val)).await {
|
match co.yield_(VMRequest::TryForce(val)).await {
|
||||||
VMResponse::Value(value) => value,
|
VMResponse::Value(value) => value,
|
||||||
msg => panic!(
|
msg => panic!("Snix bug: VM responded with incorrect generator message: {msg}"),
|
||||||
"Snix bug: VM responded with incorrect generator message: {}",
|
|
||||||
msg
|
|
||||||
),
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
val
|
val
|
||||||
|
|
@ -582,10 +570,7 @@ pub async fn request_call(co: &GenCo, val: Value) -> Value {
|
||||||
let val = request_force(co, val).await;
|
let val = request_force(co, val).await;
|
||||||
match co.yield_(VMRequest::Call(val)).await {
|
match co.yield_(VMRequest::Call(val)).await {
|
||||||
VMResponse::Value(value) => value,
|
VMResponse::Value(value) => value,
|
||||||
msg => panic!(
|
msg => panic!("Snix bug: VM responded with incorrect generator message: {msg}"),
|
||||||
"Snix bug: VM responded with incorrect generator message: {}",
|
|
||||||
msg
|
|
||||||
),
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -624,10 +609,7 @@ pub async fn request_string_coerce(
|
||||||
VMResponse::Value(value) => Ok(value
|
VMResponse::Value(value) => Ok(value
|
||||||
.to_contextful_str()
|
.to_contextful_str()
|
||||||
.expect("coerce_to_string always returns a string")),
|
.expect("coerce_to_string always returns a string")),
|
||||||
msg => panic!(
|
msg => panic!("Snix bug: VM responded with incorrect generator message: {msg}"),
|
||||||
"Snix bug: VM responded with incorrect generator message: {}",
|
|
||||||
msg
|
|
||||||
),
|
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -636,10 +618,7 @@ pub async fn request_string_coerce(
|
||||||
pub async fn request_deep_force(co: &GenCo, val: Value) -> Value {
|
pub async fn request_deep_force(co: &GenCo, val: Value) -> Value {
|
||||||
match co.yield_(VMRequest::DeepForceValue(val)).await {
|
match co.yield_(VMRequest::DeepForceValue(val)).await {
|
||||||
VMResponse::Value(value) => value,
|
VMResponse::Value(value) => value,
|
||||||
msg => panic!(
|
msg => panic!("Snix bug: VM responded with incorrect generator message: {msg}"),
|
||||||
"Snix bug: VM responded with incorrect generator message: {}",
|
|
||||||
msg
|
|
||||||
),
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -656,10 +635,7 @@ pub(crate) async fn check_equality(
|
||||||
{
|
{
|
||||||
VMResponse::Value(Value::Bool(b)) => Ok(Ok(b)),
|
VMResponse::Value(Value::Bool(b)) => Ok(Ok(b)),
|
||||||
VMResponse::Value(Value::Catchable(cek)) => Ok(Err(*cek)),
|
VMResponse::Value(Value::Catchable(cek)) => Ok(Err(*cek)),
|
||||||
msg => panic!(
|
msg => panic!("Snix bug: VM responded with incorrect generator message: {msg}"),
|
||||||
"Snix bug: VM responded with incorrect generator message: {}",
|
|
||||||
msg
|
|
||||||
),
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -667,10 +643,7 @@ pub(crate) async fn check_equality(
|
||||||
pub(crate) async fn emit_warning(co: &GenCo, warning: EvalWarning) {
|
pub(crate) async fn emit_warning(co: &GenCo, warning: EvalWarning) {
|
||||||
match co.yield_(VMRequest::EmitWarning(warning)).await {
|
match co.yield_(VMRequest::EmitWarning(warning)).await {
|
||||||
VMResponse::Empty => {}
|
VMResponse::Empty => {}
|
||||||
msg => panic!(
|
msg => panic!("Snix bug: VM responded with incorrect generator message: {msg}"),
|
||||||
"Snix bug: VM responded with incorrect generator message: {}",
|
|
||||||
msg
|
|
||||||
),
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -678,10 +651,7 @@ pub(crate) async fn emit_warning(co: &GenCo, warning: EvalWarning) {
|
||||||
pub async fn emit_warning_kind(co: &GenCo, kind: WarningKind) {
|
pub async fn emit_warning_kind(co: &GenCo, kind: WarningKind) {
|
||||||
match co.yield_(VMRequest::EmitWarningKind(kind)).await {
|
match co.yield_(VMRequest::EmitWarningKind(kind)).await {
|
||||||
VMResponse::Empty => {}
|
VMResponse::Empty => {}
|
||||||
msg => panic!(
|
msg => panic!("Snix bug: VM responded with incorrect generator message: {msg}"),
|
||||||
"Snix bug: VM responded with incorrect generator message: {}",
|
|
||||||
msg
|
|
||||||
),
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -700,10 +670,7 @@ pub(crate) async fn request_enter_lambda(
|
||||||
|
|
||||||
match co.yield_(msg).await {
|
match co.yield_(msg).await {
|
||||||
VMResponse::Value(value) => value,
|
VMResponse::Value(value) => value,
|
||||||
msg => panic!(
|
msg => panic!("Snix bug: VM responded with incorrect generator message: {msg}"),
|
||||||
"Snix bug: VM responded with incorrect generator message: {}",
|
|
||||||
msg
|
|
||||||
),
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -712,10 +679,7 @@ pub(crate) async fn request_import_cache_lookup(co: &GenCo, path: PathBuf) -> Op
|
||||||
match co.yield_(VMRequest::ImportCacheLookup(path)).await {
|
match co.yield_(VMRequest::ImportCacheLookup(path)).await {
|
||||||
VMResponse::Value(value) => Some(value),
|
VMResponse::Value(value) => Some(value),
|
||||||
VMResponse::Empty => None,
|
VMResponse::Empty => None,
|
||||||
msg => panic!(
|
msg => panic!("Snix bug: VM responded with incorrect generator message: {msg}"),
|
||||||
"Snix bug: VM responded with incorrect generator message: {}",
|
|
||||||
msg
|
|
||||||
),
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -723,10 +687,7 @@ pub(crate) async fn request_import_cache_lookup(co: &GenCo, path: PathBuf) -> Op
|
||||||
pub(crate) async fn request_import_cache_put(co: &GenCo, path: PathBuf, value: Value) {
|
pub(crate) async fn request_import_cache_put(co: &GenCo, path: PathBuf, value: Value) {
|
||||||
match co.yield_(VMRequest::ImportCachePut(path, value)).await {
|
match co.yield_(VMRequest::ImportCachePut(path, value)).await {
|
||||||
VMResponse::Empty => {}
|
VMResponse::Empty => {}
|
||||||
msg => panic!(
|
msg => panic!("Snix bug: VM responded with incorrect generator message: {msg}"),
|
||||||
"Snix bug: VM responded with incorrect generator message: {}",
|
|
||||||
msg
|
|
||||||
),
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -734,10 +695,7 @@ pub(crate) async fn request_import_cache_put(co: &GenCo, path: PathBuf, value: V
|
||||||
pub(crate) async fn request_path_import(co: &GenCo, path: PathBuf) -> PathBuf {
|
pub(crate) async fn request_path_import(co: &GenCo, path: PathBuf) -> PathBuf {
|
||||||
match co.yield_(VMRequest::PathImport(path)).await {
|
match co.yield_(VMRequest::PathImport(path)).await {
|
||||||
VMResponse::Path(path) => path,
|
VMResponse::Path(path) => path,
|
||||||
msg => panic!(
|
msg => panic!("Snix bug: VM responded with incorrect generator message: {msg}"),
|
||||||
"Snix bug: VM responded with incorrect generator message: {}",
|
|
||||||
msg
|
|
||||||
),
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -745,10 +703,7 @@ pub(crate) async fn request_path_import(co: &GenCo, path: PathBuf) -> PathBuf {
|
||||||
pub async fn request_open_file(co: &GenCo, path: PathBuf) -> Box<dyn std::io::Read> {
|
pub async fn request_open_file(co: &GenCo, path: PathBuf) -> Box<dyn std::io::Read> {
|
||||||
match co.yield_(VMRequest::OpenFile(path)).await {
|
match co.yield_(VMRequest::OpenFile(path)).await {
|
||||||
VMResponse::Reader(value) => value,
|
VMResponse::Reader(value) => value,
|
||||||
msg => panic!(
|
msg => panic!("Snix bug: VM responded with incorrect generator message: {msg}"),
|
||||||
"Snix bug: VM responded with incorrect generator message: {}",
|
|
||||||
msg
|
|
||||||
),
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -756,10 +711,7 @@ pub async fn request_open_file(co: &GenCo, path: PathBuf) -> Box<dyn std::io::Re
|
||||||
pub(crate) async fn request_path_exists(co: &GenCo, path: PathBuf) -> Value {
|
pub(crate) async fn request_path_exists(co: &GenCo, path: PathBuf) -> Value {
|
||||||
match co.yield_(VMRequest::PathExists(path)).await {
|
match co.yield_(VMRequest::PathExists(path)).await {
|
||||||
VMResponse::Value(value) => value,
|
VMResponse::Value(value) => value,
|
||||||
msg => panic!(
|
msg => panic!("Snix bug: VM responded with incorrect generator message: {msg}"),
|
||||||
"Snix bug: VM responded with incorrect generator message: {}",
|
|
||||||
msg
|
|
||||||
),
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -767,20 +719,14 @@ pub(crate) async fn request_path_exists(co: &GenCo, path: PathBuf) -> Value {
|
||||||
pub(crate) async fn request_read_dir(co: &GenCo, path: PathBuf) -> Vec<(bytes::Bytes, FileType)> {
|
pub(crate) async fn request_read_dir(co: &GenCo, path: PathBuf) -> Vec<(bytes::Bytes, FileType)> {
|
||||||
match co.yield_(VMRequest::ReadDir(path)).await {
|
match co.yield_(VMRequest::ReadDir(path)).await {
|
||||||
VMResponse::Directory(dir) => dir,
|
VMResponse::Directory(dir) => dir,
|
||||||
msg => panic!(
|
msg => panic!("Snix bug: VM responded with incorrect generator message: {msg}"),
|
||||||
"Snix bug: VM responded with incorrect generator message: {}",
|
|
||||||
msg
|
|
||||||
),
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) async fn request_span(co: &GenCo) -> Span {
|
pub(crate) async fn request_span(co: &GenCo) -> Span {
|
||||||
match co.yield_(VMRequest::Span).await {
|
match co.yield_(VMRequest::Span).await {
|
||||||
VMResponse::Span(span) => span,
|
VMResponse::Span(span) => span,
|
||||||
msg => panic!(
|
msg => panic!("Snix bug: VM responded with incorrect generator message: {msg}"),
|
||||||
"Snix bug: VM responded with incorrect generator message: {}",
|
|
||||||
msg
|
|
||||||
),
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -788,10 +734,7 @@ pub(crate) async fn request_span(co: &GenCo) -> Span {
|
||||||
pub(crate) async fn request_read_file_type(co: &GenCo, path: PathBuf) -> FileType {
|
pub(crate) async fn request_read_file_type(co: &GenCo, path: PathBuf) -> FileType {
|
||||||
match co.yield_(VMRequest::ReadFileType(path)).await {
|
match co.yield_(VMRequest::ReadFileType(path)).await {
|
||||||
VMResponse::FileType(file_type) => file_type,
|
VMResponse::FileType(file_type) => file_type,
|
||||||
msg => panic!(
|
msg => panic!("Snix bug: VM responded with incorrect generator message: {msg}"),
|
||||||
"Snix bug: VM responded with incorrect generator message: {}",
|
|
||||||
msg
|
|
||||||
),
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1234,10 +1234,7 @@ async fn resolve_with(
|
||||||
async fn fetch_forced_with(co: &GenCo, idx: usize) -> Value {
|
async fn fetch_forced_with(co: &GenCo, idx: usize) -> Value {
|
||||||
match co.yield_(VMRequest::WithValue(idx)).await {
|
match co.yield_(VMRequest::WithValue(idx)).await {
|
||||||
VMResponse::Value(value) => value,
|
VMResponse::Value(value) => value,
|
||||||
msg => panic!(
|
msg => panic!("Snix bug: VM responded with incorrect generator message: {msg}"),
|
||||||
"Snix bug: VM responded with incorrect generator message: {}",
|
|
||||||
msg
|
|
||||||
),
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1245,10 +1242,7 @@ async fn resolve_with(
|
||||||
async fn fetch_captured_with(co: &GenCo, idx: usize) -> Value {
|
async fn fetch_captured_with(co: &GenCo, idx: usize) -> Value {
|
||||||
match co.yield_(VMRequest::CapturedWithValue(idx)).await {
|
match co.yield_(VMRequest::CapturedWithValue(idx)).await {
|
||||||
VMResponse::Value(value) => value,
|
VMResponse::Value(value) => value,
|
||||||
msg => panic!(
|
msg => panic!("Snix bug: VM responded with incorrect generator message: {msg}"),
|
||||||
"Snix bug: VM responded with incorrect generator message: {}",
|
|
||||||
msg
|
|
||||||
),
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -92,7 +92,7 @@ impl EvalWarning {
|
||||||
}
|
}
|
||||||
|
|
||||||
WarningKind::ShadowedGlobal(name) => {
|
WarningKind::ShadowedGlobal(name) => {
|
||||||
format!("declared variable '{}' shadows a built-in global!", name)
|
format!("declared variable '{name}' shadows a built-in global!")
|
||||||
}
|
}
|
||||||
|
|
||||||
WarningKind::DeprecatedLegacyLet => {
|
WarningKind::DeprecatedLegacyLet => {
|
||||||
|
|
@ -100,11 +100,11 @@ impl EvalWarning {
|
||||||
}
|
}
|
||||||
|
|
||||||
WarningKind::InvalidNixPath(ref err) => {
|
WarningKind::InvalidNixPath(ref err) => {
|
||||||
format!("invalid NIX_PATH resulted in a parse error: {}", err)
|
format!("invalid NIX_PATH resulted in a parse error: {err}")
|
||||||
}
|
}
|
||||||
|
|
||||||
WarningKind::UselessBoolOperation(msg) => {
|
WarningKind::UselessBoolOperation(msg) => {
|
||||||
format!("useless operation on boolean: {}", msg)
|
format!("useless operation on boolean: {msg}")
|
||||||
}
|
}
|
||||||
|
|
||||||
WarningKind::DeadCode => "this code will never be executed".to_string(),
|
WarningKind::DeadCode => "this code will never be executed".to_string(),
|
||||||
|
|
@ -113,14 +113,13 @@ impl EvalWarning {
|
||||||
|
|
||||||
WarningKind::EmptyLet => "this `let`-expression contains no bindings".to_string(),
|
WarningKind::EmptyLet => "this `let`-expression contains no bindings".to_string(),
|
||||||
|
|
||||||
WarningKind::ShadowedOutput(ref out) => format!(
|
WarningKind::ShadowedOutput(ref out) => {
|
||||||
"this derivation's environment shadows the output name {}",
|
format!("this derivation's environment shadows the output name {out}")
|
||||||
out
|
}
|
||||||
),
|
|
||||||
WarningKind::SRIHashWrongPadding => "SRI hash has wrong padding".to_string(),
|
WarningKind::SRIHashWrongPadding => "SRI hash has wrong padding".to_string(),
|
||||||
|
|
||||||
WarningKind::NotImplemented(what) => {
|
WarningKind::NotImplemented(what) => {
|
||||||
format!("feature not yet implemented in snix: {}", what)
|
format!("feature not yet implemented in snix: {what}")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -43,8 +43,7 @@ fn populate_inputs(drv: &mut Derivation, full_context: NixContext, known_paths:
|
||||||
#[cfg(debug_assertions)]
|
#[cfg(debug_assertions)]
|
||||||
assert!(
|
assert!(
|
||||||
_rest.iter().next().is_none(),
|
_rest.iter().next().is_none(),
|
||||||
"Extra path not empty for {}",
|
"Extra path not empty for {derivation_str}"
|
||||||
derivation_str
|
|
||||||
);
|
);
|
||||||
|
|
||||||
match drv.input_derivations.entry(derivation.clone()) {
|
match drv.input_derivations.entry(derivation.clone()) {
|
||||||
|
|
@ -65,8 +64,7 @@ fn populate_inputs(drv: &mut Derivation, full_context: NixContext, known_paths:
|
||||||
#[cfg(debug_assertions)]
|
#[cfg(debug_assertions)]
|
||||||
assert!(
|
assert!(
|
||||||
_rest.iter().next().is_none(),
|
_rest.iter().next().is_none(),
|
||||||
"Extra path not empty for {}",
|
"Extra path not empty for {drv_path}"
|
||||||
drv_path
|
|
||||||
);
|
);
|
||||||
|
|
||||||
// We need to know all the outputs *names* of that derivation.
|
// We need to know all the outputs *names* of that derivation.
|
||||||
|
|
@ -160,7 +158,7 @@ fn handle_fixed_output(
|
||||||
// Peek at hash_str once more.
|
// Peek at hash_str once more.
|
||||||
// If it was a SRI hash, but is not using the correct length, this means
|
// If it was a SRI hash, but is not using the correct length, this means
|
||||||
// the padding was wrong. Emit a warning in that case.
|
// the padding was wrong. Emit a warning in that case.
|
||||||
let sri_prefix = format!("{}-", algo);
|
let sri_prefix = format!("{algo}-");
|
||||||
if let Some(rest) = hash_str.strip_prefix(&sri_prefix) {
|
if let Some(rest) = hash_str.strip_prefix(&sri_prefix) {
|
||||||
if data_encoding::BASE64.encode_len(algo.digest_length()) != rest.len() {
|
if data_encoding::BASE64.encode_len(algo.digest_length()) != rest.len() {
|
||||||
return Ok(Some(WarningKind::SRIHashWrongPadding));
|
return Ok(Some(WarningKind::SRIHashWrongPadding));
|
||||||
|
|
@ -475,7 +473,7 @@ pub(crate) mod derivation_builtins {
|
||||||
&drv.hash_derivation_modulo(|drv_path| {
|
&drv.hash_derivation_modulo(|drv_path| {
|
||||||
*known_paths
|
*known_paths
|
||||||
.get_hash_derivation_modulo(&drv_path.to_owned())
|
.get_hash_derivation_modulo(&drv_path.to_owned())
|
||||||
.unwrap_or_else(|| panic!("{} not found", drv_path))
|
.unwrap_or_else(|| panic!("{drv_path} not found"))
|
||||||
}),
|
}),
|
||||||
)
|
)
|
||||||
.map_err(DerivationError::InvalidDerivation)?;
|
.map_err(DerivationError::InvalidDerivation)?;
|
||||||
|
|
|
||||||
|
|
@ -99,7 +99,7 @@ async fn filtered_ingest(
|
||||||
.await
|
.await
|
||||||
.map_err(|e| ErrorKind::IO {
|
.map_err(|e| ErrorKind::IO {
|
||||||
path: Some(path.to_path_buf()),
|
path: Some(path.to_path_buf()),
|
||||||
error: Rc::new(std::io::Error::new(std::io::ErrorKind::Other, e)),
|
error: Rc::new(std::io::Error::other(e)),
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -117,7 +117,7 @@ mod tests {
|
||||||
snix_eval::Value::String(s) => {
|
snix_eval::Value::String(s) => {
|
||||||
assert_eq!(*s, "/nix/store/xpcvxsx5sw4rbq666blz6sxqlmsqphmr-foo",);
|
assert_eq!(*s, "/nix/store/xpcvxsx5sw4rbq666blz6sxqlmsqphmr-foo",);
|
||||||
}
|
}
|
||||||
_ => panic!("unexpected value type: {:?}", value),
|
_ => panic!("unexpected value type: {value:?}"),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -204,7 +204,7 @@ mod tests {
|
||||||
snix_eval::Value::String(s) => {
|
snix_eval::Value::String(s) => {
|
||||||
assert_eq!(*s, expected_path);
|
assert_eq!(*s, expected_path);
|
||||||
}
|
}
|
||||||
_ => panic!("unexpected value type: {:?}", value),
|
_ => panic!("unexpected value type: {value:?}"),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -236,7 +236,7 @@ mod tests {
|
||||||
snix_eval::Value::Bool(v) => {
|
snix_eval::Value::Bool(v) => {
|
||||||
assert!(v);
|
assert!(v);
|
||||||
}
|
}
|
||||||
_ => panic!("unexpected value type: {:?}", value),
|
_ => panic!("unexpected value type: {value:?}"),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -254,7 +254,7 @@ mod tests {
|
||||||
snix_eval::Value::Bool(v) => {
|
snix_eval::Value::Bool(v) => {
|
||||||
assert!(v);
|
assert!(v);
|
||||||
}
|
}
|
||||||
_ => panic!("unexpected value type: {:?}", value),
|
_ => panic!("unexpected value type: {value:?}"),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -276,7 +276,7 @@ mod tests {
|
||||||
snix_eval::Value::Bool(v) => {
|
snix_eval::Value::Bool(v) => {
|
||||||
assert!(v);
|
assert!(v);
|
||||||
}
|
}
|
||||||
_ => panic!("unexpected value type: {:?}", value),
|
_ => panic!("unexpected value type: {value:?}"),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -297,7 +297,7 @@ mod tests {
|
||||||
snix_eval::Value::Bool(v) => {
|
snix_eval::Value::Bool(v) => {
|
||||||
assert!(v);
|
assert!(v);
|
||||||
}
|
}
|
||||||
_ => panic!("unexpected value type: {:?}", value),
|
_ => panic!("unexpected value type: {value:?}"),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -330,7 +330,7 @@ mod tests {
|
||||||
assert_eq!(*s, expected_drvpath);
|
assert_eq!(*s, expected_drvpath);
|
||||||
}
|
}
|
||||||
|
|
||||||
_ => panic!("unexpected value type: {:?}", value),
|
_ => panic!("unexpected value type: {value:?}"),
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -362,7 +362,7 @@ mod tests {
|
||||||
snix_eval::Value::String(s) => {
|
snix_eval::Value::String(s) => {
|
||||||
assert_eq!(*s, expected_path);
|
assert_eq!(*s, expected_path);
|
||||||
}
|
}
|
||||||
_ => panic!("unexpected value type: {:?}", value),
|
_ => panic!("unexpected value type: {value:?}"),
|
||||||
}
|
}
|
||||||
|
|
||||||
assert!(
|
assert!(
|
||||||
|
|
@ -536,7 +536,7 @@ mod tests {
|
||||||
snix_eval::Value::String(s) => {
|
snix_eval::Value::String(s) => {
|
||||||
assert_eq!(expected_outpath, s.as_bstr());
|
assert_eq!(expected_outpath, s.as_bstr());
|
||||||
}
|
}
|
||||||
_ => panic!("unexpected value type: {:?}", value),
|
_ => panic!("unexpected value type: {value:?}"),
|
||||||
}
|
}
|
||||||
|
|
||||||
assert!(eval_result.errors.is_empty(), "errors should be empty");
|
assert!(eval_result.errors.is_empty(), "errors should be empty");
|
||||||
|
|
@ -580,7 +580,7 @@ mod tests {
|
||||||
s.as_bstr()
|
s.as_bstr()
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
v => panic!("unexpected value type: {:?}", v),
|
v => panic!("unexpected value type: {v:?}"),
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
assert!(value.is_none(), "unexpected success on illegal store paths");
|
assert!(value.is_none(), "unexpected success on illegal store paths");
|
||||||
|
|
@ -626,7 +626,7 @@ mod tests {
|
||||||
s.as_bstr()
|
s.as_bstr()
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
v => panic!("unexpected value type: {:?}", v),
|
v => panic!("unexpected value type: {v:?}"),
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
assert!(value.is_none(), "unexpected success on illegal store paths");
|
assert!(value.is_none(), "unexpected success on illegal store paths");
|
||||||
|
|
@ -714,7 +714,7 @@ mod tests {
|
||||||
snix_eval::Value::String(s) => {
|
snix_eval::Value::String(s) => {
|
||||||
assert_eq!(expected_outpath, s.as_bstr());
|
assert_eq!(expected_outpath, s.as_bstr());
|
||||||
}
|
}
|
||||||
_ => panic!("unexpected value type: {:?}", value),
|
_ => panic!("unexpected value type: {value:?}"),
|
||||||
}
|
}
|
||||||
|
|
||||||
assert!(eval_result.errors.is_empty(), "errors should be empty");
|
assert!(eval_result.errors.is_empty(), "errors should be empty");
|
||||||
|
|
|
||||||
|
|
@ -116,7 +116,7 @@ impl std::fmt::Debug for Fetch {
|
||||||
NixHash::Sha256(*exp_nar_sha256)
|
NixHash::Sha256(*exp_nar_sha256)
|
||||||
)
|
)
|
||||||
} else {
|
} else {
|
||||||
write!(f, "Tarball [url: {}, exp_hash: None]", url)
|
write!(f, "Tarball [url: {url}, exp_hash: None]")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Fetch::NAR { url, hash } => {
|
Fetch::NAR { url, hash } => {
|
||||||
|
|
|
||||||
|
|
@ -78,7 +78,7 @@ impl KnownPaths {
|
||||||
// compute the hash derivation modulo
|
// compute the hash derivation modulo
|
||||||
let hash_derivation_modulo = drv.hash_derivation_modulo(|drv_path| {
|
let hash_derivation_modulo = drv.hash_derivation_modulo(|drv_path| {
|
||||||
self.get_hash_derivation_modulo(&drv_path.to_owned())
|
self.get_hash_derivation_modulo(&drv_path.to_owned())
|
||||||
.unwrap_or_else(|| panic!("{} not found", drv_path))
|
.unwrap_or_else(|| panic!("{drv_path} not found"))
|
||||||
.to_owned()
|
.to_owned()
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -23,7 +23,7 @@ pub fn configure_nix_path<'co, 'ro, 'env, IO>(
|
||||||
eval_builder.nix_path(
|
eval_builder.nix_path(
|
||||||
nix_search_path
|
nix_search_path
|
||||||
.as_ref()
|
.as_ref()
|
||||||
.map(|p| format!("nix=/__corepkgs__:{}", p))
|
.map(|p| format!("nix=/__corepkgs__:{p}"))
|
||||||
.or_else(|| Some("nix=/__corepkgs__".to_string())),
|
.or_else(|| Some("nix=/__corepkgs__".to_string())),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -258,7 +258,7 @@ fn handle_pass_as_file(
|
||||||
/// The filepath is `/build/.attrs-${nixbase32(sha256(key))`.
|
/// The filepath is `/build/.attrs-${nixbase32(sha256(key))`.
|
||||||
fn calculate_pass_as_file_env(k: &str) -> (String, String) {
|
fn calculate_pass_as_file_env(k: &str) -> (String, String) {
|
||||||
(
|
(
|
||||||
format!("{}Path", k),
|
format!("{k}Path"),
|
||||||
format!(
|
format!(
|
||||||
"/build/.attr-{}",
|
"/build/.attr-{}",
|
||||||
nixbase32::encode(&Sha256::new_with_prefix(k).finalize())
|
nixbase32::encode(&Sha256::new_with_prefix(k).finalize())
|
||||||
|
|
|
||||||
|
|
@ -223,7 +223,7 @@ impl SnixStoreIO {
|
||||||
.as_ref()
|
.as_ref()
|
||||||
.do_build(build_request)
|
.do_build(build_request)
|
||||||
.await
|
.await
|
||||||
.map_err(|e| std::io::Error::new(io::ErrorKind::Other, e))?;
|
.map_err(std::io::Error::other)?;
|
||||||
|
|
||||||
let mut out_path_info: Option<PathInfo> = None;
|
let mut out_path_info: Option<PathInfo> = None;
|
||||||
|
|
||||||
|
|
@ -256,8 +256,7 @@ impl SnixStoreIO {
|
||||||
all_possible_refs
|
all_possible_refs
|
||||||
.get(*idx as usize)
|
.get(*idx as usize)
|
||||||
.map(|it| (*it).clone())
|
.map(|it| (*it).clone())
|
||||||
.ok_or(std::io::Error::new(
|
.ok_or(std::io::Error::other(
|
||||||
std::io::ErrorKind::Other,
|
|
||||||
"invalid build response",
|
"invalid build response",
|
||||||
))
|
))
|
||||||
})
|
})
|
||||||
|
|
@ -289,7 +288,7 @@ impl SnixStoreIO {
|
||||||
self.path_info_service
|
self.path_info_service
|
||||||
.put(path_info.clone())
|
.put(path_info.clone())
|
||||||
.await
|
.await
|
||||||
.map_err(|e| std::io::Error::new(io::ErrorKind::Other, e))?;
|
.map_err(std::io::Error::other)?;
|
||||||
|
|
||||||
if store_path == &output_path {
|
if store_path == &output_path {
|
||||||
out_path_info = Some(path_info);
|
out_path_info = Some(path_info);
|
||||||
|
|
@ -309,7 +308,7 @@ impl SnixStoreIO {
|
||||||
Ok(
|
Ok(
|
||||||
directoryservice::descend_to(&self.directory_service, path_info.node.clone(), sub_path)
|
directoryservice::descend_to(&self.directory_service, path_info.node.clone(), sub_path)
|
||||||
.await
|
.await
|
||||||
.map_err(|e| std::io::Error::new(io::ErrorKind::Other, e))?
|
.map_err(std::io::Error::other)?
|
||||||
.map(|node| {
|
.map(|node| {
|
||||||
path_info.node = node;
|
path_info.node = node;
|
||||||
path_info
|
path_info
|
||||||
|
|
@ -361,7 +360,7 @@ impl EvalIO for SnixStoreIO {
|
||||||
// This would normally be a io::ErrorKind::IsADirectory (still unstable)
|
// This would normally be a io::ErrorKind::IsADirectory (still unstable)
|
||||||
Err(io::Error::new(
|
Err(io::Error::new(
|
||||||
io::ErrorKind::Unsupported,
|
io::ErrorKind::Unsupported,
|
||||||
format!("tried to open directory at {:?}", path),
|
format!("tried to open directory at {path:?}"),
|
||||||
))
|
))
|
||||||
}
|
}
|
||||||
Node::File { digest, .. } => {
|
Node::File { digest, .. } => {
|
||||||
|
|
@ -558,7 +557,7 @@ mod tests {
|
||||||
let value = result.value.expect("must be some");
|
let value = result.value.expect("must be some");
|
||||||
match value {
|
match value {
|
||||||
snix_eval::Value::String(s) => Some(s.to_str_lossy().into_owned()),
|
snix_eval::Value::String(s) => Some(s.to_str_lossy().into_owned()),
|
||||||
_ => panic!("unexpected value type: {:?}", value),
|
_ => panic!("unexpected value type: {value:?}"),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -625,7 +624,7 @@ mod tests {
|
||||||
snix_eval::Value::String(s) => {
|
snix_eval::Value::String(s) => {
|
||||||
assert_eq!(*s, "/deep/thought");
|
assert_eq!(*s, "/deep/thought");
|
||||||
}
|
}
|
||||||
_ => panic!("unexpected value type: {:?}", value),
|
_ => panic!("unexpected value type: {value:?}"),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -83,9 +83,6 @@ async fn four_o_four() -> Result<(), StatusCode> {
|
||||||
async fn nix_cache_info(priority: u64) -> impl IntoResponse {
|
async fn nix_cache_info(priority: u64) -> impl IntoResponse {
|
||||||
(
|
(
|
||||||
[("Content-Type", nix_http::MIME_TYPE_CACHE_INFO)],
|
[("Content-Type", nix_http::MIME_TYPE_CACHE_INFO)],
|
||||||
format!(
|
format!("StoreDir: /nix/store\nWantMassQuery: 1\nPriority: {priority}\n"),
|
||||||
"StoreDir: /nix/store\nWantMassQuery: 1\nPriority: {}\n",
|
|
||||||
priority
|
|
||||||
),
|
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -51,7 +51,7 @@ impl Field {
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
let path = meta.path.to_token_stream().to_string();
|
let path = meta.path.to_token_stream().to_string();
|
||||||
return Err(meta.error(format_args!("unknown nix field attribute '{}'", path)));
|
return Err(meta.error(format_args!("unknown nix field attribute '{path}'")));
|
||||||
}
|
}
|
||||||
Ok(())
|
Ok(())
|
||||||
}) {
|
}) {
|
||||||
|
|
@ -86,9 +86,7 @@ impl Variant {
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
let path = meta.path.to_token_stream().to_string();
|
let path = meta.path.to_token_stream().to_string();
|
||||||
return Err(
|
return Err(meta.error(format_args!("unknown nix variant attribute '{path}'")));
|
||||||
meta.error(format_args!("unknown nix variant attribute '{}'", path))
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
Ok(())
|
Ok(())
|
||||||
}) {
|
}) {
|
||||||
|
|
@ -149,9 +147,7 @@ impl Container {
|
||||||
crate_path = parse_lit(ctx, &meta, CRATE)?;
|
crate_path = parse_lit(ctx, &meta, CRATE)?;
|
||||||
} else {
|
} else {
|
||||||
let path = meta.path.to_token_stream().to_string();
|
let path = meta.path.to_token_stream().to_string();
|
||||||
return Err(
|
return Err(meta.error(format_args!("unknown nix variant attribute '{path}'")));
|
||||||
meta.error(format_args!("unknown nix variant attribute '{}'", path))
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
Ok(())
|
Ok(())
|
||||||
}) {
|
}) {
|
||||||
|
|
@ -190,7 +186,7 @@ pub fn get_lit_str(
|
||||||
} else {
|
} else {
|
||||||
ctx.error_spanned(
|
ctx.error_spanned(
|
||||||
expr,
|
expr,
|
||||||
format_args!("expected nix attribute {} to be string", attr),
|
format_args!("expected nix attribute {attr} to be string"),
|
||||||
);
|
);
|
||||||
Ok(None)
|
Ok(None)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -42,6 +42,6 @@ fn main() {
|
||||||
.expect("unable to serialize")
|
.expect("unable to serialize")
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
Err(e) => eprintln!("unable to parse derivation: {:#?}", e),
|
Err(e) => eprintln!("unable to parse derivation: {e:#?}"),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -133,7 +133,7 @@ impl Derivation {
|
||||||
name: &str,
|
name: &str,
|
||||||
) -> Result<StorePath<String>, DerivationError> {
|
) -> Result<StorePath<String>, DerivationError> {
|
||||||
// append .drv to the name
|
// append .drv to the name
|
||||||
let name = format!("{}.drv", name);
|
let name = format!("{name}.drv");
|
||||||
|
|
||||||
// collect the list of paths from input_sources and input_derivations
|
// collect the list of paths from input_sources and input_derivations
|
||||||
// into a (sorted, guaranteed by BTreeSet) list of references
|
// into a (sorted, guaranteed by BTreeSet) list of references
|
||||||
|
|
@ -362,6 +362,6 @@ fn ca_kind_prefix(ca_hash: &CAHash) -> &'static str {
|
||||||
match ca_hash {
|
match ca_hash {
|
||||||
CAHash::Flat(_) => "",
|
CAHash::Flat(_) => "",
|
||||||
CAHash::Nar(_) => "r:",
|
CAHash::Nar(_) => "r:",
|
||||||
_ => panic!("invalid ca hash in derivation context: {:?}", ca_hash),
|
_ => panic!("invalid ca hash in derivation context: {ca_hash:?}"),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -151,7 +151,7 @@ fn from_aterm_bytes_trailer() {
|
||||||
)]
|
)]
|
||||||
#[case::unicode("unicode", "52a9id8hx688hvlnz4d1n25ml1jdykz0-unicode.drv")]
|
#[case::unicode("unicode", "52a9id8hx688hvlnz4d1n25ml1jdykz0-unicode.drv")]
|
||||||
fn derivation_path(#[case] name: &str, #[case] expected_path: &str) {
|
fn derivation_path(#[case] name: &str, #[case] expected_path: &str) {
|
||||||
let json_bytes = fs::read(format!("{}/ok/{}.json", RESOURCES_PATHS, expected_path))
|
let json_bytes = fs::read(format!("{RESOURCES_PATHS}/ok/{expected_path}.json"))
|
||||||
.expect("unable to read JSON");
|
.expect("unable to read JSON");
|
||||||
let derivation: Derivation =
|
let derivation: Derivation =
|
||||||
serde_json::from_slice(&json_bytes).expect("JSON was not well-formatted");
|
serde_json::from_slice(&json_bytes).expect("JSON was not well-formatted");
|
||||||
|
|
@ -194,7 +194,7 @@ fn derivation_without_output_paths(derivation: &Derivation) -> Derivation {
|
||||||
fn hash_derivation_modulo_fixed(#[case] drv_path: &str, #[case] expected_digest: [u8; 32]) {
|
fn hash_derivation_modulo_fixed(#[case] drv_path: &str, #[case] expected_digest: [u8; 32]) {
|
||||||
// read in the fixture
|
// read in the fixture
|
||||||
let json_bytes =
|
let json_bytes =
|
||||||
fs::read(format!("{}/ok/{}.json", RESOURCES_PATHS, drv_path)).expect("unable to read JSON");
|
fs::read(format!("{RESOURCES_PATHS}/ok/{drv_path}.json")).expect("unable to read JSON");
|
||||||
let drv: Derivation = serde_json::from_slice(&json_bytes).expect("must deserialize");
|
let drv: Derivation = serde_json::from_slice(&json_bytes).expect("must deserialize");
|
||||||
|
|
||||||
let actual = drv.hash_derivation_modulo(|_| panic!("must not be called"));
|
let actual = drv.hash_derivation_modulo(|_| panic!("must not be called"));
|
||||||
|
|
@ -220,7 +220,7 @@ fn hash_derivation_modulo_fixed(#[case] drv_path: &str, #[case] expected_digest:
|
||||||
fn output_paths(#[case] name: &str, #[case] drv_path_str: &str) {
|
fn output_paths(#[case] name: &str, #[case] drv_path_str: &str) {
|
||||||
// read in the derivation
|
// read in the derivation
|
||||||
let expected_derivation = Derivation::from_aterm_bytes(
|
let expected_derivation = Derivation::from_aterm_bytes(
|
||||||
&fs::read(format!("{}/ok/{}", RESOURCES_PATHS, drv_path_str)).expect("unable to read .drv"),
|
&fs::read(format!("{RESOURCES_PATHS}/ok/{drv_path_str}")).expect("unable to read .drv"),
|
||||||
)
|
)
|
||||||
.expect("must succeed");
|
.expect("must succeed");
|
||||||
|
|
||||||
|
|
@ -410,7 +410,7 @@ fn output_path_construction() {
|
||||||
"foo",
|
"foo",
|
||||||
&foo_drv.hash_derivation_modulo(|drv_path| {
|
&foo_drv.hash_derivation_modulo(|drv_path| {
|
||||||
if drv_path.to_string() != "0hm2f1psjpcwg8fijsmr4wwxrx59s092-bar.drv" {
|
if drv_path.to_string() != "0hm2f1psjpcwg8fijsmr4wwxrx59s092-bar.drv" {
|
||||||
panic!("lookup called with unexpected drv_path: {}", drv_path);
|
panic!("lookup called with unexpected drv_path: {drv_path}");
|
||||||
}
|
}
|
||||||
bar_drv_hash_derivation_modulo
|
bar_drv_hash_derivation_modulo
|
||||||
}),
|
}),
|
||||||
|
|
|
||||||
|
|
@ -590,7 +590,7 @@ impl FlakeRef {
|
||||||
_ => unreachable!(),
|
_ => unreachable!(),
|
||||||
};
|
};
|
||||||
|
|
||||||
let mut url = Url::parse(&format!("{}://{}/{}", scheme, owner, repo)).unwrap();
|
let mut url = Url::parse(&format!("{scheme}://{owner}/{repo}")).unwrap();
|
||||||
if let Some(h) = host {
|
if let Some(h) = host {
|
||||||
url.set_host(Some(h)).unwrap();
|
url.set_host(Some(h)).unwrap();
|
||||||
}
|
}
|
||||||
|
|
@ -609,7 +609,7 @@ impl FlakeRef {
|
||||||
url
|
url
|
||||||
}
|
}
|
||||||
FlakeRef::Indirect { id, r#ref, rev } => {
|
FlakeRef::Indirect { id, r#ref, rev } => {
|
||||||
let mut url = Url::parse(&format!("indirect://{}", id)).unwrap();
|
let mut url = Url::parse(&format!("indirect://{id}")).unwrap();
|
||||||
append_params(&mut url, &[("ref", r#ref.clone()), ("rev", rev.clone())]);
|
append_params(&mut url, &[("ref", r#ref.clone()), ("rev", rev.clone())]);
|
||||||
url
|
url
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -290,7 +290,7 @@ async fn must_read_file(name: &'static str, entry: nar::reader::Entry<'_, '_>) {
|
||||||
assert!(!executable);
|
assert!(!executable);
|
||||||
assert_eq!(reader.read(&mut [0]).await.unwrap(), 0);
|
assert_eq!(reader.read(&mut [0]).await.unwrap(), 0);
|
||||||
}
|
}
|
||||||
_ => panic!("unexpected type for {}", name),
|
_ => panic!("unexpected type for {name}"),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -305,6 +305,6 @@ fn must_be_symlink(
|
||||||
nar::reader::Node::Symlink { target } => {
|
nar::reader::Node::Symlink { target } => {
|
||||||
assert_eq!(exp_target.as_bytes(), &target);
|
assert_eq!(exp_target.as_bytes(), &target);
|
||||||
}
|
}
|
||||||
_ => panic!("unexpected type for {}", name),
|
_ => panic!("unexpected type for {name}"),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -258,7 +258,7 @@ fn must_read_file(name: &'static str, entry: nar::reader::Entry<'_, '_>) {
|
||||||
assert!(!executable);
|
assert!(!executable);
|
||||||
assert_eq!(reader.read(&mut [0]).unwrap(), 0);
|
assert_eq!(reader.read(&mut [0]).unwrap(), 0);
|
||||||
}
|
}
|
||||||
_ => panic!("unexpected type for {}", name),
|
_ => panic!("unexpected type for {name}"),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -273,6 +273,6 @@ fn must_be_symlink(
|
||||||
nar::reader::Node::Symlink { target } => {
|
nar::reader::Node::Symlink { target } => {
|
||||||
assert_eq!(exp_target.as_bytes(), &target);
|
assert_eq!(exp_target.as_bytes(), &target);
|
||||||
}
|
}
|
||||||
_ => panic!("unexpected type for {}", name),
|
_ => panic!("unexpected type for {name}"),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -357,7 +357,7 @@ mod tests {
|
||||||
}
|
}
|
||||||
Err(e) => {
|
Err(e) => {
|
||||||
w.write_value(&STDERR_ERROR).await.unwrap();
|
w.write_value(&STDERR_ERROR).await.unwrap();
|
||||||
w.write_value(&NixError::new(format!("{:?}", e)))
|
w.write_value(&NixError::new(format!("{e:?}")))
|
||||||
.await
|
.await
|
||||||
.unwrap();
|
.unwrap();
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -118,7 +118,7 @@ impl NixDeserialize for CAHash {
|
||||||
let value: Option<String> = reader.try_read_value().await?;
|
let value: Option<String> = reader.try_read_value().await?;
|
||||||
match value {
|
match value {
|
||||||
Some(value) => Ok(Some(CAHash::from_nix_hex_str(&value).ok_or_else(|| {
|
Some(value) => Ok(Some(CAHash::from_nix_hex_str(&value).ok_or_else(|| {
|
||||||
R::Error::invalid_data(format!("Invalid cahash {}", value))
|
R::Error::invalid_data(format!("Invalid cahash {value}"))
|
||||||
})?)),
|
})?)),
|
||||||
None => Ok(None),
|
None => Ok(None),
|
||||||
}
|
}
|
||||||
|
|
@ -137,7 +137,7 @@ impl NixDeserialize for Option<CAHash> {
|
||||||
Ok(None)
|
Ok(None)
|
||||||
} else {
|
} else {
|
||||||
Ok(Some(Some(CAHash::from_nix_hex_str(&value).ok_or_else(
|
Ok(Some(Some(CAHash::from_nix_hex_str(&value).ok_or_else(
|
||||||
|| R::Error::invalid_data(format!("Invalid cahash {}", value)),
|
|| R::Error::invalid_data(format!("Invalid cahash {value}")),
|
||||||
)?)))
|
)?)))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -168,7 +168,7 @@ where
|
||||||
if worker_magic_1 != WORKER_MAGIC_1 {
|
if worker_magic_1 != WORKER_MAGIC_1 {
|
||||||
Err(std::io::Error::new(
|
Err(std::io::Error::new(
|
||||||
ErrorKind::InvalidData,
|
ErrorKind::InvalidData,
|
||||||
format!("Incorrect worker magic number received: {}", worker_magic_1),
|
format!("Incorrect worker magic number received: {worker_magic_1}"),
|
||||||
))
|
))
|
||||||
} else {
|
} else {
|
||||||
conn.write_u64_le(WORKER_MAGIC_2).await?;
|
conn.write_u64_le(WORKER_MAGIC_2).await?;
|
||||||
|
|
@ -182,7 +182,7 @@ where
|
||||||
if client_version < ProtocolVersion::from_parts(1, 10) {
|
if client_version < ProtocolVersion::from_parts(1, 10) {
|
||||||
return Err(Error::new(
|
return Err(Error::new(
|
||||||
ErrorKind::Unsupported,
|
ErrorKind::Unsupported,
|
||||||
format!("The nix client version {} is too old", client_version),
|
format!("The nix client version {client_version} is too old"),
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
let picked_version = min(PROTOCOL_VERSION, client_version);
|
let picked_version = min(PROTOCOL_VERSION, client_version);
|
||||||
|
|
@ -215,7 +215,7 @@ pub async fn read_op<R: AsyncReadExt + Unpin>(r: &mut R) -> std::io::Result<Oper
|
||||||
Operation::try_from(op_number).map_err(|_| {
|
Operation::try_from(op_number).map_err(|_| {
|
||||||
Error::new(
|
Error::new(
|
||||||
ErrorKind::InvalidData,
|
ErrorKind::InvalidData,
|
||||||
format!("Invalid OP number {}", op_number),
|
format!("Invalid OP number {op_number}"),
|
||||||
)
|
)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -202,7 +202,7 @@ where
|
||||||
/// That is just the string representation, prefixed with the store prefix
|
/// That is just the string representation, prefixed with the store prefix
|
||||||
/// ([STORE_DIR_WITH_SLASH]),
|
/// ([STORE_DIR_WITH_SLASH]),
|
||||||
pub fn to_absolute_path(&self) -> String {
|
pub fn to_absolute_path(&self) -> String {
|
||||||
format!("{}{}", STORE_DIR_WITH_SLASH, self)
|
format!("{STORE_DIR_WITH_SLASH}{self}")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -203,7 +203,7 @@ fn make_references_string<S: AsRef<str>, I: IntoIterator<Item = S>>(
|
||||||
/// The actual placeholder is basically just a SHA256 hash encoded in
|
/// The actual placeholder is basically just a SHA256 hash encoded in
|
||||||
/// cppnix format.
|
/// cppnix format.
|
||||||
pub fn hash_placeholder(name: &str) -> String {
|
pub fn hash_placeholder(name: &str) -> String {
|
||||||
let digest = Sha256::new_with_prefix(format!("nix-output:{}", name)).finalize();
|
let digest = Sha256::new_with_prefix(format!("nix-output:{name}")).finalize();
|
||||||
|
|
||||||
format!("/{}", nixbase32::encode(&digest))
|
format!("/{}", nixbase32::encode(&digest))
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -554,7 +554,7 @@ mod tests {
|
||||||
let payload = &hex!("FF0102030405060708");
|
let payload = &hex!("FF0102030405060708");
|
||||||
let mut mock = Builder::new()
|
let mut mock = Builder::new()
|
||||||
.read(&produce_packet_bytes(payload).await[..offset])
|
.read(&produce_packet_bytes(payload).await[..offset])
|
||||||
.read_error(std::io::Error::new(std::io::ErrorKind::Other, "foo"))
|
.read_error(std::io::Error::other("foo"))
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
// Either length reading or data reading can fail, depending on which test case we're in.
|
// Either length reading or data reading can fail, depending on which test case we're in.
|
||||||
|
|
@ -595,7 +595,7 @@ mod tests {
|
||||||
let payload = &hex!("FF0102030405060708");
|
let payload = &hex!("FF0102030405060708");
|
||||||
let mock = Builder::new()
|
let mock = Builder::new()
|
||||||
.read(&produce_packet_bytes(payload).await[..offset])
|
.read(&produce_packet_bytes(payload).await[..offset])
|
||||||
.read_error(std::io::Error::new(std::io::ErrorKind::Other, "foo"))
|
.read_error(std::io::Error::other("foo"))
|
||||||
.build();
|
.build();
|
||||||
let mut mock = BufReader::new(mock);
|
let mut mock = BufReader::new(mock);
|
||||||
|
|
||||||
|
|
@ -631,7 +631,7 @@ mod tests {
|
||||||
let payload = &hex!("FF0102030405060708");
|
let payload = &hex!("FF0102030405060708");
|
||||||
let mut mock = Builder::new()
|
let mut mock = Builder::new()
|
||||||
.read(&produce_packet_bytes(payload).await)
|
.read(&produce_packet_bytes(payload).await)
|
||||||
.read_error(std::io::Error::new(std::io::ErrorKind::Other, "foo"))
|
.read_error(std::io::Error::other("foo"))
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
let mut r = BytesReader::new(&mut mock, ..MAX_LEN).await.unwrap();
|
let mut r = BytesReader::new(&mut mock, ..MAX_LEN).await.unwrap();
|
||||||
|
|
@ -648,7 +648,7 @@ mod tests {
|
||||||
let payload = &hex!("FF0102030405060708");
|
let payload = &hex!("FF0102030405060708");
|
||||||
let mock = Builder::new()
|
let mock = Builder::new()
|
||||||
.read(&produce_packet_bytes(payload).await)
|
.read(&produce_packet_bytes(payload).await)
|
||||||
.read_error(std::io::Error::new(std::io::ErrorKind::Other, "foo"))
|
.read_error(std::io::Error::other("foo"))
|
||||||
.build();
|
.build();
|
||||||
let mut mock = BufReader::new(mock);
|
let mut mock = BufReader::new(mock);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -477,7 +477,7 @@ mod tests {
|
||||||
|
|
||||||
let mut mock = Builder::new()
|
let mut mock = Builder::new()
|
||||||
.write(&1u32.to_le_bytes())
|
.write(&1u32.to_le_bytes())
|
||||||
.write_error(std::io::Error::new(std::io::ErrorKind::Other, "🍿"))
|
.write_error(std::io::Error::other("🍿"))
|
||||||
.build();
|
.build();
|
||||||
let mut w = BytesWriter::new(&mut mock, payload.len() as u64);
|
let mut w = BytesWriter::new(&mut mock, payload.len() as u64);
|
||||||
|
|
||||||
|
|
@ -492,7 +492,7 @@ mod tests {
|
||||||
|
|
||||||
let mut mock = Builder::new()
|
let mut mock = Builder::new()
|
||||||
.write(&1u32.to_le_bytes())
|
.write(&1u32.to_le_bytes())
|
||||||
.write_error(std::io::Error::new(std::io::ErrorKind::Other, "🍿"))
|
.write_error(std::io::Error::other("🍿"))
|
||||||
.build();
|
.build();
|
||||||
let mut w = BytesWriter::new(&mut mock, payload.len() as u64);
|
let mut w = BytesWriter::new(&mut mock, payload.len() as u64);
|
||||||
|
|
||||||
|
|
@ -508,7 +508,7 @@ mod tests {
|
||||||
let mut mock = Builder::new()
|
let mut mock = Builder::new()
|
||||||
.write(&2u64.to_le_bytes())
|
.write(&2u64.to_le_bytes())
|
||||||
.write(&hex!("f0"))
|
.write(&hex!("f0"))
|
||||||
.write_error(std::io::Error::new(std::io::ErrorKind::Other, "🍿"))
|
.write_error(std::io::Error::other("🍿"))
|
||||||
.build();
|
.build();
|
||||||
let mut w = BytesWriter::new(&mut mock, payload.len() as u64);
|
let mut w = BytesWriter::new(&mut mock, payload.len() as u64);
|
||||||
|
|
||||||
|
|
@ -526,7 +526,7 @@ mod tests {
|
||||||
.write(&1u64.to_le_bytes())
|
.write(&1u64.to_le_bytes())
|
||||||
.write(&hex!("f0"))
|
.write(&hex!("f0"))
|
||||||
.write(&hex!("00"))
|
.write(&hex!("00"))
|
||||||
.write_error(std::io::Error::new(std::io::ErrorKind::Other, "🍿"))
|
.write_error(std::io::Error::other("🍿"))
|
||||||
.build();
|
.build();
|
||||||
let mut w = BytesWriter::new(&mut mock, payload.len() as u64);
|
let mut w = BytesWriter::new(&mut mock, payload.len() as u64);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -24,7 +24,7 @@ pub trait Error: Sized + StdError {
|
||||||
|
|
||||||
/// Some kind of std::io::Error occured.
|
/// Some kind of std::io::Error occured.
|
||||||
fn io_error(err: std::io::Error) -> Self {
|
fn io_error(err: std::io::Error) -> Self {
|
||||||
Self::custom(format_args!("There was an I/O error {}", err))
|
Self::custom(format_args!("There was an I/O error {err}"))
|
||||||
}
|
}
|
||||||
|
|
||||||
/// The data read from `NixRead` is invalid.
|
/// The data read from `NixRead` is invalid.
|
||||||
|
|
@ -41,7 +41,7 @@ pub trait Error: Sized + StdError {
|
||||||
|
|
||||||
impl Error for io::Error {
|
impl Error for io::Error {
|
||||||
fn custom<T: fmt::Display>(msg: T) -> Self {
|
fn custom<T: fmt::Display>(msg: T) -> Self {
|
||||||
io::Error::new(io::ErrorKind::Other, msg.to_string())
|
io::Error::other(msg.to_string())
|
||||||
}
|
}
|
||||||
|
|
||||||
fn io_error(err: std::io::Error) -> Self {
|
fn io_error(err: std::io::Error) -> Self {
|
||||||
|
|
|
||||||
|
|
@ -215,7 +215,7 @@ impl Builder {
|
||||||
Operation::WriteDisplay(_, Err(Error::WrongWrite(op, OperationType::WriteDisplay))) => {
|
Operation::WriteDisplay(_, Err(Error::WrongWrite(op, OperationType::WriteDisplay))) => {
|
||||||
self.write_operation_type(*op)
|
self.write_operation_type(*op)
|
||||||
}
|
}
|
||||||
s => panic!("Invalid operation {:?}", s),
|
s => panic!("Invalid operation {s:?}"),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -19,7 +19,7 @@ pub trait Error: Sized + StdError {
|
||||||
fn custom<T: fmt::Display>(msg: T) -> Self;
|
fn custom<T: fmt::Display>(msg: T) -> Self;
|
||||||
|
|
||||||
fn io_error(err: std::io::Error) -> Self {
|
fn io_error(err: std::io::Error) -> Self {
|
||||||
Self::custom(format_args!("There was an I/O error {}", err))
|
Self::custom(format_args!("There was an I/O error {err}"))
|
||||||
}
|
}
|
||||||
|
|
||||||
fn unsupported_data<T: fmt::Display>(msg: T) -> Self {
|
fn unsupported_data<T: fmt::Display>(msg: T) -> Self {
|
||||||
|
|
@ -33,7 +33,7 @@ pub trait Error: Sized + StdError {
|
||||||
|
|
||||||
impl Error for io::Error {
|
impl Error for io::Error {
|
||||||
fn custom<T: fmt::Display>(msg: T) -> Self {
|
fn custom<T: fmt::Display>(msg: T) -> Self {
|
||||||
io::Error::new(io::ErrorKind::Other, msg.to_string())
|
io::Error::other(msg.to_string())
|
||||||
}
|
}
|
||||||
|
|
||||||
fn io_error(err: std::io::Error) -> Self {
|
fn io_error(err: std::io::Error) -> Self {
|
||||||
|
|
|
||||||
|
|
@ -203,7 +203,7 @@ where
|
||||||
}
|
}
|
||||||
let offset = self.buf.len();
|
let offset = self.buf.len();
|
||||||
self.buf.put_u64_le(0);
|
self.buf.put_u64_le(0);
|
||||||
if let Err(err) = write!(self.buf, "{}", msg) {
|
if let Err(err) = write!(self.buf, "{msg}") {
|
||||||
self.buf.truncate(offset);
|
self.buf.truncate(offset);
|
||||||
return Err(Self::Error::unsupported_data(err));
|
return Err(Self::Error::unsupported_data(err));
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -31,5 +31,5 @@ fn main() {
|
||||||
// Now you can use snix_serde to deserialise the struct:
|
// Now you can use snix_serde to deserialise the struct:
|
||||||
let foods: Data = snix_serde::from_str(code).expect("deserialisation should succeed");
|
let foods: Data = snix_serde::from_str(code).expect("deserialisation should succeed");
|
||||||
|
|
||||||
println!("These are the foods:\n{:#?}", foods);
|
println!("These are the foods:\n{foods:#?}");
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -29,6 +29,6 @@ fn main() {
|
||||||
|
|
||||||
match result {
|
match result {
|
||||||
Ok(cfg) => println!("Config says: {}:{}", cfg.host, cfg.port),
|
Ok(cfg) => println!("Config says: {}:{}", cfg.host, cfg.port),
|
||||||
Err(e) => eprintln!("{:?} / {}", e, e),
|
Err(e) => eprintln!("{e:?} / {e}"),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -41,16 +41,15 @@ impl Display for Error {
|
||||||
match self {
|
match self {
|
||||||
Error::Unserializable { value_type } => write!(
|
Error::Unserializable { value_type } => write!(
|
||||||
f,
|
f,
|
||||||
"can not deserialise a Nix '{}' into a Rust type",
|
"can not deserialise a Nix '{value_type}' into a Rust type"
|
||||||
value_type
|
|
||||||
),
|
),
|
||||||
|
|
||||||
Error::Unsupported { wanted } => {
|
Error::Unsupported { wanted } => {
|
||||||
write!(f, "can not deserialize a '{}' from a Nix value", wanted)
|
write!(f, "can not deserialize a '{wanted}' from a Nix value")
|
||||||
}
|
}
|
||||||
|
|
||||||
Error::UnexpectedType { expected, got } => {
|
Error::UnexpectedType { expected, got } => {
|
||||||
write!(f, "expected type {}, but got Nix type {}", expected, got)
|
write!(f, "expected type {expected}, but got Nix type {got}")
|
||||||
}
|
}
|
||||||
|
|
||||||
Error::NixErrors { errors } => {
|
Error::NixErrors { errors } => {
|
||||||
|
|
@ -67,10 +66,10 @@ impl Display for Error {
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
Error::Deserialization(err) => write!(f, "deserialisation error occured: {}", err),
|
Error::Deserialization(err) => write!(f, "deserialisation error occured: {err}"),
|
||||||
|
|
||||||
Error::IntegerConversion { got, need } => {
|
Error::IntegerConversion { got, need } => {
|
||||||
write!(f, "i64({}) does not fit in a {}", got, need)
|
write!(f, "i64({got}) does not fit in a {need}")
|
||||||
}
|
}
|
||||||
|
|
||||||
Error::AmbiguousEnum => write!(f, "could not determine enum variant: ambiguous keys"),
|
Error::AmbiguousEnum => write!(f, "could not determine enum variant: ambiguous keys"),
|
||||||
|
|
|
||||||
|
|
@ -287,7 +287,7 @@ async fn run_cli(
|
||||||
async move {
|
async move {
|
||||||
let span = Span::current();
|
let span = Span::current();
|
||||||
span.pb_set_style(&snix_tracing::PB_SPINNER_STYLE);
|
span.pb_set_style(&snix_tracing::PB_SPINNER_STYLE);
|
||||||
span.pb_set_message(&format!("Ingesting {:?}", path));
|
span.pb_set_message(&format!("Ingesting {path:?}"));
|
||||||
span.pb_start();
|
span.pb_start();
|
||||||
|
|
||||||
// Ingest the contents at the given path into castore.
|
// Ingest the contents at the given path into castore.
|
||||||
|
|
@ -300,7 +300,7 @@ async fn run_cli(
|
||||||
.await
|
.await
|
||||||
.map_err(std::io::Error::custom)?;
|
.map_err(std::io::Error::custom)?;
|
||||||
|
|
||||||
span.pb_set_message(&format!("NAR Calculation for {:?}", path));
|
span.pb_set_message(&format!("NAR Calculation for {path:?}"));
|
||||||
|
|
||||||
// Ask for the NAR size and sha256
|
// Ask for the NAR size and sha256
|
||||||
let (nar_size, nar_sha256) =
|
let (nar_size, nar_sha256) =
|
||||||
|
|
|
||||||
|
|
@ -94,7 +94,7 @@ where
|
||||||
let root_node =
|
let root_node =
|
||||||
ingest_path::<_, _, _, &[u8]>(blob_service, directory_service, path.as_ref(), None)
|
ingest_path::<_, _, _, &[u8]>(blob_service, directory_service, path.as_ref(), None)
|
||||||
.await
|
.await
|
||||||
.map_err(|e| std::io::Error::new(std::io::ErrorKind::Other, e))?;
|
.map_err(std::io::Error::other)?;
|
||||||
|
|
||||||
// Ask for the NAR size and sha256
|
// Ask for the NAR size and sha256
|
||||||
let (nar_size, nar_sha256) = nar_calculation_service.calculate_nar(&root_node).await?;
|
let (nar_size, nar_sha256) = nar_calculation_service.calculate_nar(&root_node).await?;
|
||||||
|
|
@ -108,7 +108,7 @@ where
|
||||||
store_path::build_ca_path(name, &ca, std::iter::empty::<&str>(), false).map_err(|_| {
|
store_path::build_ca_path(name, &ca, std::iter::empty::<&str>(), false).map_err(|_| {
|
||||||
std::io::Error::new(
|
std::io::Error::new(
|
||||||
std::io::ErrorKind::InvalidData,
|
std::io::ErrorKind::InvalidData,
|
||||||
format!("invalid name: {}", name),
|
format!("invalid name: {name}"),
|
||||||
)
|
)
|
||||||
})?;
|
})?;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -39,7 +39,7 @@ where
|
||||||
self.directory_service.clone(),
|
self.directory_service.clone(),
|
||||||
)
|
)
|
||||||
.await
|
.await
|
||||||
.map_err(|e| snix_castore::Error::StorageError(format!("failed rendering nar: {}", e)))
|
.map_err(|e| snix_castore::Error::StorageError(format!("failed rendering nar: {e}")))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -245,7 +245,7 @@ impl<B: BlobService + 'static> tokio::io::AsyncSeek for Reader<B> {
|
||||||
|
|
||||||
let this = &mut *self;
|
let this = &mut *self;
|
||||||
if this.seeking {
|
if this.seeking {
|
||||||
return Err(io::Error::new(io::ErrorKind::Other, "Already seeking"));
|
return Err(io::Error::other("Already seeking"));
|
||||||
}
|
}
|
||||||
this.seeking = true;
|
this.seeking = true;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -200,7 +200,7 @@ impl PathInfoService for BigtablePathInfoService {
|
||||||
let mut response = client
|
let mut response = client
|
||||||
.read_rows(request)
|
.read_rows(request)
|
||||||
.await
|
.await
|
||||||
.map_err(|e| Error::StorageError(format!("unable to read rows: {}", e)))?;
|
.map_err(|e| Error::StorageError(format!("unable to read rows: {e}")))?;
|
||||||
|
|
||||||
if response.len() != 1 {
|
if response.len() != 1 {
|
||||||
if response.len() > 1 {
|
if response.len() > 1 {
|
||||||
|
|
@ -241,7 +241,7 @@ impl PathInfoService for BigtablePathInfoService {
|
||||||
|
|
||||||
// Try to parse the value into a PathInfo message
|
// Try to parse the value into a PathInfo message
|
||||||
let path_info_proto = proto::PathInfo::decode(Bytes::from(cell.value))
|
let path_info_proto = proto::PathInfo::decode(Bytes::from(cell.value))
|
||||||
.map_err(|e| Error::StorageError(format!("unable to decode pathinfo proto: {}", e)))?;
|
.map_err(|e| Error::StorageError(format!("unable to decode pathinfo proto: {e}")))?;
|
||||||
|
|
||||||
let path_info = PathInfo::try_from(path_info_proto)
|
let path_info = PathInfo::try_from(path_info_proto)
|
||||||
.map_err(|e| Error::StorageError(format!("Invalid path info: {e}")))?;
|
.map_err(|e| Error::StorageError(format!("Invalid path info: {e}")))?;
|
||||||
|
|
@ -294,7 +294,7 @@ impl PathInfoService for BigtablePathInfoService {
|
||||||
],
|
],
|
||||||
})
|
})
|
||||||
.await
|
.await
|
||||||
.map_err(|e| Error::StorageError(format!("unable to mutate rows: {}", e)))?;
|
.map_err(|e| Error::StorageError(format!("unable to mutate rows: {e}")))?;
|
||||||
|
|
||||||
if resp.predicate_matched {
|
if resp.predicate_matched {
|
||||||
trace!("already existed")
|
trace!("already existed")
|
||||||
|
|
@ -321,12 +321,12 @@ impl PathInfoService for BigtablePathInfoService {
|
||||||
let mut rows = client
|
let mut rows = client
|
||||||
.stream_rows(request)
|
.stream_rows(request)
|
||||||
.await
|
.await
|
||||||
.map_err(|e| Error::StorageError(format!("unable to read rows: {}", e)))?.enumerate();
|
.map_err(|e| Error::StorageError(format!("unable to read rows: {e}")))?.enumerate();
|
||||||
|
|
||||||
use futures::stream::StreamExt;
|
use futures::stream::StreamExt;
|
||||||
|
|
||||||
while let Some((i, elem)) = rows.next().await {
|
while let Some((i, elem)) = rows.next().await {
|
||||||
let (row_key, mut cells) = elem.map_err(|e| Error::StorageError(format!("unable to stream row {}: {}", i, e)))?;
|
let (row_key, mut cells) = elem.map_err(|e| Error::StorageError(format!("unable to stream row {i}: {e}")))?;
|
||||||
let span = Span::current();
|
let span = Span::current();
|
||||||
span.record("row.key", bstr::BStr::new(&row_key).to_string());
|
span.record("row.key", bstr::BStr::new(&row_key).to_string());
|
||||||
|
|
||||||
|
|
@ -351,7 +351,7 @@ impl PathInfoService for BigtablePathInfoService {
|
||||||
|
|
||||||
// Try to parse the value into a PathInfo message.
|
// Try to parse the value into a PathInfo message.
|
||||||
let path_info_proto = proto::PathInfo::decode(Bytes::from(cell.value))
|
let path_info_proto = proto::PathInfo::decode(Bytes::from(cell.value))
|
||||||
.map_err(|e| Error::StorageError(format!("unable to decode pathinfo proto: {}", e)))?;
|
.map_err(|e| Error::StorageError(format!("unable to decode pathinfo proto: {e}")))?;
|
||||||
|
|
||||||
let path_info = PathInfo::try_from(path_info_proto).map_err(|e| Error::StorageError(format!("Invalid path info: {e}")))?;
|
let path_info = PathInfo::try_from(path_info_proto).map_err(|e| Error::StorageError(format!("Invalid path info: {e}")))?;
|
||||||
|
|
||||||
|
|
@ -449,7 +449,7 @@ impl TryFrom<url::Url> for BigtableParameters {
|
||||||
.append_pair("instance_name", &instance_name);
|
.append_pair("instance_name", &instance_name);
|
||||||
|
|
||||||
let params: BigtableParameters = serde_qs::from_str(url.query().unwrap_or_default())
|
let params: BigtableParameters = serde_qs::from_str(url.query().unwrap_or_default())
|
||||||
.map_err(|e| Error::InvalidRequest(format!("failed to parse parameters: {}", e)))?;
|
.map_err(|e| Error::InvalidRequest(format!("failed to parse parameters: {e}")))?;
|
||||||
|
|
||||||
Ok(params)
|
Ok(params)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -36,7 +36,7 @@ pub async fn from_addr(
|
||||||
) -> Result<Arc<dyn PathInfoService>, Box<dyn std::error::Error + Send + Sync>> {
|
) -> Result<Arc<dyn PathInfoService>, Box<dyn std::error::Error + Send + Sync>> {
|
||||||
#[allow(unused_mut)]
|
#[allow(unused_mut)]
|
||||||
let mut url =
|
let mut url =
|
||||||
Url::parse(uri).map_err(|e| Error::StorageError(format!("unable to parse url: {}", e)))?;
|
Url::parse(uri).map_err(|e| Error::StorageError(format!("unable to parse url: {e}")))?;
|
||||||
|
|
||||||
let path_info_service_config = with_registry(®, || {
|
let path_info_service_config = with_registry(®, || {
|
||||||
<DeserializeWithRegistry<Box<dyn ServiceBuilder<Output = dyn PathInfoService>>>>::try_from(
|
<DeserializeWithRegistry<Box<dyn ServiceBuilder<Output = dyn PathInfoService>>>>::try_from(
|
||||||
|
|
|
||||||
|
|
@ -212,7 +212,7 @@ where
|
||||||
&narinfo.ca,
|
&narinfo.ca,
|
||||||
)
|
)
|
||||||
.await
|
.await
|
||||||
.map_err(|e| io::Error::new(io::ErrorKind::Other, e))?;
|
.map_err(io::Error::other)?;
|
||||||
|
|
||||||
// ensure the ingested narhash and narsize do actually match.
|
// ensure the ingested narhash and narsize do actually match.
|
||||||
if narinfo.nar_size != nar_size {
|
if narinfo.nar_size != nar_size {
|
||||||
|
|
|
||||||
|
|
@ -31,7 +31,7 @@ async fn single_file_missing_blob(
|
||||||
crate::nar::RenderError::NARWriterError(e) => {
|
crate::nar::RenderError::NARWriterError(e) => {
|
||||||
assert_eq!(io::ErrorKind::NotFound, e.kind());
|
assert_eq!(io::ErrorKind::NotFound, e.kind());
|
||||||
}
|
}
|
||||||
_ => panic!("unexpected error: {:?}", e),
|
_ => panic!("unexpected error: {e:?}"),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -60,10 +60,10 @@ async fn seekable(
|
||||||
(Ok(_), Err(_)) => panic!("creating reader should have failed but succeeded"),
|
(Ok(_), Err(_)) => panic!("creating reader should have failed but succeeded"),
|
||||||
(Ok(_), Ok(Err(_))) => panic!("creating reader should have failed but succeeded"),
|
(Ok(_), Ok(Err(_))) => panic!("creating reader should have failed but succeeded"),
|
||||||
(Err(err), Ok(Ok(_))) => {
|
(Err(err), Ok(Ok(_))) => {
|
||||||
panic!("creating reader should have succeeded but failed: {}", err)
|
panic!("creating reader should have succeeded but failed: {err}")
|
||||||
}
|
}
|
||||||
(Err(reader_err), Err(expected_err)) => {
|
(Err(reader_err), Err(expected_err)) => {
|
||||||
assert_eq!(format!("{}", reader_err), format!("{}", expected_err));
|
assert_eq!(format!("{reader_err}"), format!("{}", expected_err));
|
||||||
}
|
}
|
||||||
(Err(reader_err), Ok(Err(expected_err))) => {
|
(Err(reader_err), Ok(Err(expected_err))) => {
|
||||||
let crate::nar::RenderError::NARWriterError(e) = reader_err else {
|
let crate::nar::RenderError::NARWriterError(e) = reader_err else {
|
||||||
|
|
|
||||||
|
|
@ -30,9 +30,9 @@ async fn read_to_end(
|
||||||
|
|
||||||
match (reader_result, test_output) {
|
match (reader_result, test_output) {
|
||||||
(Ok(_), Err(_)) => panic!("creating reader should have failed but succeeded"),
|
(Ok(_), Err(_)) => panic!("creating reader should have failed but succeeded"),
|
||||||
(Err(err), Ok(_)) => panic!("creating reader should have succeeded but failed: {}", err),
|
(Err(err), Ok(_)) => panic!("creating reader should have succeeded but failed: {err}"),
|
||||||
(Err(reader_err), Err(expected_err)) => {
|
(Err(reader_err), Err(expected_err)) => {
|
||||||
assert_eq!(format!("{}", reader_err), format!("{}", expected_err));
|
assert_eq!(format!("{reader_err}"), format!("{}", expected_err));
|
||||||
}
|
}
|
||||||
(Ok(mut reader), Ok(expected_read_result)) => {
|
(Ok(mut reader), Ok(expected_read_result)) => {
|
||||||
let mut buf: Vec<u8> = vec![];
|
let mut buf: Vec<u8> = vec![];
|
||||||
|
|
@ -41,7 +41,7 @@ async fn read_to_end(
|
||||||
match (read_result, expected_read_result) {
|
match (read_result, expected_read_result) {
|
||||||
(Ok(_), Err(_)) => panic!("read_to_end should have failed but succeeded"),
|
(Ok(_), Err(_)) => panic!("read_to_end should have failed but succeeded"),
|
||||||
(Err(err), Ok(_)) => {
|
(Err(err), Ok(_)) => {
|
||||||
panic!("read_to_end should have succeeded but failed: {}", err)
|
panic!("read_to_end should have succeeded but failed: {err}")
|
||||||
}
|
}
|
||||||
(Err(read_err), Err(expected_read_err)) => {
|
(Err(read_err), Err(expected_read_err)) => {
|
||||||
assert_eq!(read_err.kind(), expected_read_err);
|
assert_eq!(read_err.kind(), expected_read_err);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue