Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package libmodulemd for openSUSE:Factory 
checked in at 2026-03-06 18:17:46
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/libmodulemd (Old)
 and      /work/SRC/openSUSE:Factory/.libmodulemd.new.561 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "libmodulemd"

Fri Mar  6 18:17:46 2026 rev:20 rq:1336758 version:2.15.2

Changes:
--------
--- /work/SRC/openSUSE:Factory/libmodulemd/libmodulemd.changes  2024-05-16 
17:15:00.919574335 +0200
+++ /work/SRC/openSUSE:Factory/.libmodulemd.new.561/libmodulemd.changes 
2026-03-06 18:18:14.299274408 +0100
@@ -1,0 +2,24 @@
+Thu Mar  5 11:12:52 UTC 2026 - Dominique Leuenberger <[email protected]>
+
+- Update to version 2.15.2:
+  + module_index test now passes if RPM library is built without
+    bzip2 or xx compression support and libmodulemd is configured
+    to support decompression using the RPM library.
+- Changes from version 2.15.1:
+  + A new g_variant_store: assertion 'data != NULL' failed warning
+    added to GLib 2.84.1 when processing modulemd YAML documents
+    with /data/xmd field with an empty flow map ({}) value was
+    fixed.
+  + Building documentation now works with GLib 2.80.1 at the
+    expense of missing cross links from libmodulemd to GLib. If it
+    still fails you, you can disable building the documentation
+    with -Dwith_docs=false meson option.
+  + A number of warnings printed by recent Meson was reduced.
+- Add 89d4afb3.patch: tests: Adapt to glib 2.87.0
+- Add e33ecf1c.patch: tests: Adapt to pygobject 3.55.0
+- Drop upstream merged patches:
+  + 29c339a3.patch
+  + 9d280909.patch
+  + glib-2.80.2-glibdoc-path.patch
+
+-------------------------------------------------------------------

Old:
----
  29c339a3.patch
  9d280909.patch
  glib-2.80.2-glibdoc-path.patch
  modulemd-2.15.0.tar.xz

New:
----
  89d4afb3.patch
  e33ecf1c.patch
  modulemd-2.15.2.tar.xz

----------(Old B)----------
  Old:- Drop upstream merged patches:
  + 29c339a3.patch
  + 9d280909.patch
  Old:  + 29c339a3.patch
  + 9d280909.patch
  + glib-2.80.2-glibdoc-path.patch
  Old:  + 9d280909.patch
  + glib-2.80.2-glibdoc-path.patch
----------(Old E)----------

----------(New B)----------
  New:  + A number of warnings printed by recent Meson was reduced.
- Add 89d4afb3.patch: tests: Adapt to glib 2.87.0
- Add e33ecf1c.patch: tests: Adapt to pygobject 3.55.0
  New:- Add 89d4afb3.patch: tests: Adapt to glib 2.87.0
- Add e33ecf1c.patch: tests: Adapt to pygobject 3.55.0
- Drop upstream merged patches:
----------(New E)----------

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ libmodulemd.spec ++++++
--- /var/tmp/diff_new_pack.sZK0YM/_old  2026-03-06 18:18:15.119308490 +0100
+++ /var/tmp/diff_new_pack.sZK0YM/_new  2026-03-06 18:18:15.119308490 +0100
@@ -1,7 +1,7 @@
 #
 # spec file for package libmodulemd
 #
-# Copyright (c) 2024 SUSE LLC
+# Copyright (c) 2026 SUSE LLC and contributors
 # Copyright (c) 2020-2023 Neal Gompa <[email protected]>.
 #
 # All modifications and additions to the file contributed by third parties
@@ -19,7 +19,7 @@
 
 %global majorversion 2
 %global minorversion 15
-%global patchversion 0
+%global patchversion 2
 %global majorminorversion %{majorversion}.%{minorversion}
 %global nsversion %{majorversion}.0
 
@@ -37,9 +37,8 @@
 Group:          System/Packages
 URL:            https://github.com/fedora-modularity/libmodulemd
 Source0:        
%{url}/releases/download/%{libmodulemd_version}/modulemd-%{libmodulemd_version}.tar.xz
-Patch0:         
https://github.com/fedora-modularity/libmodulemd/commit/9d280909.patch
-Patch1:         
https://github.com/fedora-modularity/libmodulemd/commit/29c339a3.patch
-Patch2:         glib-2.80.2-glibdoc-path.patch
+Patch0:         
https://github.com/fedora-modularity/libmodulemd/commit/89d4afb3.patch
+Patch1:         
https://github.com/fedora-modularity/libmodulemd/commit/e33ecf1c.patch
 
 BuildRequires:  gcc
 BuildRequires:  glib2-doc

++++++ 89d4afb3.patch ++++++
++++ 2102 lines (skipped)

++++++ e33ecf1c.patch ++++++
>From e33ecf1cc15383b9563bc4cd9a6908277bf8039d Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Petr=20P=C3=ADsa=C5=99?= <[email protected]>
Date: Tue, 24 Feb 2026 13:35:17 +0100
Subject: [PATCH] tests: Adapt to pygobject 3.55.0

After upgrading pygobject from 3.54.5 to 3.55.2, Python tests
expecting a process failure on setting an immutable
(G_PARAM_CONSTRUCT_ONLY) property started to fail like this:

    Traceback (most recent call last):
      File 
"/home/test/libmodulemd-devel/redhat-linux-build/../modulemd/tests/ModulemdTests/defaults.py",
 line 114, in test_module_name
        self.assertProcessFailure(_set_module_name_to_none, defs)
        ~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "/home/test/libmodulemd-devel/modulemd/tests/ModulemdTests/base.py", 
line 60, in assertProcessFailure
        callable(*args)
        ~~~~~~~~^^^^^^^
      File 
"/home/test/libmodulemd-devel/redhat-linux-build/../modulemd/tests/ModulemdTests/defaults.py",
 line 43, in _set_module_name_to_none
        defs.props.module_name = None
        ^^^^^^^^^^^^^^^^^^^^^^
    TypeError: property 'module-name' can only be set in constructor

The cause was that pygobject-3.55.0 started to raise a Python
TypeError exception instead of calling Glib functions which would fail
on its own depending on Glib warning fatality and Glib version. An example:

    cat /tmp/test.py
    #!/usr/bin/python3

    import gi
    gi.require_version("Modulemd", "2.0")
    from gi.repository import Modulemd

    object = Modulemd.Defaults.new(Modulemd.DefaultsVersionEnum.LATEST, "foo")
    object.props.module_name = "bar"

