From 3919eaa8a829174102c3404693aaec0b6df0ef37 Mon Sep 17 00:00:00 2001 From: Jordan Webb Date: Wed, 10 Jul 2024 14:52:11 -0500 Subject: [PATCH] Add `arch` as a parameter to `package_meta` Without this, `package_meta` is unable to distinguish between copies of the same package installed for different architectures; for example, many systems need both the `x86_64` and `i686` version of glibc. --- rpmostree-cxxrs.cxx | 5 +++-- rust/src/container.rs | 4 +++- rust/src/lib.rs | 2 +- src/libpriv/rpmostree-refts.cxx | 26 +++++++++++++++----------- src/libpriv/rpmostree-refts.h | 2 +- tests/compose-image.sh | 1 + 6 files changed, 24 insertions(+), 16 deletions(-) diff --git a/rpmostree-cxxrs.cxx b/rpmostree-cxxrs.cxx index e118039c5b..649d1b7b8c 100644 --- a/rpmostree-cxxrs.cxx +++ b/rpmostree-cxxrs.cxx @@ -3246,15 +3246,16 @@ extern "C" ::rust::repr::PtrLen rpmostreecxx$cxxbridge1$RpmTs$package_meta (::rpmostreecxx::RpmTs const &self, ::rust::Str name, + ::rust::Str arch, ::rpmostreecxx::PackageMeta **return$) noexcept { ::std::unique_ptr< ::rpmostreecxx::PackageMeta> (::rpmostreecxx::RpmTs::*package_meta$) ( - ::rust::Str) const + ::rust::Str, ::rust::Str) const = &::rpmostreecxx::RpmTs::package_meta; ::rust::repr::PtrLen throw$; ::rust::behavior::trycatch ( [&] { - new (return$)::rpmostreecxx::PackageMeta *((self.*package_meta$) (name).release ()); + new (return$)::rpmostreecxx::PackageMeta *((self.*package_meta$) (name, arch).release ()); throw$.ptr = nullptr; }, ::rust::detail::Fail (throw$)); diff --git a/rust/src/container.rs b/rust/src/container.rs index 5a14c7b037..ab9f59f499 100644 --- a/rust/src/container.rs +++ b/rust/src/container.rs @@ -275,8 +275,10 @@ pub fn container_encapsulate(args: Vec) -> CxxResult<()> { for pkg in pkglist.iter() { let name = pkg.child_value(0); let name = name.str().unwrap(); + let arch = pkg.child_value(4); + let arch = arch.str().unwrap(); let nevra = Rc::from(gv_nevra_to_string(&pkg).into_boxed_str()); - let pkgmeta = q.package_meta(name)?; + let pkgmeta = q.package_meta(name, arch)?; let buildtime = pkgmeta.buildtime(); if let Some((lowid, lowtime)) = lowest_change_time.as_mut() { if *lowtime > buildtime { diff --git a/rust/src/lib.rs b/rust/src/lib.rs index e7fcc67e37..56d8b57fa3 100644 --- a/rust/src/lib.rs +++ b/rust/src/lib.rs @@ -914,7 +914,7 @@ pub mod ffi { fn rpmdb_package_name_list(dfd: i32, path: String) -> Result>; // Methods on RpmTs - fn package_meta(self: &RpmTs, name: &str) -> Result>; + fn package_meta(self: &RpmTs, name: &str, arch: &str) -> Result>; // Methods on PackageMeta fn size(self: &PackageMeta) -> u64; diff --git a/src/libpriv/rpmostree-refts.cxx b/src/libpriv/rpmostree-refts.cxx index 46f636212b..735252d38f 100644 --- a/src/libpriv/rpmostree-refts.cxx +++ b/src/libpriv/rpmostree-refts.cxx @@ -150,9 +150,10 @@ RpmTs::RpmTs (RpmOstreeRefTs *ts) { _ts = ts; } RpmTs::~RpmTs () { rpmostree_refts_unref (_ts); } std::unique_ptr -RpmTs::package_meta (const rust::Str name) const +RpmTs::package_meta (const rust::Str name, const rust::Str arch) const { auto name_c = std::string (name); + auto arch_c = std::string (arch); g_auto (rpmdbMatchIterator) mi = rpmtsInitIterator (_ts->ts, RPMDBI_NAME, name_c.c_str (), 0); if (mi == NULL) { @@ -163,18 +164,21 @@ RpmTs::package_meta (const rust::Str name) const std::unique_ptr retval; while ((h = rpmdbNextIterator (mi)) != NULL) { - // TODO: Somehow we get two `libgcc-8.5.0-10.el8.x86_64` in current RHCOS, I don't - // understand that. - if (retval != nullptr) + if (strcmp (headerGetString (h, RPMTAG_ARCH), arch_c.c_str ()) == 0) { - auto nevra = header_get_nevra (h); - g_autofree char *buf - = g_strdup_printf ("Multiple installed '%s' (%s, %s)", name_c.c_str (), - retval->nevra ().c_str (), nevra.c_str ()); - throw std::runtime_error (buf); + // TODO: Somehow we get two `libgcc-8.5.0-10.el8.x86_64` in current RHCOS, I don't + // understand that. + if (retval != nullptr) + { + auto nevra = header_get_nevra (h); + g_autofree char *buf + = g_strdup_printf ("Multiple installed '%s' (%s, %s)", name_c.c_str (), + retval->nevra ().c_str (), nevra.c_str ()); + throw std::runtime_error (buf); + } + + retval = std::make_unique (h); } - - retval = std::make_unique (h); } if (retval == nullptr) g_assert_not_reached (); diff --git a/src/libpriv/rpmostree-refts.h b/src/libpriv/rpmostree-refts.h index a3e820871e..2af1cc7d8a 100644 --- a/src/libpriv/rpmostree-refts.h +++ b/src/libpriv/rpmostree-refts.h @@ -77,7 +77,7 @@ class RpmTs RpmTs (::RpmOstreeRefTs *ts); ~RpmTs (); rpmts get_ts () const; - std::unique_ptr package_meta (const rust::Str package) const; + std::unique_ptr package_meta (const rust::Str name, const rust::Str arch) const; private: ::RpmOstreeRefTs *_ts; diff --git a/tests/compose-image.sh b/tests/compose-image.sh index dea8d72db8..5612906adc 100755 --- a/tests/compose-image.sh +++ b/tests/compose-image.sh @@ -39,6 +39,7 @@ packages: - vim-minimal - coreutils - dnf dnf-yum + - glibc glibc.i686 - sudo repos: - fedora # Intentially using frozen GA repo