Skip to content

Commit 68265f8

Browse files
committed
fix(deps): Adapt code to breaking dependency changes
Several of the Renovate-bumped dependencies have breaking API changes that need code fixes, and two bumps are incompatible with the rest of the dependency tree and need to be reverted. sha2 0.11: Removed the "std" feature (no longer exists) and dropped the std::io::Write impl on Sha256. Added a DigestWrite<D> wrapper in composefs::util to bridge the gap for SplitStreamReader::cat() callers. rand 0.10: sample_iter() and random_range() moved from Rng to RngExt. Updated imports accordingly. toml 1.0: from_str() now requires the "serde" feature; added it. oci-spec 0.9: Reverted to 0.8 because containers-image-proxy 0.9.2 depends on oci-spec 0.8, creating incompatible types across the dependency boundary. fuser 0.17: Reverted to 0.15.1 because the Filesystem trait now requires Send + Sync, which would need significant architectural changes (Rc -> Arc, RefCell -> RwLock) in composefs-fuse. Assisted-by: OpenCode (Claude Opus 4) Signed-off-by: Colin Walters <walters@verbum.org>
1 parent d56fff2 commit 68265f8

8 files changed

Lines changed: 37 additions & 8 deletions

File tree

crates/composefs-fuse/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,6 @@ version.workspace = true
1313
[dependencies]
1414
anyhow = { version = "1.0.98", default-features = false }
1515
composefs = { workspace = true }
16-
fuser = { version = "0.17.0", default-features = false, features = ["abi-7-31"] }
16+
fuser = { version = "0.15.1", default-features = false, features = ["abi-7-31"] }
1717
log = { version = "0.4.8", default-features = false }
1818
rustix = { version = "1.0.0", default-features = false, features = ["fs", "mount"] }

