diff --git a/rust/src/extensions.rs b/rust/src/extensions.rs index 349c2f1283..5abccf4708 100644 --- a/rust/src/extensions.rs +++ b/rust/src/extensions.rs @@ -8,7 +8,7 @@ use anyhow::{bail, Context, Result}; use openat_ext::OpenatDirExt; -use serde_derive::Deserialize; +use serde_derive::{Deserialize, Serialize}; use std::collections::HashMap; use crate::cxxrsutil::*; @@ -17,17 +17,19 @@ use crate::utils; const RPMOSTREE_EXTENSIONS_STATE_FILE: &str = ".rpm-ostree-state-chksum"; -#[derive(Deserialize, Debug)] +#[derive(Serialize, Deserialize, Debug)] #[serde(rename_all = "kebab-case")] pub struct Extensions { extensions: HashMap, } -#[derive(Deserialize, Debug)] +#[derive(Serialize, Deserialize, Debug)] #[serde(rename_all = "kebab-case")] pub struct Extension { packages: Vec, + #[serde(skip_serializing_if = "Option::is_none")] architectures: Option>, + #[serde(skip_serializing_if = "Option::is_none")] match_base_evr: Option, } @@ -107,6 +109,15 @@ impl Extensions { .write_file_contents(RPMOSTREE_EXTENSIONS_STATE_FILE, 0o644, chksum) .with_context(|| format!("updating state file {}", RPMOSTREE_EXTENSIONS_STATE_FILE))?) } + + pub(crate) fn serialize_to_dir(&self, output_dir: &str) -> CxxResult<()> { + let output_dir = openat::Dir::open(output_dir)?; + Ok(output_dir + .write_file_with("extensions.json", 0o644, |w| -> Result<_> { + Ok(serde_json::to_writer_pretty(w, self)?) + }) + .context("while serializing")?) + } } #[cfg(test)] diff --git a/rust/src/lib.rs b/rust/src/lib.rs index c90be69169..d01fa89d32 100644 --- a/rust/src/lib.rs +++ b/rust/src/lib.rs @@ -196,6 +196,7 @@ mod ffi { fn get_packages(&self) -> Vec; fn state_checksum_changed(&self, chksum: &str, output_dir: &str) -> Result; fn update_state_checksum(&self, chksum: &str, output_dir: &str) -> Result<()>; + fn serialize_to_dir(&self, output_dir: &str) -> Result<()>; } // rpmutils.rs diff --git a/src/app/rpmostree-compose-builtin-tree.cxx b/src/app/rpmostree-compose-builtin-tree.cxx index 80eb7efef0..fa07fb8dbf 100644 --- a/src/app/rpmostree-compose-builtin-tree.cxx +++ b/src/app/rpmostree-compose-builtin-tree.cxx @@ -1612,6 +1612,7 @@ rpmostree_compose_builtin_extensions (int argc, } extensions->update_state_checksum (state_checksum, opt_extensions_output_dir); + extensions->serialize_to_dir (opt_extensions_output_dir); if (!process_touch_if_changed (error)) return FALSE; diff --git a/tests/compose/test-basic-unified.sh b/tests/compose/test-basic-unified.sh index 7baf949d6b..0578eb2392 100755 --- a/tests/compose/test-basic-unified.sh +++ b/tests/compose/test-basic-unified.sh @@ -95,6 +95,11 @@ extensions: packages: - dodo - solitaire + another-arch: + packages: + - nonexistent + architectures: + - badarch EOF # we don't actually need root here, but in CI the cache may be in a qcow2 and @@ -106,6 +111,9 @@ runasroot rpm-ostree compose extensions --repo=${repo} \ ls extensions/{dodo-1.0,dodo-base-1.0,solitaire-1.0}-*.rpm test -f extensions-changed +assert_jq extensions/extensions.json \ + '.extensions|length == 1' \ + '.extensions["extinct-birds"]' echo "ok extensions" rm extensions-changed