Update to libmodulemd 2.1.0 and 1.8.2

Drop upstreamed patches

Add new API ModuleStream.depends_on_stream() and
  ModuleStream.build_depends_on_stream() to help support auto-detection of
  when a module stream may need to be rebuilt when its dependencies change.

Don't fail merges when default streams differ, treat it as "no default for
  this module"

Fix error message

Copy modified value when copying Modulemd.Defaults objects

Fixes discovered by clang and coverity static analysis tools

Test improvements

Signed-off-by: Stephen Gallagher <sgallagh@redhat.com>
This commit is contained in:
Stephen Gallagher 2019-01-26 16:00:23 -05:00
parent fbc6b4e257
commit ed17745b6d
No known key found for this signature in database
GPG Key ID: 7A25556236BAA3A3
6 changed files with 18 additions and 381 deletions

1
.gitignore vendored
View File

@ -26,3 +26,4 @@
/modulemd-1.7.0.tar.xz
/modulemd-2.0.0beta2.tar.xz
/modulemd-2.0.0.tar.xz
/modulemd-2.1.0.tar.xz

View File

@ -1,106 +0,0 @@
From f66d185dd5c2c1750b3626c2e0bdfeab63e427b6 Mon Sep 17 00:00:00 2001
From: Stephen Gallagher <sgallagh@redhat.com>
Date: Fri, 11 Jan 2019 08:36:11 -0500
Subject: [PATCH] Include modified value when copying Defaults objects
The symptom of this was that any defaults object read from a YAML
stream would end up stored in the ModuleIndex with the a zero for
the modified value.
Signed-off-by: Stephen Gallagher <sgallagh@redhat.com>
---
modulemd/v2/modulemd-defaults.c | 7 ++++--
modulemd/v2/tests/ModulemdTests/defaults.py | 25 +++++++++++++++++++++
2 files changed, 30 insertions(+), 2 deletions(-)
diff --git a/modulemd/v2/modulemd-defaults.c b/modulemd/v2/modulemd-defaults.c
index 9e5c31b499704ae7a8543c91b9ea3bbf0dbf981d..c577d4a0c3db45319c8e0582b4cc07f3943836fa 100644
--- a/modulemd/v2/modulemd-defaults.c
+++ b/modulemd/v2/modulemd-defaults.c
@@ -91,14 +91,18 @@ modulemd_defaults_copy (ModulemdDefaults *self)
static ModulemdDefaults *
modulemd_defaults_default_copy (ModulemdDefaults *self)
{
+ g_autoptr (ModulemdDefaults) copy = NULL;
g_return_val_if_fail (MODULEMD_IS_DEFAULTS (self), NULL);
- return modulemd_defaults_new (modulemd_defaults_get_mdversion (self),
+ copy = modulemd_defaults_new (modulemd_defaults_get_mdversion (self),
modulemd_defaults_get_module_name (self));
+ modulemd_defaults_set_modified (copy, modulemd_defaults_get_modified (self));
+
+ return g_steal_pointer (&copy);
}
gboolean
modulemd_defaults_validate (ModulemdDefaults *self, GError **error)
@@ -214,11 +218,10 @@ modulemd_defaults_set_modified (ModulemdDefaults *self, guint64 modified)
{
g_return_if_fail (MODULEMD_IS_DEFAULTS (self));
ModulemdDefaultsPrivate *priv =
modulemd_defaults_get_instance_private (self);
-
priv->modified = modified;
}
guint64
diff --git a/modulemd/v2/tests/ModulemdTests/defaults.py b/modulemd/v2/tests/ModulemdTests/defaults.py
index ddac23bbed573b3725feb8cb0090fb878a1f4f22..9a783d25617fc53f59448bc32a68c6e2755dd034 100644
--- a/modulemd/v2/tests/ModulemdTests/defaults.py
+++ b/modulemd/v2/tests/ModulemdTests/defaults.py
@@ -10,11 +10,13 @@
# 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>.
+import os
import sys
+
try:
import unittest
import gi
gi.require_version('Modulemd', '2.0')
from gi.repository import Modulemd
@@ -92,10 +94,33 @@ class TestDefaults(TestBase):
# Ensure we cannot set the module_name
with self.expect_signal():
defs.props.module_name = None
+ def test_modified(self):
+ defs = Modulemd.Defaults.new(
+ Modulemd.DefaultsVersionEnum.LATEST, 'foo')
+ self.assertIsNotNone(defs)
+
+ self.assertEqual(defs.get_modified(), 0)
+
+ defs.set_modified(201901110830)
+
+ self.assertEqual(defs.get_modified(), 201901110830)
+
+ # Load a defaults object into an Index
+ index = Modulemd.ModuleIndex.new()
+ index.update_from_file("%s/mod-defaults/spec.v1.yaml" % (
+ os.getenv('MESON_SOURCE_ROOT')), True)
+ module_names = index.get_module_names()
+ self.assertEqual(len(module_names), 1)
+
+ defs = index.get_module(index.get_module_names()[0]).get_defaults()
+ self.assertIsNotNone(defs)
+
+ self.assertEqual(defs.get_modified(), 201812071200)
+
def test_validate(self):
defs = Modulemd.Defaults.new(
Modulemd.DefaultsVersionEnum.LATEST, 'foo')
assert defs
--
2.20.1

View File

@ -1,230 +0,0 @@
From f8fd49a9aefffdaa24f6d4b24268ac3cd5f3d090 Mon Sep 17 00:00:00 2001
From: Stephen Gallagher <sgallagh@redhat.com>
Date: Mon, 7 Jan 2019 10:22:30 -0500
Subject: [PATCH 2/3] Always sort the dependencies
This will make sure that the output is always consistent. This
patch fixes both the ordering of the module names as well as the
stream names.
Signed-off-by: Stephen Gallagher <sgallagh@redhat.com>
---
.../modulemd-2.0/private/modulemd-yaml.h | 30 ++++---
modulemd/v2/modulemd-dependencies.c | 85 ++-----------------
.../v2/tests/test-modulemd-modulestream.c | 14 +--
3 files changed, 36 insertions(+), 93 deletions(-)
diff --git a/modulemd/v2/include/modulemd-2.0/private/modulemd-yaml.h b/modulemd/v2/include/modulemd-2.0/private/modulemd-yaml.h
index e426fe6f1d9c43c7ad13420edc481eba46ae3fda..cca84590d6b29fe2f7d20fb91e7205fa21a38533 100644
--- a/modulemd/v2/include/modulemd-2.0/private/modulemd-yaml.h
+++ b/modulemd/v2/include/modulemd-2.0/private/modulemd-yaml.h
@@ -655,12 +655,30 @@ skip_unknown_yaml (yaml_parser_t *parser, GError **error);
MODULEMD_YAML_ERROR_EMIT, \
"String set for key %s was empty on emit", \
key); \
return FALSE; \
} \
+ EMIT_STRING_SET_FULL ( \
+ emitter, error, key, table, YAML_BLOCK_SEQUENCE_STYLE); \
+ } \
+ while (0)
+
+#define EMIT_STRING_SET_IF_NON_EMPTY(emitter, error, key, table) \
+ do \
+ { \
+ if (NON_EMPTY_TABLE (table)) \
+ { \
+ EMIT_STRING_SET (emitter, error, key, table); \
+ } \
+ } \
+ while (0)
+
+#define EMIT_STRING_SET_FULL(emitter, error, key, table, sequence_style) \
+ do \
+ { \
EMIT_SCALAR (emitter, error, key); \
- EMIT_SEQUENCE_START (emitter, error); \
+ EMIT_SEQUENCE_START_WITH_STYLE (emitter, error, sequence_style); \
gsize i; \
g_autoptr (GPtrArray) keys = \
modulemd_ordered_str_keys (table, modulemd_strcmp_sort); \
for (i = 0; i < keys->len; i++) \
{ \
@@ -668,20 +686,10 @@ skip_unknown_yaml (yaml_parser_t *parser, GError **error);
} \
EMIT_SEQUENCE_END (emitter, error); \
} \
while (0)
-#define EMIT_STRING_SET_IF_NON_EMPTY(emitter, error, key, table) \
- do \
- { \
- if (NON_EMPTY_TABLE (table)) \
- { \
- EMIT_STRING_SET (emitter, error, key, table); \
- } \
- } \
- while (0)
-
#define EMIT_ARRAY_VALUES(emitter, error, key, array, emitfn) \
do \
{ \
if (!NON_EMPTY_ARRAY (array)) \
{ \
diff --git a/modulemd/v2/modulemd-dependencies.c b/modulemd/v2/modulemd-dependencies.c
index f71bebe9fbc852fa6df729ce80bd0e0375e023bd..ee918e02a87dfdee04a5a6af7dc96e949159a046 100644
--- a/modulemd/v2/modulemd-dependencies.c
+++ b/modulemd/v2/modulemd-dependencies.c
@@ -470,73 +470,22 @@ modulemd_dependencies_parse_yaml (yaml_parser_t *parser,
}
return g_steal_pointer (&d);
}
-static gboolean
-modulemd_dependencies_emit_yaml_nested_set_value (GHashTable *values,
- yaml_emitter_t *emitter,
- yaml_sequence_style_t style,
- GError **error)
-{
- MODULEMD_INIT_TRACE ();
- int ret;
- g_autoptr (GError) nested_error = NULL;
- MMD_INIT_YAML_EVENT (event);
- GHashTableIter iter;
- gpointer key;
-
- ret = mmd_emitter_start_sequence (emitter, style, &nested_error);
- if (!ret)
- {
- g_propagate_prefixed_error (
- error,
- g_steal_pointer (&nested_error),
- "Failed to start dependencies nested mapping values: ");
- return FALSE;
- }
-
- g_hash_table_iter_init (&iter, values);
- while (g_hash_table_iter_next (&iter, &key, NULL))
- {
- ret = mmd_emitter_scalar (
- emitter, (const gchar *)key, YAML_PLAIN_SCALAR_STYLE, &nested_error);
- if (!ret)
- {
- g_propagate_prefixed_error (
- error,
- g_steal_pointer (&nested_error),
- "Failed to start dependencies nested mapping entry: ");
- return FALSE;
- }
- }
-
- ret = mmd_emitter_end_sequence (emitter, &nested_error);
- if (!ret)
- {
- g_propagate_prefixed_error (
- error,
- g_steal_pointer (&nested_error),
- "Failed to end dependencies nested mapping values: ");
- return FALSE;
- }
-
- return TRUE;
-}
-
-
static gboolean
modulemd_dependencies_emit_yaml_nested_set (GHashTable *table,
yaml_emitter_t *emitter,
GError **error)
{
MODULEMD_INIT_TRACE ();
int ret;
g_autoptr (GError) nested_error = NULL;
MMD_INIT_YAML_EVENT (event);
- GHashTableIter iter;
- gpointer key, value;
+ g_autoptr (GPtrArray) keys = NULL;
+ GHashTable *dep = NULL;
+ gchar *key = NULL;
ret = mmd_emitter_start_mapping (
emitter, YAML_BLOCK_MAPPING_STYLE, &nested_error);
if (!ret)
{
@@ -545,34 +494,18 @@ modulemd_dependencies_emit_yaml_nested_set (GHashTable *table,
g_steal_pointer (&nested_error),
"Failed to start dependencies nested mapping: ");
return FALSE;
}
- g_hash_table_iter_init (&iter, table);
- while (g_hash_table_iter_next (&iter, &key, &value))
+ keys = modulemd_ordered_str_keys (table, modulemd_strcmp_sort);
+ for (gint i = 0; i < keys->len; i++)
{
- ret = mmd_emitter_scalar (
- emitter, (const gchar *)key, YAML_PLAIN_SCALAR_STYLE, &nested_error);
- if (!ret)
- {
- g_propagate_prefixed_error (
- error,
- g_steal_pointer (&nested_error),
- "Failed to emit dependencies nested key: ");
- return FALSE;
- }
+ key = g_ptr_array_index (keys, i);
+ dep = g_hash_table_lookup (table, key);
- ret = modulemd_dependencies_emit_yaml_nested_set_value (
- (GHashTable *)value, emitter, YAML_FLOW_SEQUENCE_STYLE, &nested_error);
- if (!ret)
- {
- g_propagate_prefixed_error (
- error,
- g_steal_pointer (&nested_error),
- "Failed to emit dependencies nested sequence: ");
- return FALSE;
- }
+ EMIT_STRING_SET_FULL (
+ emitter, error, key, dep, YAML_FLOW_SEQUENCE_STYLE);
}
ret = mmd_emitter_end_mapping (emitter, &nested_error);
if (!ret)
{
diff --git a/modulemd/v2/tests/test-modulemd-modulestream.c b/modulemd/v2/tests/test-modulemd-modulestream.c
index 8136b6ec626b3648339840c7cd667423c3ea1cc9..b68f4a650e15535d606aae031afc90a41bb4bcec 100644
--- a/modulemd/v2/tests/test-modulemd-modulestream.c
+++ b/modulemd/v2/tests/test-modulemd-modulestream.c
@@ -308,19 +308,21 @@ module_stream_v2_test_parse_dump (ModuleStreamFixture *fixture,
"Beerware\n - GPLv2+\n - zlib\n xmd:\n some_key: some_data\n "
"dependencies:\n - buildrequires:\n platform: [-epel7, -f27, "
"-f28]\n "
" requires:\n platform: [-epel7, -f27, -f28]\n - buildrequires:\n "
" "
- "compatible: [v3]\n platform: [f27]\n buildtools: [v1, v2]\n "
+ "buildtools: [v1, v2]\n compatible: [v3]\n platform: [f27]\n "
"requires:\n compatible: [v3, v4]\n "
"platform: [f27]\n - buildrequires:\n platform: [f28]\n "
"requires:\n platform: [f28]\n runtime: [a, b]\n - "
- "buildrequires:\n extras: []\n platform: [epel7]\n "
- "moreextras: [foo, bar]\n "
- "requires:\n extras: []\n platform: [epel7]\n "
- "moreextras: [foo, bar]\n references:\n community: "
- "http://www.example.com/\n documentation: http://www.example.com/\n "
+ "buildrequires:\n extras: []\n moreextras: [bar, foo]\n "
+ "platform: [epel7]\n "
+ "requires:\n extras: []\n "
+ "moreextras: [bar, foo]\n platform: [epel7]\n references:\n "
+ "community: "
+ "http://www.example.com/\n documentation: "
+ "http://www.example.com/\n "
"tracker: http://www.example.com/\n profiles:\n buildroot:\n "
"rpms:\n - bar-devel\n container:\n rpms:\n - bar\n "
" - bar-devel\n default:\n rpms:\n - bar\n - "
"bar-extras\n - baz\n minimal:\n description: Minimal "
"profile installing only the bar package.\n rpms:\n - bar\n "
--
2.20.1

View File

@ -1,38 +0,0 @@
From 430fddbaae4c9e8ae8b3b43d9a792c71d93256dd Mon Sep 17 00:00:00 2001
From: Stephen Gallagher <sgallagh@redhat.com>
Date: Mon, 7 Jan 2019 14:46:30 -0500
Subject: [PATCH 3/3] Use glib2 valgrind suppression file
Make sure to filter out known issues with glib2 so our tests don't
fail for situations we cannot control (or may be false-positives).
Signed-off-by: Stephen Gallagher <sgallagh@redhat.com>
---
modulemd/common/tests/test-valgrind.py | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/modulemd/common/tests/test-valgrind.py b/modulemd/common/tests/test-valgrind.py
index 94bf6e0dc5b437751189b0f5ea2eb27660a13227..9f193207ceff1cc85b34ec2dd8fe19d21a5bfd73 100644
--- a/modulemd/common/tests/test-valgrind.py
+++ b/modulemd/common/tests/test-valgrind.py
@@ -46,14 +46,16 @@ for test in unfiltered_tests:
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
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)
+ "--xml-file=%s/%s.xml " % (tmpdirname, test)
proc_result = subprocess.run(
[
'meson',
'test',
'-t', '10',
--
2.20.1

View File

@ -1,9 +1,9 @@
%global libmodulemd_version 2.0.0
%global libmodulemd_v1_version 1.8.0
%global libmodulemd_version 2.1.0
%global libmodulemd_v1_version 1.8.2
Name: libmodulemd
Version: %{libmodulemd_version}
Release: 3%{?dist}
Release: 1%{?dist}
Summary: Module metadata manipulation library
License: MIT
@ -28,9 +28,6 @@ Obsoletes: python2-modulemd < 1.3.4
Obsoletes: python3-modulemd < 1.3.4
# Patches
Patch0001: 0001-Include-modified-value-when-copying-Defaults-objects.patch
Patch0002: 0002-Always-sort-the-dependencies.patch
Patch0003: 0003-Use-glib2-valgrind-suppression-file.patch
%description
C Library for manipulating module metadata files.
@ -173,6 +170,19 @@ ln -s libmodulemd.so.%{libmodulemd_v1_version} \
%{_datadir}/gtk-doc/html/modulemd-1.0/
%changelog
* Sat Jan 26 2019 Stephen Gallagher <sgallagh@redhat.com> - 2.1.0-1
- Update to libmodulemd 2.1.0 and 1.8.2
- Drop upstreamed patches
- Add new API ModuleStream.depends_on_stream() and
ModuleStream.build_depends_on_stream() to help support auto-detection of
when a module stream may need to be rebuilt when its dependencies change.
- Don't fail merges when default streams differ, treat it as "no default for
this module"
- Fix error message
- Copy modified value when copying Modulemd.Defaults objects
- Fixes discovered by clang and coverity static analysis tools
- Test improvements
* Fri Jan 11 2019 Stephen Gallagher <sgallagh@redhat.com> - 2.0.0-3
- Fix ordering issue with dependencies
- Use glib2 suppression file when running valgrind tests

View File

@ -1 +1 @@
SHA512 (modulemd-2.0.0.tar.xz) = 6069d10fdf92e6e906693972bef55d1342e2eb1e092cb651b24d3ca7bb98c802b53dc5aa6a8206ca791697b6eb919f28a5ca36cb864433e3c34b914f9871c05e
SHA512 (modulemd-2.1.0.tar.xz) = 565a248ed32b64e31419efd023defe12a9799b584b7dc21139453ad46a96799d5018a0aefb4f2b356d61cbf16ebe17381548f13c49db61643690ef9b8090f2ee