Before:

    $ /tmp/test.py
    /tmp/test.py:8: Warning: g_object_set_is_valid_property: construct property 
"module-name" for object 'ModulemdDefaultsV1' can't be set after construction
      object.props.module_name = "bar"

After:

    $ /tmp/test.py
    Traceback (most recent call last):
      File "/tmp/test.py", line 8, in <module>
        object.props.module_name = "bar"
        ^^^^^^^^^^^^^^^^^^^^^^^^
    TypeError: property 'module-name' can only be set in constructor

That was an intentional change in pygobject
3b6e4804de4f26cfb9472666f18f44ac731d874c commit (gi: Factor out
pygi_set_property_gvalue_from_property_info). Probably an
optimization.

This patch adjusts the tests to pass if TypeError exception is raised
regardless of Glib warning fatality.

Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=2440570
---
 modulemd/tests/ModulemdTests/base.py          | 30 +++++++++++++++++++
 modulemd/tests/ModulemdTests/defaults.py      |  4 ++-
 modulemd/tests/ModulemdTests/profile.py       |  4 ++-
 modulemd/tests/ModulemdTests/servicelevel.py  |  2 +-
 .../tests/ModulemdTests/translationentry.py   |  2 +-
 5 files changed, 38 insertions(+), 4 deletions(-)

diff --git a/modulemd/tests/ModulemdTests/base.py 
b/modulemd/tests/ModulemdTests/base.py
index 55ac742b..16b90e0f 100644
--- a/modulemd/tests/ModulemdTests/base.py
+++ b/modulemd/tests/ModulemdTests/base.py
@@ -67,6 +67,36 @@ def assertProcessFailure(self, callable, *args):
             if os.WIFSIGNALED(status):
                 raise AssertionError("Child process was unexpectedly aborted")
 
+    def assertTypeExceptionOrProcessFailure(self, callable, *args):
+        """Calls the callable in a subprocess and checks that the process
+        raised a TypeError exception, or was killed depending on Glib warning
+        fatality.
+
+        Since pygobject-3.55.0 setting a G_PARAM_CONSTRUCT_ONLY property
+        raises a Python exception. Old pygobject continues down to Glib
+        which kills the process if Glib warnings a fatal, otherwise Glib
+        warning is printed and the code continues.
+        """
+        pid = os.fork()
+        if pid == 0:
+            try:
+                callable(*args)
+            except TypeError:
+                os._exit(1)
+            os._exit(0)
+        _, status = os.waitpid(pid, 0)
+        if os.WIFEXITED(status) and os.WEXITSTATUS(status) == 1:
+            return
+        if self.warnings_fatal:
+            if not os.WIFSIGNALED(status):
+                raise AssertionError(
+                    "Child process did not raise TypeError "
+                    "exception or was not aborted"
+                )
+        else:
+            if os.WIFSIGNALED(status):
+                raise AssertionError("Child process was unexpectedly aborted")
+
     @property
     def warnings_fatal(self):
         gdebug = os.getenv("G_DEBUG", "").split(",")
diff --git a/modulemd/tests/ModulemdTests/defaults.py 
b/modulemd/tests/ModulemdTests/defaults.py
index 3a1b9fe5..2f2ec023 100644
--- a/modulemd/tests/ModulemdTests/defaults.py
+++ b/modulemd/tests/ModulemdTests/defaults.py
@@ -111,7 +111,9 @@ def test_module_name(self):
         assert defs.get_module_name() == "foo"
 
         # Ensure we cannot set the module_name
