diff --git a/Cargo.lock b/Cargo.lock index 094df739e..cd2a8aadc 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -354,6 +354,18 @@ dependencies = [ "serde", ] +[[package]] +name = "canon-json" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b43fa751f9635eb2183e5e7f3d29489507e0b42454bb69a992fcff7e1b310e29" +dependencies = [ + "serde", + "serde_derive", + "serde_json", + "thiserror 2.0.12", +] + [[package]] name = "cap-primitives" version = "3.4.2" @@ -532,12 +544,12 @@ dependencies = [ "anyhow", "async-compression", "clap", - "containers-image-proxy", + "containers-image-proxy 0.7.0", "env_logger 0.11.6", "hex", "indicatif", "log", - "oci-spec", + "oci-spec 0.7.1", "regex-automata 0.4.9", "rustix 1.0.3", "serde", @@ -565,6 +577,26 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "const_format" +version = "0.2.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "126f97965c8ad46d6d9163268ff28432e8f6a1196a55578867832e3049df63dd" +dependencies = [ + "const_format_proc_macros", +] + +[[package]] +name = "const_format_proc_macros" +version = "0.2.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d57c2eccfb16dbac1f4e61e206105db5820c9d26c3c472bc17c774259ef7744" +dependencies = [ + "proc-macro2", + "quote", + "unicode-xid", +] + [[package]] name = "containers-image-proxy" version = "0.7.0" @@ -574,7 +606,7 @@ dependencies = [ "cap-std-ext", "fn-error-context", "futures-util", - "oci-spec", + "oci-spec 0.7.1", "rustix 0.38.44", "semver", "serde", @@ -584,6 +616,25 @@ dependencies = [ "tracing", ] +[[package]] +name = "containers-image-proxy" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9953374bea7d415048415d1f871ba974897209ba0c14d3c665d4a41bdc15628d" +dependencies = [ + "cap-std-ext", + "futures-util", + "itertools", + "oci-spec 0.8.1", + "rustix 1.0.3", + "semver", + "serde", + "serde_json", + "thiserror 1.0.69", + "tokio", + "tracing", +] + [[package]] name = "convert_case" version = "0.7.1" @@ -1293,6 +1344,15 @@ version = "1.70.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" +[[package]] +name = "itertools" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285" +dependencies = [ + "either", +] + [[package]] name = "itoa" version = "1.0.14" @@ -1612,40 +1672,46 @@ dependencies = [ "regex", "serde", "serde_json", - "strum", - "strum_macros", + "strum 0.26.3", + "strum_macros 0.26.4", + "thiserror 2.0.12", +] + +[[package]] +name = "oci-spec" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57e9beda9d92fac7bf4904c34c83340ef1024159faee67179a04e0277523da33" +dependencies = [ + "const_format", + "derive_builder", + "getset", + "regex", + "serde", + "serde_json", + "strum 0.27.1", + "strum_macros 0.27.1", "thiserror 2.0.12", ] [[package]] name = "ocidir" -version = "0.3.1" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "296a7c4945df5df933582eefaad6d90d16f3e7162f42e6837985bce745d3b5af" +checksum = "2ca884bf1922890f5fb3c48bbe92b450781ddb4754a4efd6b2dd1667730f9dab" dependencies = [ "camino", + "canon-json", "cap-std-ext", "chrono", "flate2", "hex", - "oci-spec", - "olpc-cjson", + "oci-spec 0.8.1", "openssl", "serde", "serde_json", "tar", - "thiserror 1.0.69", -] - -[[package]] -name = "olpc-cjson" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "696183c9b5fe81a7715d074fd632e8bd46f4ccc0231a3ed7fc580a80de5f7083" -dependencies = [ - "serde", - "serde_json", - "unicode-normalization", + "thiserror 2.0.12", ] [[package]] @@ -1735,7 +1801,7 @@ dependencies = [ "clap_mangen", "comfy-table", "composefs", - "containers-image-proxy", + "containers-image-proxy 0.8.0", "flate2", "fn-error-context", "futures-util", @@ -1748,7 +1814,6 @@ dependencies = [ "libc", "libsystemd", "ocidir", - "olpc-cjson", "openssl", "ostree", "ostree-ext", @@ -2353,6 +2418,12 @@ version = "0.26.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8fec0f0aef304996cf250b31b5a10dee7980c85da9d759361292b8bca5a18f06" +[[package]] +name = "strum" +version = "0.27.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f64def088c51c9510a8579e3c5d67c65349dcf755e5479ad3d010aa6454e2c32" + [[package]] name = "strum_macros" version = "0.26.4" @@ -2366,6 +2437,19 @@ dependencies = [ "syn 2.0.87", ] +[[package]] +name = "strum_macros" +version = "0.27.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c77a8c5abcaf0f9ce05d62342b7d298c346515365c36b673df4ebe3ced01fde8" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "rustversion", + "syn 2.0.87", +] + [[package]] name = "subtle" version = "2.6.1" @@ -2471,7 +2555,7 @@ dependencies = [ "fn-error-context", "indoc", "libtest-mimic", - "oci-spec", + "oci-spec 0.8.1", "rexpect", "rustix 1.0.3", "serde", @@ -2536,21 +2620,6 @@ version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e004df4c5f0805eb5f55883204a514cfa43a6d924741be29e871753a53d5565a" -[[package]] -name = "tinyvec" -version = "1.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "445e881f4f6d382d5f27c034e25eb92edd7c784ceab92a0937db7f2e9471b938" -dependencies = [ - "tinyvec_macros", -] - -[[package]] -name = "tinyvec_macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" - [[package]] name = "tokio" version = "1.41.1" @@ -2717,15 +2786,6 @@ version = "1.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe" -[[package]] -name = "unicode-normalization" -version = "0.1.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5033c97c4262335cded6d6fc3e5c18ab755e1a3dc96376350f3d8e9f009ad956" -dependencies = [ - "tinyvec", -] - [[package]] name = "unicode-segmentation" version = "1.12.0" @@ -2744,6 +2804,12 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1fc81956842c57dac11422a97c3b8195a1ff727f06e85c84ed2e8aa277c9a0fd" +[[package]] +name = "unicode-xid" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" + [[package]] name = "unsafe-libyaml" version = "0.2.11" diff --git a/ostree-ext/Cargo.toml b/ostree-ext/Cargo.toml index e61eb8b24..1ceeff21f 100644 --- a/ostree-ext/Cargo.toml +++ b/ostree-ext/Cargo.toml @@ -9,10 +9,7 @@ repository = "https://github.com/ostreedev/ostree-rs-ext" version = "0.15.3" [dependencies] -# Note that we re-export the oci-spec types -# that are exported by this crate, so when bumping -# semver here you must also bump our semver. -containers-image-proxy = "0.7.0" +containers-image-proxy = "0.8.0" # We re-export this library too. ostree = { features = ["v2025_2"], version = "0.20" } @@ -22,7 +19,6 @@ bootc-utils = { path = "../utils" } camino = { workspace = true, features = ["serde1"] } composefs = { git = "https://github.com/containers/composefs-rs", rev = "821eeae93e48f1ee381c49b8cd4d22fda92d27a2" } chrono = { workspace = true } -olpc-cjson = "0.1.1" clap = { workspace = true, features = ["derive","cargo"] } clap_mangen = { workspace = true, optional = true } comfy-table = "7.1.1" @@ -37,7 +33,7 @@ indicatif = { workspace = true } libc = { workspace = true } libsystemd = "0.7.0" openssl = { workspace = true } -ocidir = "0.3.0" +ocidir = "0.4.0" pin-project = "1.0" regex = "1.5.4" rustix = { workspace = true, features = ["fs", "process"] } diff --git a/ostree-ext/src/container/encapsulate.rs b/ostree-ext/src/container/encapsulate.rs index 39a0ee030..e7c39b706 100644 --- a/ostree-ext/src/container/encapsulate.rs +++ b/ostree-ext/src/container/encapsulate.rs @@ -236,7 +236,7 @@ fn build_oci( &mut labels, )?; - let mut manifest = ocidir::new_empty_manifest().build().unwrap(); + let mut manifest = writer.new_empty_manifest()?.build().unwrap(); let chunking = opts .contentmeta @@ -355,7 +355,7 @@ async fn build_impl( } let ocidir = Dir::open_ambient_dir(path, cap_std::ambient_authority()) .with_context(|| format!("Opening {path}"))?; - let mut ocidir = OciDir::ensure(&ocidir).context("Opening OCI")?; + let mut ocidir = OciDir::ensure(ocidir).context("Opening OCI")?; build_oci(repo, ostree_ref, &mut ocidir, tag, config, opts)?; None } else { @@ -363,7 +363,7 @@ async fn build_impl( let vartmp = Dir::open_ambient_dir("/var/tmp", cap_std::ambient_authority())?; cap_std_ext::cap_tempfile::tempdir_in(&vartmp)? }; - let mut ocidir = OciDir::ensure(&tempdir)?; + let mut ocidir = OciDir::ensure(tempdir.try_clone()?)?; // Minor TODO: refactor to avoid clone let authfile = opts.authfile.clone(); diff --git a/ostree-ext/src/container/store.rs b/ostree-ext/src/container/store.rs index c94424401..965e5d267 100644 --- a/ostree-ext/src/container/store.rs +++ b/ostree-ext/src/container/store.rs @@ -1435,7 +1435,7 @@ pub(crate) fn export_to_oci( new_config.history_mut().clear(); new_config.rootfs_mut().diff_ids_mut().clear(); - let mut dest_oci = ocidir::OciDir::ensure(dest_oci)?; + let mut dest_oci = ocidir::OciDir::ensure(dest_oci.try_clone()?)?; let opts = ExportOpts { skip_compression: opts.skip_compression, diff --git a/ostree-ext/src/container/update_detachedmeta.rs b/ostree-ext/src/container/update_detachedmeta.rs index f637d53a0..2ad02c382 100644 --- a/ostree-ext/src/container/update_detachedmeta.rs +++ b/ostree-ext/src/container/update_detachedmeta.rs @@ -41,12 +41,10 @@ pub async fn update_detached_metadata( // Open the temporary OCI directory. let tempsrc = Dir::open_ambient_dir(tempsrc_ref_path, cap_std::ambient_authority()) .context("Opening src")?; - let tempsrc = ocidir::OciDir::open(&tempsrc)?; + let tempsrc = ocidir::OciDir::open(tempsrc)?; // Load the manifest, platform, and config - let idx = tempsrc - .read_index()? - .ok_or(anyhow!("Reading image index from source"))?; + let idx = tempsrc.read_index()?; let manifest_descriptor = idx .manifests() .first() diff --git a/ostree-ext/src/fixture.rs b/ostree-ext/src/fixture.rs index b4e1e1408..13cbb9c97 100644 --- a/ostree-ext/src/fixture.rs +++ b/ostree-ext/src/fixture.rs @@ -973,7 +973,7 @@ impl NonOstreeFixture { // Create the src/ directory dir.create_dir_all(Self::SRCOCI)?; let src_oci = dir.open_dir(Self::SRCOCI)?; - let src_oci = ocidir::OciDir::ensure(&src_oci)?; + let src_oci = ocidir::OciDir::ensure(src_oci)?; dir.create_dir("dest")?; let destrepo = ostree::Repo::create_at_dir( @@ -1004,7 +1004,7 @@ impl NonOstreeFixture { }; let mut config = ImageConfigurationBuilder::default().build().unwrap(); - let mut manifest = ocidir::new_empty_manifest().build().unwrap(); + let mut manifest = self.src_oci.new_empty_manifest()?.build().unwrap(); let bw = self.src_oci.create_gzip_layer(None)?; let mut bw = tar::Builder::new(bw); @@ -1034,7 +1034,7 @@ impl NonOstreeFixture { manifest.set_config(config); self.src_oci .replace_with_single_manifest(manifest, oci_image::Platform::default())?; - let idx = self.src_oci.read_index()?.unwrap(); + let idx = self.src_oci.read_index()?; let descriptor = idx.manifests().first().unwrap(); Ok((imgref, descriptor.digest().to_owned())) diff --git a/ostree-ext/src/integrationtest.rs b/ostree-ext/src/integrationtest.rs index 3e6683250..2437074a3 100644 --- a/ostree-ext/src/integrationtest.rs +++ b/ostree-ext/src/integrationtest.rs @@ -67,11 +67,9 @@ where { let src = src.as_ref(); let src = Dir::open_ambient_dir(src, cap_std::ambient_authority())?; - let src = ocidir::OciDir::open(&src)?; + let src = ocidir::OciDir::open(src)?; - let idx = src - .read_index()? - .ok_or(anyhow!("Reading image index from source"))?; + let idx = src.read_index()?; let manifest_descriptor = idx .manifests() .first() diff --git a/ostree-ext/tests/it/main.rs b/ostree-ext/tests/it/main.rs index cfa1e1a8b..468595f10 100644 --- a/ostree-ext/tests/it/main.rs +++ b/ostree-ext/tests/it/main.rs @@ -689,12 +689,12 @@ async fn test_export_as_container_nonderived() -> Result<()> { name: format!("{}:exported-test", fixture.path.join(exported_ocidir_name)), }; fixture.dir.create_dir(exported_ocidir_name)?; - let ocidir = ocidir::OciDir::ensure(&fixture.dir.open_dir(exported_ocidir_name)?)?; + let ocidir = ocidir::OciDir::ensure(fixture.dir.open_dir(exported_ocidir_name)?)?; let exported = store::export(fixture.destrepo(), &src_imgref, &dest, None) .await .unwrap(); - let idx = ocidir.read_index()?.unwrap(); + let idx = ocidir.read_index()?; let desc = idx.manifests().first().unwrap(); let new_manifest: oci_image::ImageManifest = ocidir.read_json_blob(desc).unwrap(); @@ -740,12 +740,12 @@ async fn test_export_as_container_derived() -> Result<()> { name: format!("{}:exported-test", fixture.path.join(exported_ocidir_name)), }; fixture.dir.create_dir(exported_ocidir_name)?; - let ocidir = ocidir::OciDir::ensure(&fixture.dir.open_dir(exported_ocidir_name)?)?; + let ocidir = ocidir::OciDir::ensure(fixture.dir.open_dir(exported_ocidir_name)?)?; let exported = store::export(fixture.destrepo(), &derived_imgref, &dest, None) .await .unwrap(); - let idx = ocidir.read_index()?.unwrap(); + let idx = ocidir.read_index()?; let desc = idx.manifests().first().unwrap(); let new_manifest: oci_image::ImageManifest = ocidir.read_json_blob(desc).unwrap(); @@ -821,8 +821,8 @@ fn validate_chunked_structure(oci_path: &Utf8Path) -> Result<()> { use tar::EntryType::Link; let d = Dir::open_ambient_dir(oci_path, cap_std::ambient_authority())?; - let d = ocidir::OciDir::open(&d)?; - let idx = d.read_index()?.unwrap(); + let d = ocidir::OciDir::open(d)?; + let idx = d.read_index()?; let desc = idx.manifests().first().unwrap(); let manifest: oci_image::ImageManifest = d.read_json_blob(desc).unwrap(); @@ -1335,7 +1335,7 @@ async fn test_non_ostree() -> Result<()> { let imp = fixture.must_import(&imgref).await?; if imp.manifest_digest != src_digest { let src_manifest: oci_image::ImageManifest = { - let idx = fixture.src_oci.read_index()?.unwrap(); + let idx = fixture.src_oci.read_index()?; let manifest = idx .manifests() .iter() diff --git a/tests-integration/Cargo.toml b/tests-integration/Cargo.toml index 275a7b344..ccd94d09a 100644 --- a/tests-integration/Cargo.toml +++ b/tests-integration/Cargo.toml @@ -18,7 +18,7 @@ clap = { workspace = true, features = ["derive","cargo"] } fn-error-context = { workspace = true } indoc = { workspace = true } libtest-mimic = "0.8.0" -oci-spec = "0.7.0" +oci-spec = "0.8.0" rexpect = "0.5" rustix = { workspace = true } serde = { workspace = true, features = ["derive"] }