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 (); +}
