diff --git a/.gitignore b/.gitignore index 8261923..63a7509 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ -SOURCES/modulemd-2.5.0.tar.xz +SOURCES/modulemd-1.8.16.tar.xz +SOURCES/modulemd-2.8.2.tar.xz diff --git a/.libmodulemd.metadata b/.libmodulemd.metadata index 0ea40c8..6867260 100644 --- a/.libmodulemd.metadata +++ b/.libmodulemd.metadata @@ -1 +1,2 @@ -2b6c3443a36ec821fd289ae6605e9dea4c5dbcda SOURCES/modulemd-2.5.0.tar.xz +6e55eddb35afc4cd28b6d8cb248f821af5f49dd7 SOURCES/modulemd-1.8.16.tar.xz +9846728616cff38995764e9b4315889ecb3d4637 SOURCES/modulemd-2.8.2.tar.xz diff --git a/SOURCES/0001-Double-valgrind-timeout.patch b/SOURCES/0001-Double-valgrind-timeout.patch deleted file mode 100644 index e7f128a..0000000 --- a/SOURCES/0001-Double-valgrind-timeout.patch +++ /dev/null @@ -1,29 +0,0 @@ -From 1a7bf143761ff8e3f4f6585b82c0be4dbd511fca Mon Sep 17 00:00:00 2001 -From: Stephen Gallagher -Date: Thu, 23 May 2019 14:00:36 -0400 -Subject: [PATCH 1/3] Double valgrind timeout - -On some architectures under heavy load, the valgrind check on v2 -is taking a long time. - -Signed-off-by: Stephen Gallagher ---- - modulemd/meson.build | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/modulemd/meson.build b/modulemd/meson.build -index 47bd1f58e6401d2634d8ff737c2b347f5ebc6bf5..e49c7a9df76dcf37a18ddeba3150d6c914aa4e25 100644 ---- a/modulemd/meson.build -+++ b/modulemd/meson.build -@@ -313,7 +313,7 @@ endif - if valgrind.found() - modulemd_valgrind_scripts = files('common/tests/test-valgrind.py') - test ('valgrind', python3, - env : test_env, - args : modulemd_valgrind_scripts, -- timeout : 600) -+ timeout : 1200) - endif --- -2.21.0 - diff --git a/SOURCES/0002-Parallelize-the-valgrind-tests.patch b/SOURCES/0002-Parallelize-the-valgrind-tests.patch deleted file mode 100644 index ba160a5..0000000 --- a/SOURCES/0002-Parallelize-the-valgrind-tests.patch +++ /dev/null @@ -1,136 +0,0 @@ -From d9b41f72d4b2d545b2600aff7bd8a27ed0093750 Mon Sep 17 00:00:00 2001 -From: Stephen Gallagher -Date: Wed, 29 May 2019 11:33:57 -0400 -Subject: [PATCH 2/3] Parallelize the valgrind tests - -This considerably reduces the time needed to perform the valgrind -memory tests on systems with multiple available processors. In the -case of my laptop, the duration was reduced from ~200s to 90s. - -Signed-off-by: Stephen Gallagher ---- - modulemd/common/tests/test-valgrind.py | 74 ++++++++++++++------------ - 1 file changed, 41 insertions(+), 33 deletions(-) - -diff --git a/modulemd/common/tests/test-valgrind.py b/modulemd/common/tests/test-valgrind.py -index 9be72c705fde79aa305d831eaa4f31f7e2cc663f..9349749658ccca0529776f3d534664d614c1cb4d 100644 ---- a/modulemd/common/tests/test-valgrind.py -+++ b/modulemd/common/tests/test-valgrind.py -@@ -16,13 +16,16 @@ import os - import sys - import subprocess - import tempfile - import xml.etree.ElementTree as ET - -+from multiprocessing import Pool, TimeoutError -+ - if os.getenv('MMD_SKIP_VALGRIND'): - sys.exit(77) - -+ - failed = False - - # Get the list of tests to run - proc_result = subprocess.run(['meson', 'test', '--list'], - stdout=subprocess.PIPE, -@@ -47,13 +50,13 @@ for test in unfiltered_tests: - test == 'test_dirty_repo' or - test == 'valgrind'): - continue - tests.append(test) - -+ - with tempfile.TemporaryDirectory(prefix="libmodulemd_valgrind_") as tmpdirname: -- for test in tests: -- # TODO: auto-detect the location of the suppression file -+ def exec_valgrind(test): - valgrind_command = "/usr/bin/valgrind " \ - "--leak-check=full " \ - "--suppressions=/usr/share/glib-2.0/valgrind/glib.supp " \ - "--xml=yes " \ - "--xml-file=%s/%s.xml " % (tmpdirname, test) -@@ -64,45 +67,50 @@ with tempfile.TemporaryDirectory(prefix="libmodulemd_valgrind_") as tmpdirname: - '-t', '10', - '--logbase=%s' % test, - '--wrap=%s' % valgrind_command, - test]) - -- if proc_result.returncode != 0: -- print("Valgrind exited with an error on %s" % test, -- file=sys.stderr) -- failed = True -- continue -+ return proc_result.returncode, test - -- # Process the XML for leaks -- tree = ET.parse('%s/%s.xml' % (tmpdirname, test)) -- root = tree.getroot() -+ with Pool() as pool: -+ for returncode, test in pool.map(exec_valgrind, tests): -+ if returncode != 0: -+ print("Valgrind exited with an error on %s" % test, -+ file=sys.stderr) -+ failed = True -+ continue - -- for root_child in root: -- if (root_child.tag == "error"): -- for error_child in root_child: -- if error_child.tag == 'kind': -- if error_child.text == 'Leak_DefinitelyLost': -- print("Memory leak detected in %s" % test, -- file=sys.stderr) -- failed = True -+ # Process the XML for leaks -+ tree = ET.parse('%s/%s.xml' % (tmpdirname, test)) -+ root = tree.getroot() - -- elif error_child.text == 'InvalidFree': -- print("Invalid free() detected in %s" % test, -- file=sys.stderr) -- failed = True -+ for root_child in root: -+ if (root_child.tag == "error"): -+ for error_child in root_child: -+ if error_child.tag == 'kind': -+ if error_child.text == 'Leak_DefinitelyLost': -+ print("Memory leak detected in %s" % test, -+ file=sys.stderr) -+ failed = True - -- elif error_child.text == 'InvalidRead': -- print("Invalid read detected in %s" % test, -- file=sys.stderr) -- failed = True -+ elif error_child.text == 'InvalidFree': -+ print("Invalid free() detected in %s" % test, -+ file=sys.stderr) -+ failed = True - -- elif error_child.text == 'UninitCondition': -- print("Uninitialized usage detected in %s" % test, -- file=sys.stderr) -- failed = True -- if failed: -- with open('%s/%s.xml' % (tmpdirname, test), 'r') as xml: -- print(xml.read()) -+ elif error_child.text == 'InvalidRead': -+ print("Invalid read detected in %s" % test, -+ file=sys.stderr) -+ failed = True -+ -+ elif error_child.text == 'UninitCondition': -+ print( -+ "Uninitialized usage detected in %s" % -+ test, file=sys.stderr) -+ failed = True -+ if failed: -+ with open('%s/%s.xml' % (tmpdirname, test), 'r') as xml: -+ print(xml.read()) - - - if failed: - sys.exit(1) --- -2.21.0 - diff --git a/SOURCES/0003-Fix-transfer-type-for-Module.search_streams.patch b/SOURCES/0003-Fix-transfer-type-for-Module.search_streams.patch deleted file mode 100644 index 40ba286..0000000 --- a/SOURCES/0003-Fix-transfer-type-for-Module.search_streams.patch +++ /dev/null @@ -1,150 +0,0 @@ -From 340e316bd6384562086b4e381c8cd42b1ccd0781 Mon Sep 17 00:00:00 2001 -From: Stephen Gallagher -Date: Tue, 28 May 2019 14:28:30 -0400 -Subject: [PATCH 3/3] Fix transfer type for Module.search_streams() - -Technically this is an API-breaking change, but no one is using it -yet and it was always expected to be managed this way. - -Fixes: https://github.com/fedora-modularity/libmodulemd/issues/308 - -Signed-off-by: Stephen Gallagher ---- - modulemd/meson.build | 1 + - .../v2/include/modulemd-2.0/modulemd-module.h | 4 +- - modulemd/v2/meson.build | 17 ++++++- - modulemd/v2/tests/ModulemdTests/module.py | 46 +++++++++++++++++++ - 4 files changed, 65 insertions(+), 3 deletions(-) - create mode 100644 modulemd/v2/tests/ModulemdTests/module.py - -diff --git a/modulemd/meson.build b/modulemd/meson.build -index e49c7a9df76dcf37a18ddeba3150d6c914aa4e25..e5912d4041ba3e427d13b98c0eeca5217d48244b 100644 ---- a/modulemd/meson.build -+++ b/modulemd/meson.build -@@ -229,10 +229,11 @@ test_v2_python_scripts = files( - 'v2/tests/ModulemdTests/componentrpm.py', - 'v2/tests/ModulemdTests/defaults.py', - 'v2/tests/ModulemdTests/defaultsv1.py', - 'v2/tests/ModulemdTests/dependencies.py', - 'v2/tests/ModulemdTests/merger.py', -+ 'v2/tests/ModulemdTests/module.py', - 'v2/tests/ModulemdTests/moduleindex.py', - 'v2/tests/ModulemdTests/modulestream.py', - 'v2/tests/ModulemdTests/profile.py', - 'v2/tests/ModulemdTests/rpmmap.py', - 'v2/tests/ModulemdTests/servicelevel.py', -diff --git a/modulemd/v2/include/modulemd-2.0/modulemd-module.h b/modulemd/v2/include/modulemd-2.0/modulemd-module.h -index 45be9c0ae96e203707da61d84f18c71c4a826035..0219cfe227652813d20bdf736f9033782084c5ad 100644 ---- a/modulemd/v2/include/modulemd-2.0/modulemd-module.h -+++ b/modulemd/v2/include/modulemd-2.0/modulemd-module.h -@@ -129,12 +129,12 @@ modulemd_module_get_stream_by_NSVC (ModulemdModule *self, - * @context: (nullable): The context of the stream to retrieve. If NULL, the - * context is not included in the search. - * @arch: (nullable): The processor architecture of the stream to retrieve. If - * NULL, the architecture is not included in the search. - * -- * Returns: (transfer full) (element-type ModulemdModuleStream): The list of -- * stream objects matching the requested parameters. This function cannot -+ * Returns: (transfer container) (element-type ModulemdModuleStream): The list -+ * of stream objects matching the requested parameters. This function cannot - * fail, but it may return a zero-length list if no matches were found. The - * returned streams will be in a predictable order, sorted first by stream - * name, then by version (highest to lowest), then by context and finally by - * architecture. - * -diff --git a/modulemd/v2/meson.build b/modulemd/v2/meson.build -index 3f45db2c4e0e9a8996c74dffd949d5276082dc6f..e8a5a38f0528c4f860f0b84ef63609ff5fd89caa 100644 ---- a/modulemd/v2/meson.build -+++ b/modulemd/v2/meson.build -@@ -390,20 +390,35 @@ test ('dependencies_python2_debug', python2, - args : dependencies_python_script) - test ('dependencies_python2_release', python2, - env : py_test_release_env, - args : dependencies_python_script) - -+# -- Test Modulemd.Module (Python) -- # -+module_python_script = files('tests/ModulemdTests/module.py') -+test ('module_python3_debug', python3, -+ env : py_test_env, -+ args : module_python_script) -+test ('module_python3_release', python3, -+ env : py_test_release_env, -+ args : module_python_script) -+ -+test ('module_python2_debug', python2, -+ env : py_test_env, -+ args : module_python_script) -+test ('module_python2_release', python2, -+ env : py_test_release_env, -+ args : module_python_script) -+ - # -- Test Modulemd.ModuleIndex (Python) -- # - moduleindex_python_script = files('tests/ModulemdTests/moduleindex.py') - test ('moduleindex_python3_debug', python3, - env : py_test_env, - args : moduleindex_python_script) - test ('moduleindex_python3_release', python3, - env : py_test_release_env, - args : moduleindex_python_script) - --moduleindex_python_script = files('tests/ModulemdTests/moduleindex.py') - test ('moduleindex_python2_debug', python2, - env : py_test_env, - args : moduleindex_python_script) - test ('moduleindex_python2_release', python2, - env : py_test_release_env, -diff --git a/modulemd/v2/tests/ModulemdTests/module.py b/modulemd/v2/tests/ModulemdTests/module.py -new file mode 100644 -index 0000000000000000000000000000000000000000..b604d9c9b357c4a5211d3ba5b4d0aba08c3a42bd ---- /dev/null -+++ b/modulemd/v2/tests/ModulemdTests/module.py -@@ -0,0 +1,46 @@ -+#!/usr/bin/python3 -+ -+# This file is part of libmodulemd -+# Copyright (C) 2017-2018 Stephen Gallagher -+# -+# 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 -+# . -+ -+from os import path -+import sys -+try: -+ import unittest -+ import gi -+ gi.require_version('Modulemd', '2.0') -+ from gi.repository import Modulemd -+ from gi.repository.Modulemd import ModuleIndex -+ from gi.repository import GLib -+except ImportError: -+ # Return error 77 to skip this test on platforms without the necessary -+ # python modules -+ sys.exit(77) -+ -+from base import TestBase -+ -+ -+class TestModule(TestBase): -+ -+ def test_search_streams(self): -+ idx = Modulemd.ModuleIndex.new() -+ idx.update_from_file(path.join(self.source_root, -+ "modulemd/v2/tests/test_data/f29.yaml"), -+ True) -+ module = idx.get_module('nodejs') -+ -+ self.assertEquals(len(module.search_streams('8', 0)), 1) -+ self.assertEquals(len(module.search_streams('10', 0)), 1) -+ -+ -+if __name__ == '__main__': -+ unittest.main() --- -2.21.0 - diff --git a/SPECS/libmodulemd.spec b/SPECS/libmodulemd.spec index a8a288c..9a1196f 100644 --- a/SPECS/libmodulemd.spec +++ b/SPECS/libmodulemd.spec @@ -1,14 +1,25 @@ -%global libmodulemd_version 2.5.0 -%global libmodulemd_v1_version 1.8.11 +%global baserelease 1 +%global v2_epoch 0 +%global v2_major 2 +%global v2_minor 8 +%global v2_patch 2 +%global v2_release %{baserelease} +%global libmodulemd_v2_version %{v2_major}.%{v2_minor}.%{v2_patch} +%global libmodulemd_v1_version 1.8.16 +# This is trickery to ensure that the upgrade path for libmodulemd1 is always +# clean and associated with the appropriate v2 build +%global libmodulemd_v1_release %{v2_epoch}.%{v2_major}.%{v2_minor}.%{v2_patch}.%{v2_release} Name: libmodulemd -Version: %{libmodulemd_version} -Release: 2%{?dist} +Version: %{libmodulemd_v2_version} +Release: %{baserelease}%{?dist} Summary: Module metadata manipulation library License: MIT URL: https://github.com/fedora-modularity/libmodulemd Source0: %{url}/releases/download/%{name}-%{version}/modulemd-%{version}.tar.xz +Source1: %{url}/releases/download/%{name}-%{libmodulemd_v1_version}/modulemd-%{libmodulemd_v1_version}.tar.xz + BuildRequires: meson >= 0.47 BuildRequires: pkgconfig @@ -18,20 +29,16 @@ BuildRequires: pkgconfig(gobject-2.0) BuildRequires: pkgconfig(gobject-introspection-1.0) BuildRequires: pkgconfig(yaml-0.1) BuildRequires: pkgconfig(gtk-doc) +BuildRequires: glib2-doc +BuildRequires: rpm-devel +BuildRequires: file-devel BuildRequires: python3-devel BuildRequires: python3-gobject-base %ifarch %{valgrind_arches} BuildRequires: valgrind %endif -# Make sure we upgrade libmodulemd1 to match -Conflicts: libmodulemd1 < %{libmodulemd_v1_version}-%{release} - - # Patches -Patch0001: 0001-Double-valgrind-timeout.patch -Patch0002: 0002-Parallelize-the-valgrind-tests.patch -Patch0003: 0003-Fix-transfer-type-for-Module.search_streams.patch %description @@ -63,6 +70,7 @@ Development files for libmodulemd. %package -n libmodulemd1 Summary: Compatibility package for libmodulemd 1.x Version: %{libmodulemd_v1_version} +Release: %{libmodulemd_v1_release} Obsoletes: libmodulemd < 2 Provides: libmodulemd = %{libmodulemd_v1_version}-%{release} Provides: libmodulemd%{?_isa} = %{libmodulemd_v1_version}-%{release} @@ -74,6 +82,7 @@ Compatibility library for libmodulemd 1.x %package -n libmodulemd1-devel Summary: Compatibility development package for libmodulemd 1.x Version: %{libmodulemd_v1_version} +Release: %{libmodulemd_v1_release} Requires: libmodulemd1%{?_isa} = %{libmodulemd_v1_version}-%{release} Conflicts: %{name}-devel Obsoletes: libmodulemd-devel < 2 @@ -99,18 +108,28 @@ Python 3 bindings for libmodulemd1 %prep -%autosetup -p1 -n modulemd-%{libmodulemd_version} - +%setup -c +%setup -c -T -D -a 1 %build +# Build the v1 API first +pushd modulemd-%{libmodulemd_v1_version} %define _vpath_builddir api1 -%meson -Ddeveloper_build=false -Dbuild_api_v1=true -Dbuild_api_v2=false +%meson -Ddeveloper_build=false %meson_build +popd +# Build the v2 API +pushd modulemd-%{libmodulemd_v2_version} %define _vpath_builddir api2 -%meson -Ddeveloper_build=false -Dbuild_api_v1=false -Dbuild_api_v2=true -Dwith_py3_overrides=true -Dwith_py2_overrides=false +%ifarch aarch64 +# aarch64 builders have I/O issues that often causes the valgrind tests to +# time out. Skip them from the RPM build +export MMD_SKIP_VALGRIND=True +%endif +%meson -Ddeveloper_build=false -Dskip_formatters=true -Dwith_py3_overrides=true -Dwith_py2_overrides=false %meson_build - +popd %check @@ -125,27 +144,36 @@ export MMD_SKIP_VALGRIND=1 export MMD_SKIP_VALGRIND=1 %endif +pushd modulemd-%{libmodulemd_v1_version} %define _vpath_builddir api1 -%meson_test +%{__meson} test -C %{_vpath_builddir} %{?_smp_mesonflags} --print-errorlogs -t 10 +popd +pushd modulemd-%{libmodulemd_v2_version} %define _vpath_builddir api2 -%meson_test +%{__meson} test -C %{_vpath_builddir} %{?_smp_mesonflags} --print-errorlogs -t 10 +popd %install +pushd modulemd-%{libmodulemd_v1_version} %define _vpath_builddir api1 %meson_install +popd +pushd modulemd-%{libmodulemd_v2_version} %define _vpath_builddir api2 %meson_install +popd +# Create a symlink for the libmodulemd1-devel package ln -s libmodulemd.so.%{libmodulemd_v1_version} \ %{buildroot}%{_libdir}/%{name}.so.compat %files -%license COPYING -%doc README.md +%license modulemd-%{libmodulemd_v2_version}/COPYING +%doc modulemd-%{libmodulemd_v2_version}/README.md %{_bindir}/modulemd-validator %{_libdir}/%{name}.so.2* %dir %{_libdir}/girepository-1.0 @@ -171,8 +199,8 @@ ln -s libmodulemd.so.%{libmodulemd_v1_version} \ %files -n libmodulemd1 -%license COPYING -%doc README.md +%license modulemd-%{libmodulemd_v1_version}/COPYING +%doc modulemd-%{libmodulemd_v1_version}/README.md %{_bindir}/modulemd-validator-v1 %{_libdir}/%{name}.so.1* %dir %{_libdir}/girepository-1.0 @@ -191,6 +219,14 @@ ln -s libmodulemd.so.%{libmodulemd_v1_version} \ %changelog +* Tue Oct 29 2019 Stephen Gallagher - 2.8.2-1 +- Update to versions 2.8.2 and 1.8.16 +- Resolves: rhbz#1752511 + +* Wed Oct 23 2019 Stephen Gallagher - 2.5.0-4 +- Improve default merging logic when dealing with third-party repos +- Resolves: rhbz#1761805 + * Wed May 29 2019 Stephen Gallagher - 2.5.0-2 - Fix memory corruption error using Module.search_rpms() from python - Speed up valgrind tests