-        self.assertProcessFailure(_set_module_name_to_none, defs)
+        self.assertTypeExceptionOrProcessFailure(
+            _set_module_name_to_none, defs
+        )
 
     def test_modified(self):
         defs = Modulemd.Defaults.new(
diff --git a/modulemd/tests/ModulemdTests/profile.py 
b/modulemd/tests/ModulemdTests/profile.py
index 765c57d4..f8c7b931 100644
--- a/modulemd/tests/ModulemdTests/profile.py
+++ b/modulemd/tests/ModulemdTests/profile.py
@@ -94,7 +94,9 @@ def test_get_name(self):
         assert p.get_name() == "testprofile"
         assert p.props.name == "testprofile"
 
-        self.assertProcessFailure(_set_props_name, p, "notadrill")
+        self.assertTypeExceptionOrProcessFailure(
+            _set_props_name, p, "notadrill"
+        )
 
     def test_get_set_description(self):
         p = Modulemd.Profile(name="testprofile")
diff --git a/modulemd/tests/ModulemdTests/servicelevel.py 
b/modulemd/tests/ModulemdTests/servicelevel.py
index fc9c648b..71289eb3 100644
--- a/modulemd/tests/ModulemdTests/servicelevel.py
+++ b/modulemd/tests/ModulemdTests/servicelevel.py
@@ -103,7 +103,7 @@ def test_get_name(self):
         assert sl.props.name == "foo"
 
         # This property is not writable, make sure it fails to attempt it
-        self.assertProcessFailure(_set_props_name, sl, "bar")
+        self.assertTypeExceptionOrProcessFailure(_set_props_name, sl, "bar")
 
     def test_get_set_eol(self):
         sl = Modulemd.ServiceLevel.new("foo")
diff --git a/modulemd/tests/ModulemdTests/translationentry.py 
b/modulemd/tests/ModulemdTests/translationentry.py
index 9fce4435..685349e2 100644
--- a/modulemd/tests/ModulemdTests/translationentry.py
+++ b/modulemd/tests/ModulemdTests/translationentry.py
@@ -172,7 +172,7 @@ def test_get_locale(self):
         assert te.get_locale() == "en_US"
         assert te.props.locale == "en_US"
 
-        self.assertProcessFailure(_set_locale, te)
+        self.assertTypeExceptionOrProcessFailure(_set_locale, te)
 
     def test_get_set_summary(self):
         te = Modulemd.TranslationEntry(locale="en_US")

++++++ modulemd-2.15.0.tar.xz -> modulemd-2.15.2.tar.xz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/modulemd-2.15.0/.ci/archlinux/Dockerfile.deps.tmpl 
new/modulemd-2.15.2/.ci/archlinux/Dockerfile.deps.tmpl
--- old/modulemd-2.15.0/.ci/archlinux/Dockerfile.deps.tmpl      2023-05-10 
14:50:24.000000000 +0200
+++ new/modulemd-2.15.2/.ci/archlinux/Dockerfile.deps.tmpl      2025-06-18 
09:27:57.000000000 +0200
@@ -5,6 +5,7 @@
 RUN pacman -Syu --needed --noconfirm \
     base-devel \
     glib2 \
+    glib2-devel \
     glib2-docs \
     gobject-introspection \
     gtk-doc \
@@ -15,4 +16,4 @@
     python-six \
 && pacman -Scc --noconfirm
 
-RUN ln -sf /builddir/bindings/python/gi/overrides/Modulemd.py $(python3 -c 
"import gi; print(gi._overridesdir)")/Modulemd.py
+RUN ln -sf /builddir/bindings/python/gi/overrides/Modulemd.py $(python3 -c 
"import gi; import os; os.makedirs(gi._overridesdir, exist_ok=True); 
print(gi._overridesdir)")/Modulemd.py
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/modulemd-2.15.0/.ci/centos/Dockerfile.deps.tmpl 
new/modulemd-2.15.2/.ci/centos/Dockerfile.deps.tmpl
--- old/modulemd-2.15.0/.ci/centos/Dockerfile.deps.tmpl 2023-05-10 
14:50:24.000000000 +0200
+++ new/modulemd-2.15.2/.ci/centos/Dockerfile.deps.tmpl 2025-06-18 
09:27:57.000000000 +0200
@@ -5,7 +5,11 @@
 MAINTAINER Stephen Gallagher <[email protected]>
 
 RUN yum -y install epel-release \
-ifelse(eval(cosrelease >= 8), 1, `dnl
+ifelse(eval(cosrelease >= 9), 1, `dnl
+    && yum -y install dnf-plugins-core \
+    && yum config-manager --enable crb \
+')dnl
+ifelse(eval(cosrelease == 8), 1, `dnl
     && yum -y install dnf-plugins-core \
     && yum config-manager --enable powertools \
 ')dnl
@@ -25,15 +29,20 @@
         meson \
         ninja-build \
         pkgconfig \
+ifelse(eval(cosrelease < 9), 1, `dnl
         python2-devel \
         python2-six \
+        python36-devel \
+',`dnl
+        python3-devel \
+        python3-six \
+')dnl
 ifelse(eval(cosrelease < 8), 1, `dnl
         python-gobject-base \
         python36-gobject-base \
 ',`dnl
         python3-gobject-base \
 ')dnl
-        python36-devel \
         python3-rpm-macros \
         redhat-rpm-config \
         rpm-build \
@@ -42,4 +51,4 @@
         sudo \
         && yum -y clean all
 
-RUN ln -sf /builddir/bindings/python/gi/overrides/Modulemd.py $(python3 -c 
"import gi; print(gi._overridesdir)")/Modulemd.py
+RUN ln -sf /builddir/bindings/python/gi/overrides/Modulemd.py $(python3 -c 
"import gi; import os; os.makedirs(gi._overridesdir, exist_ok=True); 
print(gi._overridesdir)")/Modulemd.py
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/modulemd-2.15.0/.ci/ci-coverity.sh 
new/modulemd-2.15.2/.ci/ci-coverity.sh
--- old/modulemd-2.15.0/.ci/ci-coverity.sh      2023-05-10 14:50:24.000000000 
+0200
+++ new/modulemd-2.15.2/.ci/ci-coverity.sh      2025-06-18 09:27:57.000000000 
+0200
@@ -9,7 +9,7 @@
 set -x
 
 os=centos
-release=stream8
+release=stream9
 repository=quay.io/centos
 
 # Override the standard tests with the Coverity scan
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/modulemd-2.15.0/.ci/ci-docs.sh 
new/modulemd-2.15.2/.ci/ci-docs.sh
--- old/modulemd-2.15.0/.ci/ci-docs.sh  2023-05-10 14:50:24.000000000 +0200
+++ new/modulemd-2.15.2/.ci/ci-docs.sh  2025-06-18 09:27:57.000000000 +0200
@@ -10,7 +10,13 @@
 
 modulemd_version=${1:-latest}
 os=fedora
-release=latest
+# glib-2.79.0 available since Fedora ≥ 40 changed a documentation format
+# references in libmodulemd documentation do not resolve to glib
+# documentation. Use older Fedora release to have an on-line documentation
+# with the hyperlinks. See
+# <https://github.com/fedora-modularity/libmodulemd/pull/612>.
+#release=latest
+release=39
 repository=quay.io
 image=fedora/fedora:${release}
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/modulemd-2.15.0/.ci/fedora/get_fedora_deps.sh 
new/modulemd-2.15.2/.ci/fedora/get_fedora_deps.sh
--- old/modulemd-2.15.0/.ci/fedora/get_fedora_deps.sh   2023-05-10 
14:50:24.000000000 +0200
+++ new/modulemd-2.15.2/.ci/fedora/get_fedora_deps.sh   2025-06-18 
09:27:57.000000000 +0200
@@ -6,8 +6,12 @@
 SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
 pushd $SCRIPT_DIR
 
+# Work around a DNF5 bug with resetting tsflags
+# <https://github.com/rpm-software-management/dnf5/issues/1331>.
+sed -i -e 's/\<nodocs\>//' /etc/dnf/dnf.conf
+
 dnf -y --setopt=install_weak_deps=False --setopt=tsflags='' \
-       --nogpgcheck --skip-broken --quiet install \
+       --nogpgcheck --quiet install --skip-broken \
     python3-black \
     clang \
     clang-analyzer \
@@ -31,9 +35,6 @@
     packit \
     pkgconf \
     popt-devel \
-    python2-devel \
-    python2-six \
-    python2-gobject-base \
     python3-autopep8 \
     python3-devel \
     python3-GitPython \
@@ -54,6 +55,6 @@
 
 dnf -y clean all
 
-ln -sf /builddir/bindings/python/gi/overrides/Modulemd.py $(python3 -c "import 
gi; print(gi._overridesdir)")/Modulemd.py
+ln -sf /builddir/bindings/python/gi/overrides/Modulemd.py $(python3 -c "import 
gi; import os; os.makedirs(gi._overridesdir, exist_ok=True); 
print(gi._overridesdir)")/Modulemd.py
 
 popd
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/modulemd-2.15.0/.ci/mageia/Dockerfile.deps.tmpl 
new/modulemd-2.15.2/.ci/mageia/Dockerfile.deps.tmpl
--- old/modulemd-2.15.0/.ci/mageia/Dockerfile.deps.tmpl 2023-05-10 
14:50:24.000000000 +0200
+++ new/modulemd-2.15.2/.ci/mageia/Dockerfile.deps.tmpl 2025-06-18 
09:27:57.000000000 +0200
@@ -41,4 +41,4 @@
     wget \
     && dnf -y clean all
 
-RUN ln -sf /builddir/bindings/python/gi/overrides/Modulemd.py $(python3 -c 
"import gi; print(gi._overridesdir)")/Modulemd.py
+RUN ln -sf /builddir/bindings/python/gi/overrides/Modulemd.py $(python3 -c 
"import gi; import os; os.makedirs(gi._overridesdir, exist_ok=True); 
print(gi._overridesdir)")/Modulemd.py
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/modulemd-2.15.0/.ci/openmandriva/Dockerfile.deps.tmpl 
new/modulemd-2.15.2/.ci/openmandriva/Dockerfile.deps.tmpl
--- old/modulemd-2.15.0/.ci/openmandriva/Dockerfile.deps.tmpl   2023-05-10 
14:50:24.000000000 +0200
+++ new/modulemd-2.15.2/.ci/openmandriva/Dockerfile.deps.tmpl   2025-06-18 
09:27:57.000000000 +0200
@@ -14,15 +14,13 @@
     valgrind \
     wget \
     task-devel \
-    'pkgconfig(zlib)' \
+    'pkgconfig(glib-2.0)' \
     'pkgconfig(gobject-introspection-1.0)' \
+    'pkgconfig(rpm)' \
+    'pkgconfig(yaml-0.1)' \
     'python3dist(autopep8)' \
     'python3dist(pygobject)' \
-    'pkgconfig(yaml-0.1)' \
-    'pkgconfig(rpm)' \
-    magic-devel \
     git-core \
-    elinks \
     && dnf -y clean all
 
-RUN ln -sf /builddir/bindings/python/gi/overrides/Modulemd.py $(python3 -c 
"import gi; print(gi._overridesdir)")/Modulemd.py
+RUN ln -sf /builddir/bindings/python/gi/overrides/Modulemd.py $(python3 -c 
"import gi; import os; os.makedirs(gi._overridesdir, exist_ok=True); 
print(gi._overridesdir)")/Modulemd.py
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/modulemd-2.15.0/.ci/opensuse/Dockerfile.deps.tmpl 
new/modulemd-2.15.2/.ci/opensuse/Dockerfile.deps.tmpl
--- old/modulemd-2.15.0/.ci/opensuse/Dockerfile.deps.tmpl       2023-05-10 
14:50:24.000000000 +0200
+++ new/modulemd-2.15.2/.ci/opensuse/Dockerfile.deps.tmpl       2025-06-18 
09:27:57.000000000 +0200
@@ -34,4 +34,4 @@
     sudo \
     valgrind
 
-RUN ln -sf /builddir/bindings/python/gi/overrides/Modulemd.py $(python3 -c 
"import gi; print(gi._overridesdir)")/Modulemd.py
+RUN ln -sf /builddir/bindings/python/gi/overrides/Modulemd.py $(python3 -c 
"import gi; import os; os.makedirs(gi._overridesdir, exist_ok=True); 
print(gi._overridesdir)")/Modulemd.py
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/modulemd-2.15.0/.github/workflows/ci.yaml 
new/modulemd-2.15.2/.github/workflows/ci.yaml
--- old/modulemd-2.15.0/.github/workflows/ci.yaml       2023-05-10 
14:50:24.000000000 +0200
+++ new/modulemd-2.15.2/.github/workflows/ci.yaml       2025-06-18 
09:27:57.000000000 +0200
@@ -27,7 +27,7 @@
 
     steps:
       - name: Checkout code
-        uses: actions/checkout@v3
+        uses: actions/checkout@v4
 
       - name: Install dependencies
         run: $GITHUB_WORKSPACE/.ci/fedora/get_fedora_deps.sh
@@ -80,7 +80,7 @@
         run: dnf -y install git-core
 
       - name: Checkout code
-        uses: actions/checkout@v3
+        uses: actions/checkout@v4
 
       - name: Install dependencies
         run: $GITHUB_WORKSPACE/.ci/fedora/get_fedora_deps.sh
@@ -133,7 +133,7 @@
 
     steps:
       - name: Checkout code
-        uses: actions/checkout@v3
+        uses: actions/checkout@v4
 
       - name: Install dependencies
         run: $GITHUB_WORKSPACE/.ci/fedora/get_fedora_deps.sh
@@ -185,7 +185,7 @@
         run: dnf -y install git-core
 
       - name: Checkout code
-        uses: actions/checkout@v3
+        uses: actions/checkout@v4
 
       - name: Install dependencies
         run: $GITHUB_WORKSPACE/.ci/fedora/get_fedora_deps.sh
@@ -233,14 +233,14 @@
       image: docker.io/library/archlinux:base
 
     steps:
-      - name: Install the standard pacman config
-        run: cp /etc/pacman.conf.pacnew /etc/pacman.conf
+      - name: Disable excluding documenation in pacman configuration
+        run: sed -i -e '\| usr/share/gtk-doc/|d' -e '\| usr/share/doc/|d' 
/etc/pacman.conf
 
       - name: Install dependencies
-        run: pacman -Syu --needed --noconfirm base-devel file git glib2 
glib2-docs gobject-introspection gtk-doc jq libyaml meson python-gobject 
python-six valgrind
+        run: pacman -Syu --needed --noconfirm base-devel file git glib2 
glib2-devel glib2-docs gobject-introspection gtk-doc jq libyaml meson 
python-gobject python-six valgrind
 
       - name: Checkout code
-        uses: actions/checkout@v3
+        uses: actions/checkout@v4
 
       - name: Set up the build directory
         run:
@@ -319,7 +319,7 @@
               wget
 
       - name: Checkout code
-        uses: actions/checkout@v3
+        uses: actions/checkout@v4
 
       - name: Set up the build directory
         run: meson setup --buildtype=debugoptimized ci $GITHUB_WORKSPACE
@@ -387,7 +387,7 @@
                  valgrind
 
       - name: Checkout code
-        uses: actions/checkout@v3
+        uses: actions/checkout@v4
 
       - name: Set up the build directory
         run: meson setup --buildtype=debugoptimized ci $GITHUB_WORKSPACE
@@ -434,18 +434,16 @@
               valgrind
               wget
               task-devel
-              'pkgconfig(zlib)'
+              'pkgconfig(glib-2.0)'
               'pkgconfig(gobject-introspection-1.0)'
+              'pkgconfig(yaml-0.1)'
               'python3dist(autopep8)'
               'python3dist(pygobject)'
-              'pkgconfig(yaml-0.1)'
               'pkgconfig(rpm)'
-              magic-devel
               git-core
-              elinks
 
       - name: Checkout code
-        uses: actions/checkout@v3
+        uses: actions/checkout@v4
 
       - name: Set up the build directory
         env:
@@ -461,7 +459,8 @@
       - name: Run CI tests
         run: meson test -C ci --suite ci --print-errorlogs -t 5
 
-      - name: Run clang static analysis tests
-        run: |
-          meson setup --buildtype=debug -Dwith_docs=false 
-Dskip_introspection=true -Dwith_py3=false ci_scanbuild
-          ninja -C ci_scanbuild scan-build; if [ $? -ne 0 ]; then elinks -dump 
ci_scanbuild/meson-logs/scanbuild/*/index.html; fi
+      # Do not run "ninja scan-build" on this platform because glib2.0
+      # HTML documentation does not exist and -Dwith_docs=false is needed.
+      # The internal scan-build target ignores build options
+      # <https://github.com/mesonbuild/meson/issues/1167> and the build would
+      # fail.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/modulemd-2.15.0/.github/workflows/formatters.yaml 
new/modulemd-2.15.2/.github/workflows/formatters.yaml
--- old/modulemd-2.15.0/.github/workflows/formatters.yaml       2023-05-10 
14:50:24.000000000 +0200
+++ new/modulemd-2.15.2/.github/workflows/formatters.yaml       2025-06-18 
09:27:57.000000000 +0200
@@ -7,7 +7,7 @@
     runs-on: ubuntu-latest
     steps:
       - name: Checkout code
-        uses: actions/checkout@v3
+        uses: actions/checkout@v4
 
       - name: Install formatters
         run: |
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/modulemd-2.15.0/.github/workflows/multiarch.yaml 
new/modulemd-2.15.2/.github/workflows/multiarch.yaml
--- old/modulemd-2.15.0/.github/workflows/multiarch.yaml        2023-05-10 
14:50:24.000000000 +0200
+++ new/modulemd-2.15.2/.github/workflows/multiarch.yaml        1970-01-01 
01:00:00.000000000 +0100
@@ -1,40 +0,0 @@
-name: Other Architectures
-on: [push, pull_request]
-
-jobs:
-  multiarch:
-    runs-on: ubuntu-latest
-    name: ${{ matrix.distro }} on ${{ matrix.arch }}
-    continue-on-error: true
-
-    # Run steps on a matrix of 2 arch/distro combinations
-    strategy:
-      matrix:
-        include:
-          - arch: ppc64le
-            distro: fedora_latest
-          - arch: s390x
-            distro: fedora_latest
-
-    steps:
-      - uses: actions/checkout@v3
-
-      - uses: uraimo/run-on-arch-action@v2
-        name: Perform upstream tests
-
-        with:
-          arch: ${{ matrix.arch }}
-          distro: ${{ matrix.distro }}
-
-          # Not required, but speeds up builds by storing container images in
-          # a GitHub package registry.
-          githubToken: ${{ github.token }}
-
-          # Work-around ldd bug in rawhide CIs
-          run: |
-            $GITHUB_WORKSPACE/.ci/fedora/get_fedora_deps.sh
-            sed -i -e 's/test -r/test -f/g' -e 's/test -x/test -f/g' /bin/ldd
-            meson setup --buildtype=debugoptimized -Dverbose_tests=false 
/tmp/ci $GITHUB_WORKSPACE
-            meson test --suite formatters -C /tmp/ci --print-errorlogs -t 5
-            meson test --suite ci -C /tmp/ci --print-errorlogs -t 5
-
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/modulemd-2.15.0/.github/workflows/release.yaml 
new/modulemd-2.15.2/.github/workflows/release.yaml
--- old/modulemd-2.15.0/.github/workflows/release.yaml  2023-05-10 
14:50:24.000000000 +0200
+++ new/modulemd-2.15.2/.github/workflows/release.yaml  2025-06-18 
09:27:57.000000000 +0200
@@ -11,10 +11,10 @@
     if: github.repository == 'fedora-modularity/libmodulemd'
     steps:
       - name: Checkout code repo
-        uses: actions/checkout@v3
+        uses: actions/checkout@v4
 
       - name: Checkout documentation repo
-        uses: actions/checkout@v3
+        uses: actions/checkout@v4
         with:
           repository: fedora-modularity/fedora-modularity.github.io
           ref: main
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/modulemd-2.15.0/.github/workflows/upstreamed.yaml 
new/modulemd-2.15.2/.github/workflows/upstreamed.yaml
--- old/modulemd-2.15.0/.github/workflows/upstreamed.yaml       2023-05-10 
14:50:24.000000000 +0200
+++ new/modulemd-2.15.2/.github/workflows/upstreamed.yaml       2025-06-18 
09:27:57.000000000 +0200
@@ -10,7 +10,7 @@
     if: github.repository == 'fedora-modularity/libmodulemd'
     steps:
       - name: Checkout code
-        uses: actions/checkout@v3
+        uses: actions/checkout@v4
 
       - name: Coverity Scan
         env:
@@ -25,10 +25,10 @@
     if: github.repository == 'fedora-modularity/libmodulemd'
     steps:
       - name: Checkout code repo
-        uses: actions/checkout@v3
+        uses: actions/checkout@v4
 
       - name: Checkout documentation repo
-        uses: actions/checkout@v3
+        uses: actions/checkout@v4
         with:
           repository: fedora-modularity/fedora-modularity.github.io
           ref: main
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/modulemd-2.15.0/.packit.yml 
new/modulemd-2.15.2/.packit.yml
--- old/modulemd-2.15.0/.packit.yml     2023-05-10 14:50:24.000000000 +0200
+++ new/modulemd-2.15.2/.packit.yml     2025-06-18 09:27:57.000000000 +0200
@@ -6,7 +6,7 @@
 actions:
   get-current-version: ./get_version.sh
 
-synced_files:
+files_to_sync:
   - fedora/
   - .packit.yaml
 
@@ -19,6 +19,12 @@
   metadata:
     targets:
     - fedora-all
+    - fedora-rawhide-aarch64
+    - fedora-rawhide-i386
+    - fedora-rawhide-ppc64le
+    # fedora-rawhide-x86_64 is included in fedora-all
+    # fedora-rawhide-s390x has too long wait queue
     - epel-7
     - epel-8
     - centos-stream-9
+    - centos-stream-10
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/modulemd-2.15.0/NEWS new/modulemd-2.15.2/NEWS
--- old/modulemd-2.15.0/NEWS    2023-05-10 14:50:24.000000000 +0200
+++ new/modulemd-2.15.2/NEWS    2025-06-18 09:27:57.000000000 +0200
@@ -1,5 +1,25 @@
 Release history for libmodulemd
 
+2.15.2      2025-06-18
+
+Fixes:
+- module_index test now passes if RPM library is built without bzip2 or xz
+  compression support and libmodulemd is configured to support decompression
+  using the RPM library.
+
+
+2.15.1      2025-05-09
+
+Fixes:
+- A new "g_variant_store: assertion 'data != NULL' failed" warning added to
+  GLib 2.84.1 when processing modulemd YAML documents with /data/xmd field with
+  an empty flow map ({}) value was fixed.
+- Building documentation now works with GLib 2.80.1 at the expense of missing
+  cross links from libmodulemd to GLib. If it still fails you, you can disable
+  building the documentation with "-Dwith_docs=false" meson option.
+- A number of warnings printed by recent Meson was reduced.
+
+
 2.15.0      2023-05-10
 
 Enhancements:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/modulemd-2.15.0/fedora/libmodulemd.spec 
new/modulemd-2.15.2/fedora/libmodulemd.spec
--- old/modulemd-2.15.0/fedora/libmodulemd.spec 2023-05-10 14:50:24.000000000 
+0200
+++ new/modulemd-2.15.2/fedora/libmodulemd.spec 2025-06-18 09:27:57.000000000 
+0200
@@ -108,7 +108,7 @@
 
 # Don't run tests on ARM for now. There are problems with
 # performance on the builders and often these time out.
-%ifnarch %{arm} aarch64
+%ifnarch %{arm}
 # The tests sometimes time out in CI, so give them a little extra time
 %{__meson} test -C %{_vpath_builddir} %{?_smp_mesonflags} --print-errorlogs -t 
5
 %endif
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/modulemd-2.15.0/fedora/tests.yml 
new/modulemd-2.15.2/fedora/tests.yml
--- old/modulemd-2.15.0/fedora/tests.yml        2023-05-10 14:50:24.000000000 
+0200
+++ new/modulemd-2.15.2/fedora/tests.yml        2025-06-18 09:27:57.000000000 
+0200
@@ -10,13 +10,13 @@
     - classic
   tasks:
   - name: Make sure fedpkg and selinux bindings are installed
-    shell: dnf -y install fedpkg python{2,3}-libselinux libmodulemd-devel 
--skip-broken
+    shell: dnf -y install --skip-broken fedpkg python3-libselinux 
libmodulemd-devel
   - name: Copy spec file to remote machine
     copy:
       src: "{{ playbook_dir }}/../libmodulemd.spec"
       dest: /tmp/libmodulemd.spec
   - name: Install build deps
-    shell: dnf -y build-dep /tmp/libmodulemd.spec
+    shell: dnf -y builddep /tmp/libmodulemd.spec
 
 - hosts: localhost
   tags:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/modulemd-2.15.0/meson.build 
new/modulemd-2.15.2/meson.build
--- old/modulemd-2.15.0/meson.build     2023-05-10 14:50:24.000000000 +0200
+++ new/modulemd-2.15.2/meson.build     2025-06-18 09:27:57.000000000 +0200
@@ -12,7 +12,7 @@
 project(
   'modulemd',
   'c',
-version : '2.15.0',
+version : '2.15.2',
 default_options : ['buildtype=debugoptimized', 'c_std=c11', 'warning_level=1', 
'b_asneeded=true'],
 license : 'MIT',
 meson_version : '>=0.55.0'
@@ -67,23 +67,34 @@
 test = find_program('test')
 
 with_docs = get_option('with_docs')
+gtk_doc_referred_paths = []
 if with_docs
   gtkdoc = dependency('gtk-doc')
-  glib_docpath = join_paths(glib_prefix, 'share', 'gtk-doc', 'html')
 
-  glib_index_path = join_paths(glib_docpath, 'glib/index.html')
-  ret = run_command ([test, '-e', glib_index_path],
-    check: false)
-  if ret.returncode() != 0
-    error('Missing documentation for GLib: @0@'.format(glib_index_path))
+  if glib.version().version_compare('<2.79.0')
+    glib_docpath = join_paths(glib_prefix, 'share', 'gtk-doc', 'html')
+    glib_modules = ['glib', 'gobject' ]
+  else
+    warning('glib >= 2.79.0 documention might not be properly referred from 
libmodulemd documentation.')
+    if glib.version().version_compare('<2.80.1')
+      glib_docpath = join_paths(glib_prefix, 'share', 'doc', 'glib-2.0')
+      glib_modules = ['glib', 'gobject' ]
+    else
+      glib_docpath = join_paths(glib_prefix, 'share', 'doc')
+      glib_modules = ['glib-2.0', 'gobject-2.0' ]
+    endif
   endif
 
-  gobject_index_path = join_paths(glib_docpath, 'gobject/index.html')
-  ret = run_command ([test, '-e', gobject_index_path],
-    check: false)
-  if ret.returncode() != 0
-    error('Missing documentation for GObject: @0@'.format(gobject_index_path))
-  endif
+  foreach referred_module : glib_modules
+    doc_module_path = join_paths(glib_docpath, referred_module)
+    doc_index_file = join_paths(doc_module_path, 'index.html')
+    ret = run_command ([test, '-e', doc_index_file],
+      check: false)
+    if ret.returncode() != 0
+      error('Missing GTK documentation for @0@: @1@'.format(referred_module, 
doc_index_file))
+    endif
+    gtk_doc_referred_paths += [ doc_module_path ]
+  endforeach
 endif
 
 # Keep with_manpages option a tristate feature for backward compatibility.
@@ -198,6 +209,7 @@
          'datadir': get_option('datadir'),
          'Python 2 GObject Overrides': gobject_overrides_dir_py2,
          'Python 3 GObject Overrides': gobject_overrides_dir_py3,
+         'GTK-Doc Referred Paths': gtk_doc_referred_paths,
         }, section: 'Directories')
 
 summary({'Custom Python': get_option('python_name'),
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/modulemd-2.15.0/meson_options.txt 
new/modulemd-2.15.2/meson_options.txt
--- old/modulemd-2.15.0/meson_options.txt       2023-05-10 14:50:24.000000000 
+0200
+++ new/modulemd-2.15.2/meson_options.txt       2025-06-18 09:27:57.000000000 
+0200
@@ -11,7 +11,7 @@
 #
 # REMEMBER TO UPDATE THE SUMMARY() IN meson.build when adding options here
 
-option('accept_overflowed_buildorder', type : 'boolean', value: 'false',
+option('accept_overflowed_buildorder', type : 'boolean', value: false,
        description : 'Accept overflowed 18446744073709551615 buildorder as -1. 
This breaks a specification, but some RHEL 8 module builds look like that.')
 
 option('verbose_tests', type : 'boolean', value : true,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/modulemd-2.15.0/modulemd/meson.build 
new/modulemd-2.15.2/modulemd/meson.build
--- old/modulemd-2.15.0/modulemd/meson.build    2023-05-10 14:50:24.000000000 
+0200
+++ new/modulemd-2.15.2/modulemd/meson.build    2025-06-18 09:27:57.000000000 
+0200
@@ -256,6 +256,10 @@
 # --- Documenatation --- #
 
 if with_docs
+    fixxref_args = []
+    foreach path : gtk_doc_referred_paths
+      fixxref_args += [ '--extra-dir=@0@'.format(path) ]
+    endforeach
     gnome.gtkdoc(
         'modulemd-2.0',
         install_dir: 'modulemd-2.0',
@@ -265,10 +269,7 @@
         dependencies : [
             modulemd_dep,
         ],
-        fixxref_args: [
-                     '--extra-dir=@0@'.format(join_paths(glib_docpath, 
'glib')),
-                     '--extra-dir=@0@'.format(join_paths(glib_docpath, 
'gobject')),
-                   ],
+        fixxref_args: [ fixxref_args ],
         install : true,
     )
 endif
@@ -283,13 +284,15 @@
 # Test env with release values
 test_release_env = environment()
 test_release_env.set('LC_ALL', 'C')
-if meson.version().version_compare('< 0.56.0')
-    project_source_root = meson.source_root()
-    project_build_root = meson.build_root()
-else
+
+if meson.version().version_compare('>=0.56.0')
     project_source_root = meson.project_source_root()
     project_build_root = meson.project_build_root()
+else
+    project_source_root = meson.source_root()
+    project_build_root = meson.build_root()
 endif
+
 test_release_env.set ('MESON_SOURCE_ROOT', project_source_root)
 test_release_env.set ('MESON_BUILD_ROOT', project_build_root)
 test_release_env.set ('TEST_DATA_PATH', project_source_root + 
'/modulemd/tests/test_data')
@@ -362,6 +365,7 @@
 'service_level'       : [ 'tests/test-modulemd-service-level.c' ],
 'translation'         : [ 'tests/test-modulemd-translation.c' ],
 'translation_entry'   : [ 'tests/test-modulemd-translation-entry.c' ],
+'variant_deep_copy'   : [ 'tests/test-modulemd-variant_deep_copy.c' ],
 'obsoletes'           : [ 'tests/test-modulemd-obsoletes.c' ],
 'quoting'             : [ 'tests/test-modulemd-quoting.c' ],
 }
@@ -373,6 +377,7 @@
         sources,
         dependencies : [
             modulemd_dep,
+            rpm,
         ],
         link_with : [
             test_utils_lib,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/modulemd-2.15.0/modulemd/modulemd-build-config.c 
new/modulemd-2.15.2/modulemd/modulemd-build-config.c
--- old/modulemd-2.15.0/modulemd/modulemd-build-config.c        2023-05-10 
14:50:24.000000000 +0200
+++ new/modulemd-2.15.2/modulemd/modulemd-build-config.c        2025-06-18 
09:27:57.000000000 +0200
@@ -26,7 +26,8 @@
 
   gchar *context;
   gchar *platform;
-  GHashTable *requires; /* hashtable<string, string> */
+  GHashTable *
+    requires; /* hashtable<string, string> */
   GHashTable *buildrequires; /* hashtable<string, string> */
   ModulemdBuildopts *buildopts;
 };
@@ -64,8 +65,9 @@
 static void
 modulemd_build_config_init (ModulemdBuildConfig *self)
 {
-  self->requires =
-    g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free);
+  self->
+    requires
+  = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free);
   self->buildrequires =
     g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free);
 }
@@ -559,7 +561,9 @@
   if (deps)
     {
       g_clear_pointer (&self->requires, g_hash_table_unref);
-      self->requires = modulemd_hash_table_deep_str_copy (deps);
+      self->
+        requires
+      = modulemd_hash_table_deep_str_copy (deps);
     }
   else
     {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/modulemd-2.15.0/modulemd/modulemd-util.c 
new/modulemd-2.15.2/modulemd/modulemd-util.c
--- old/modulemd-2.15.0/modulemd/modulemd-util.c        2023-05-10 
14:50:24.000000000 +0200
+++ new/modulemd-2.15.2/modulemd/modulemd-util.c        2025-06-18 
09:27:57.000000000 +0200
@@ -363,9 +363,13 @@
 {
   const GVariantType *data_type = g_variant_get_type (variant);
   gsize data_size = g_variant_get_size (variant);
-  gpointer data = g_malloc0 (data_size);
+  gpointer data = NULL;
 
-  g_variant_store (variant, data);
+  if (data_size > 0)
+    {
+      data = g_malloc0 (data_size);
+      g_variant_store (variant, data);
+    }
 
   return g_variant_ref_sink (g_variant_new_from_data (
     data_type, data, data_size, FALSE, destroy_variant_data, data));
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/modulemd-2.15.0/modulemd/tests/test-modulemd-build-config.c 
new/modulemd-2.15.2/modulemd/tests/test-modulemd-build-config.c
--- old/modulemd-2.15.0/modulemd/tests/test-modulemd-build-config.c     
2023-05-10 14:50:24.000000000 +0200
+++ new/modulemd-2.15.2/modulemd/tests/test-modulemd-build-config.c     
2025-06-18 09:27:57.000000000 +0200
@@ -26,7 +26,9 @@
 buildconfig_test_construct (void)
 {
   g_autoptr (ModulemdBuildConfig) bc = NULL;
-  g_auto (GStrv) requires = NULL;
+  g_auto (GStrv)
+    requires
+  = NULL;
 
 
   /* == Test that the new() function works == */
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/modulemd-2.15.0/modulemd/tests/test-modulemd-moduleindex.c 
new/modulemd-2.15.2/modulemd/tests/test-modulemd-moduleindex.c
--- old/modulemd-2.15.0/modulemd/tests/test-modulemd-moduleindex.c      
2023-05-10 14:50:24.000000000 +0200
+++ new/modulemd-2.15.2/modulemd/tests/test-modulemd-moduleindex.c      
2025-06-18 09:27:57.000000000 +0200
@@ -11,13 +11,18 @@
  * For more information on free software, see 
<https://www.gnu.org/philosophy/free-sw.en.html>.
  */
 
+#include "config.h"
+
 #include <glib.h>
 #include <glib/gstdio.h>
 #include <locale.h>
 #include <signal.h>
 #include <yaml.h>
 
-#include "config.h"
+#ifdef HAVE_RPMIO
+#include <rpm/rpmio.h>
+#endif
+
 #include "modulemd.h"
 #include "modulemd-defaults.h"
 #include "modulemd-obsoletes.h"
@@ -1377,6 +1382,10 @@
 struct expected_compressed_read_t
 {
   const gchar *filename;
+#ifdef HAVE_RPMIO
+  /* Determines a compression type */
+  const gchar *rpmio_mode;
+#endif
 
   /* Whether this should succeed at reading */
   gboolean succeeds;
@@ -1386,6 +1395,33 @@
   int error_code;
 };
 
+#ifdef HAVE_RPMIO
+/* Probe whether rpmio library supports that type of compression.
+ * @file_path is a file name to open
+ * @compression_type is rpmio mode string specifying the desired compression
+ * format.
+ * It assumes that an uncompressed content of the file starts with "---\n"
+ * string and checks the first chararter is '-'. That's because rpmio library
+ * silenty returns original, undecompressed, content if it does not support
+ * the compression format. */
+static gboolean
+rpmio_can_read_compressed_file (const gchar *file_path,
+                                const gchar *compression_type)
+{
+  FD_t rpmfd;
+  ssize_t read;
+  unsigned char buffer;
+
+  rpmfd = Fopen ((const char *)file_path, (const char *)compression_type);
+  g_assert_nonnull (rpmfd);
+  read = Fread (&buffer, sizeof (buffer), 1, rpmfd);
+  Fclose (rpmfd);
+  g_assert_cmpint (read, ==, 1);
+
+  return (buffer == (unsigned char)'-');
+}
+#endif
+
 static void
 test_module_index_read_compressed (void)
 {
@@ -1402,16 +1438,22 @@
   struct expected_compressed_read_t expected[] = {
     {
       .filename = "bzipped",
+      .rpmio_mode = "r.bzdio",
       .succeeds = TRUE,
     },
     {
       .filename = "bzipped.yaml.bz2",
+      .rpmio_mode = "r.bzdio",
       .succeeds = TRUE,
     },
-    { .filename = "gzipped", .succeeds = TRUE },
-    { .filename = "gzipped.yaml.gz", .succeeds = TRUE },
-    { .filename = "xzipped", .succeeds = TRUE },
-    { .filename = "xzipped.yaml.xz", .succeeds = TRUE },
+    { .filename = "gzipped", .rpmio_mode = "r.gzdio", .succeeds = TRUE },
+    { .filename = "gzipped.yaml.gz",
+      .rpmio_mode = "r.gzdio",
+      .succeeds = TRUE },
+    { .filename = "xzipped", .rpmio_mode = "r.xzdio", .succeeds = TRUE },
+    { .filename = "xzipped.yaml.xz",
+      .rpmio_mode = "r.xzdio",
+      .succeeds = TRUE },
     { .filename = NULL }
   };
 
@@ -1475,6 +1517,19 @@
                                    expected[i].filename);
       g_assert_nonnull (file_path);
 
+#ifdef HAVE_RPMIO
+      /* Support for various compression formats in RPMIO is optional. Probe
+       * the support first and set expected success/error accordingly. */
+      if (!rpmio_can_read_compressed_file (file_path, expected[i].rpmio_mode))
+        {
+          g_debug ("rpmio library does not support %s compression mode",
+                   expected[i].rpmio_mode);
+          expected[i].succeeds = FALSE;
+          expected[i].error_domain = MODULEMD_YAML_ERROR;
+          expected[i].error_code = MMD_YAML_ERROR_UNPARSEABLE;
+        }
+#endif
+
       g_debug ("Processing %s, expecting %s",
                file_path,
                expected[i].succeeds ? "success" : "failure");
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/modulemd-2.15.0/modulemd/tests/test-modulemd-variant_deep_copy.c 
new/modulemd-2.15.2/modulemd/tests/test-modulemd-variant_deep_copy.c
--- old/modulemd-2.15.0/modulemd/tests/test-modulemd-variant_deep_copy.c        
1970-01-01 01:00:00.000000000 +0100
+++ new/modulemd-2.15.2/modulemd/tests/test-modulemd-variant_deep_copy.c        
2025-06-18 09:27:57.000000000 +0200
@@ -0,0 +1,69 @@
+/*
+ * This file is part of libmodulemd
+ * Copyright (C) 2025 Red Hat, Inc.
+ *
+ * Fedora-License-Identifier: MIT
+ * SPDX-2.0-License-Identifier: MIT
+ * SPDX-3.0-License-Identifier: MIT
+ *
+ * This program is free software.
+ * For more information on the license, see COPYING.
+ * For more information on free software, see 
<https://www.gnu.org/philosophy/free-sw.en.html>.
+ */
+
+#include <glib.h>
+#include <glib/gprintf.h>
+#include <locale.h>
+#include <stdlib.h>
+
+#include "private/modulemd-util.h"
+
+/*
+ * modulemd_variant_deep_copy() triggered a GLib critical warning
+ * from glib >= 2.84.1 when parsing a /data/xmd modulemd-stream-v2 element
+ * with {} value (an empty flow mapping). This test exhibits that code path
+ * and relies on G_DEBUG=fatal-criticals environment variable to crash the
+ * test.
+ * <https://github.com/fedora-modularity/libmodulemd/issues/623>.
+ */
+static void
+test_empty_a_sv (void)
+{
+  g_autoptr (GVariantDict) dictionary =
+    NULL; /* g_variant_dict_end() does not free */
+  g_autoptr (GVariant) input = NULL;
+  g_autoptr (GVariant) output = NULL;
+
+  /* Build a GVariant with an empty dictionary, results to an "a{sv}" of
+   * zero size. */
+  dictionary = g_variant_dict_new (NULL);
+  input = g_variant_dict_end (dictionary);
+
+  /* Exhibit the library. */
+  output = modulemd_variant_deep_copy (input);
+  g_assert_true (output != NULL);
+
+  /* Compare the content. */
+  g_assert_true (g_variant_get_type (output) == g_variant_get_type (input));
+  g_assert_true (g_variant_get_size (output) == g_variant_get_size (input));
+}
+
+
+int
+main (int argc, char *argv[])
+{
+  setlocale (LC_ALL, "");
+  g_test_init (&argc, &argv, NULL);
+  g_test_set_nonfatal_assertions ();
+
+  if (!g_setenv ("G_DEBUG", "fatal-criticals", TRUE))
+    {
+      g_fprintf (stderr, "Failed to set G_DEBUG environment variable.\n");
+      exit (EXIT_FAILURE);
+    }
+
+  g_test_add_func ("/modulemd/util/variant_deep_copy/empty_a{sv}",
+                   test_empty_a_sv);
+
+  return g_test_run ();
+}

Reply via email to