crates/composefs-http/src/lib.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ use std::{
1414

1515
use anyhow::{bail, Result};
1616
use bytes::Bytes;
17+
use composefs::util::DigestWrite;
1718
use indicatif::{ProgressBar, ProgressStyle};
1819
use reqwest::{Client, Response, Url};
1920
use sha2::{Digest, Sha256};
@@ -199,7 +200,7 @@ impl<ObjectID: FsVerityHashValue> Downloader<ObjectID> {
199200
// TODO: This can definitely happen in parallel...
200201
for (id, expected_checksum) in splitstreams {
201202
let mut reader = self.open_splitstream(&id)?;
202-
let mut context = Sha256::new();
203+
let mut context = DigestWrite(Sha256::new());
203204
reader.cat(&self.repo, &mut context)?;
204205
let measured_checksum = format!("sha256:{}", hex::encode(context.finalize()));
205206

crates/composefs-oci/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ composefs = { workspace = true }
1919
containers-image-proxy = { version = "0.9.2", default-features = false }
2020
hex = { version = "0.4.0", default-features = false }
2121
indicatif = { version = "0.18.0", default-features = false, features = ["tokio"] }
22-
oci-spec = { version = "0.9.0", default-features = false }
22+
oci-spec = { version = "0.8.0", default-features = false }
2323
rustix = { version = "1.0.0", features = ["fs"] }
2424
serde = { version = "1.0", default-features = false, features = ["derive"] }
2525
thiserror = { version = "2.0.0", default-features = false }

crates/composefs-oci/src/image.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
use std::{ffi::OsStr, os::unix::ffi::OsStrExt, rc::Rc};
1212

1313
use anyhow::{ensure, Context, Result};
14+
use composefs::util::DigestWrite;
1415
use fn_error_context::context;
1516
use sha2::{Digest, Sha256};
1617

@@ -117,7 +118,7 @@ pub fn create_filesystem<ObjectID: FsVerityHashValue>(
117118
// stream.
118119
let mut layer_stream =
119120
repo.open_stream("", Some(layer_verity), Some(TAR_LAYER_CONTENT_TYPE))?;
120-
let mut context = Sha256::new();
121+
let mut context = DigestWrite(Sha256::new());
121122
layer_stream.cat(repo, &mut context)?;
122123
let content_hash = format!("sha256:{}", hex::encode(context.finalize()));
123124
ensure!(content_hash == *diff_id, "Layer has incorrect checksum");

crates/composefs-setup-root/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ env_logger = { version = "0.11.0", default-features = false }
2525
hex = { version = "0.4.3", default-features = false }
2626
rustix = { version = "1.0.0", default-features = false }
2727
serde = { version = "1.0.145", default-features = false, features = ["derive"] }
28-
toml = { version = "1.0.0", default-features = false, features = ["parse"] }
28+
toml = { version = "1.0.0", default-features = false, features = ["parse", "serde"] }
2929

3030
[dev-dependencies]
3131
similar-asserts = "1.7.0"

crates/composefs/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ hex = { version = "0.4.0", default-features = false, features = ["std"] }
2424
log = { version = "0.4.8", default-features = false }
2525
once_cell = { version = "1.21.3", default-features = false, features = ["std"] }
2626
rustix = { version = "1.0.0", default-features = false, features = ["fs", "mount", "process", "std"] }
27-
sha2 = { version = "0.11.0", default-features = false, features = ["std"] }
27+
sha2 = { version = "0.11.0", default-features = false }
2828
thiserror = { version = "2.0.0", default-features = false }
2929
tokio = { version = "1.24.2", default-features = false, features = ["macros", "process", "io-util", "rt-multi-thread", "sync"] }
3030
tempfile = { version = "3.8.0", optional = true, default-features = false }

crates/composefs/src/fsverity/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -261,7 +261,7 @@ mod tests {
261261
use composefs_ioctls::test_utils_pub::CommandExt;
262262

263263
use once_cell::sync::Lazy;
264-
use rand::Rng;
264+
use rand::RngExt;
265265
use rustix::{
266266
fd::OwnedFd,
267267
fs::{open, Mode, OFlags},

crates/composefs/src/util.rs

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@
44
//! I/O utilities for reading data streams, SHA256 digest parsing, and
55
//! filesystem operations like atomic symlink replacement.
66
7-
use rand::{distr::Alphanumeric, Rng};
7+
use rand::{distr::Alphanumeric, RngExt};
8+
use sha2::Digest;
89
use std::{
910
io::{Error, ErrorKind, Read, Result},
1011
os::{
@@ -20,6 +21,32 @@ use rustix::{
2021
};
2122
use tokio::io::{AsyncRead, AsyncReadExt};
2223

24+
/// Adapts a [`sha2::Digest`] hasher to implement [`std::io::Write`].
25+
///
26+
/// sha2 0.11 removed its `std::io::Write` impl. This wrapper bridges
27+
/// the gap so that digest hashers can still be used with APIs that
28+
/// accept `impl Write` (e.g. [`SplitStreamReader::cat`]).
29+
#[derive(Debug)]
30+
pub struct DigestWrite<D: Digest>(pub D);
31+
32+
impl<D: Digest> std::io::Write for DigestWrite<D> {
33+
fn write(&mut self, buf: &[u8]) -> Result<usize> {
34+
self.0.update(buf);
35+
Ok(buf.len())
36+
}
37+
38+
fn flush(&mut self) -> Result<()> {
39+
Ok(())
40+
}
41+
}
42+
43+
impl<D: Digest> DigestWrite<D> {
44+
/// Consumes the wrapper and returns the computed digest.
45+
pub fn finalize(self) -> sha2::digest::Output<D> {
46+
self.0.finalize()
47+
}
48+
}
49+
2350
/// Formats a string like "/proc/self/fd/3" for the given fd. This can be used to work with kernel
2451
/// APIs that don't directly accept file descriptors.
2552
///

0 commit comments

Comments
 (0)