import libmodulemd-2.5.0-2.el8

This commit is contained in:
CentOS Sources 2019-11-05 15:22:41 -05:00 committed by Andrew Lukoshko
parent 4f08b48951
commit 073c599424
8 changed files with 347 additions and 666 deletions

2
.gitignore vendored
View File

@ -1 +1 @@
SOURCES/modulemd-2.0.0.tar.xz
SOURCES/modulemd-2.5.0.tar.xz

View File

@ -1 +1 @@
e242f10ac0185da47cc54d0253cb0f8a80633ff4 SOURCES/modulemd-2.0.0.tar.xz
2b6c3443a36ec821fd289ae6605e9dea4c5dbcda SOURCES/modulemd-2.5.0.tar.xz

View File

@ -1,543 +0,0 @@
From 774f36026f1d3a4215be67845c2873135ceab6e4 Mon Sep 17 00:00:00 2001
From: Stephen Gallagher <sgallagh@redhat.com>
Date: Wed, 16 Jan 2019 13:21:44 -0500
Subject: [PATCH] Don't fail merges when default streams differ
Instead of failing the merge on a default stream conflict, we will
instead treat it as having no default set. This is safe because if
the module is not yet installed, then this just means its packages
aren't visible and it needs to be selected explicitly.
If some packages from it are already installed, then the module
stream is already set, and thus changing the default won't matter.
Update documentation to reflect modified field in Defaults
Resolves: rhbz#1666871
Signed-off-by: Stephen Gallagher <sgallagh@redhat.com>
---
.../modulemd-1.0/private/modulemd-private.h | 2 +
modulemd/v1/modulemd-defaults.c | 39 +++++++----
modulemd/v1/tests/test-modulemd-defaults.c | 66 ++++++++++++++++++-
.../modulemd-module-index-merger.h | 18 +++--
.../private/modulemd-defaults-v1-private.h | 2 +
modulemd/v2/modulemd-defaults-v1.c | 59 +++++++++++------
modulemd/v2/tests/ModulemdTests/merger.py | 33 +++++++---
.../v2/tests/test_data/overriding-nodejs.yaml | 11 ++++
test_data/defaults/overriding-nodejs.yaml | 10 +++
9 files changed, 191 insertions(+), 49 deletions(-)
create mode 100644 modulemd/v2/tests/test_data/overriding-nodejs.yaml
create mode 100644 test_data/defaults/overriding-nodejs.yaml
diff --git a/modulemd/v1/include/modulemd-1.0/private/modulemd-private.h b/modulemd/v1/include/modulemd-1.0/private/modulemd-private.h
index 20604efab843de6ac64cd9e181ce93d7e3a798fe..e9a785aed0d38598ce08d58e7e507d01698788a0 100644
--- a/modulemd/v1/include/modulemd-1.0/private/modulemd-private.h
+++ b/modulemd/v1/include/modulemd-1.0/private/modulemd-private.h
@@ -24,10 +24,12 @@ enum
MD_VERSION_MAX = G_MAXUINT64
};
#define MD_VERSION_LATEST MD_VERSION_2
+#define DEFAULT_MERGE_CONFLICT "__merge_conflict__"
+
ModulemdModule *
modulemd_module_new_from_modulestream (ModulemdModuleStream *stream);
ModulemdModuleStream *
modulemd_module_peek_modulestream (ModulemdModule *self);
diff --git a/modulemd/v1/modulemd-defaults.c b/modulemd/v1/modulemd-defaults.c
index 77ce30733945e30ffb8368986fa8c54c45697b5a..d44076eef0ac3bffae05f74b852fb6b51c2aee64 100644
--- a/modulemd/v1/modulemd-defaults.c
+++ b/modulemd/v1/modulemd-defaults.c
@@ -12,10 +12,11 @@
*/
#include "modulemd.h"
#include "modulemd-defaults.h"
#include "modulemd-simpleset.h"
+#include "private/modulemd-private.h"
#include "private/modulemd-yaml.h"
GQuark
modulemd_defaults_error_quark (void)
@@ -146,19 +147,38 @@ modulemd_defaults_set_default_stream (ModulemdDefaults *self,
const gchar *
modulemd_defaults_peek_default_stream (ModulemdDefaults *self)
{
g_return_val_if_fail (self, NULL);
+ if (self->default_stream &&
+ g_str_equal (self->default_stream, DEFAULT_MERGE_CONFLICT))
+ {
+ /* During an index merge, we determined that this was in conflict
+ * with another set of ModulemdDefaults for the same module. If we
+ * see this, treat it as no default stream when querying for it.
+ */
+ return NULL;
+ }
return self->default_stream;
}
gchar *
modulemd_defaults_dup_default_stream (ModulemdDefaults *self)
{
g_return_val_if_fail (self, NULL);
+ if (self->default_stream &&
+ g_str_equal (self->default_stream, DEFAULT_MERGE_CONFLICT))
+ {
+ /* During an index merge, we determined that this was in conflict
+ * with another set of ModulemdDefaults for the same module. If we
+ * see this, treat it as no default stream when querying for it.
+ */
+ return NULL;
+ }
+
return g_strdup (self->default_stream);
}
void
@@ -753,28 +773,25 @@ modulemd_defaults_merge (ModulemdDefaults *first,
/* They had the same 'modified' value (such as both zero, for
* backwards-compatibility with 1.7.x and older.
* Merge them as best we can.
*/
+ defaults = modulemd_defaults_copy (first);
+
/* First check for incompatibilities with the streams */
- if (g_strcmp0 (modulemd_defaults_peek_default_stream (first),
- modulemd_defaults_peek_default_stream (second)))
+ if (g_strcmp0 (first->default_stream, second->default_stream))
{
/* Default streams don't match and override is not set.
* Return an error
*/
- g_set_error (
- error,
- MODULEMD_DEFAULTS_ERROR,
- MODULEMD_DEFAULTS_ERROR_CONFLICTING_STREAMS,
- "Conflicting default streams when merging defaults for module %s",
- modulemd_defaults_peek_module_name (first));
- return NULL;
+ /* They have conflicting default streams */
+ g_info ("Module stream mismatch in merge: %s != %s",
+ first->default_stream,
+ second->default_stream);
+ modulemd_defaults_set_default_stream (defaults, DEFAULT_MERGE_CONFLICT);
}
- defaults = modulemd_defaults_copy (first);
-
/* Merge the profile defaults */
profile_defaults = modulemd_defaults_peek_profile_defaults (defaults);
g_hash_table_iter_init (&iter,
modulemd_defaults_peek_profile_defaults (second));
diff --git a/modulemd/v1/tests/test-modulemd-defaults.c b/modulemd/v1/tests/test-modulemd-defaults.c
index 5d032d83cbca4046af13719f68bdbc6778d6879e..35142b885b3ec30f5109d53befe17be3e08d7b5a 100644
--- a/modulemd/v1/tests/test-modulemd-defaults.c
+++ b/modulemd/v1/tests/test-modulemd-defaults.c
@@ -602,10 +602,11 @@ modulemd_defaults_test_prioritizer (DefaultsFixture *fixture,
{
g_autofree gchar *yaml_base_path = NULL;
g_autofree gchar *yaml_override_path = NULL;
g_autoptr (GPtrArray) base_objects = NULL;
g_autoptr (GPtrArray) override_objects = NULL;
+ g_autoptr (GPtrArray) override_nodejs_objects = NULL;
g_autoptr (GPtrArray) merged_objects = NULL;
g_autoptr (ModulemdPrioritizer) prioritizer = NULL;
g_autoptr (GError) error = NULL;
GHashTable *htable = NULL;
gint64 prio;
@@ -618,10 +619,22 @@ modulemd_defaults_test_prioritizer (DefaultsFixture *fixture,
base_objects = modulemd_objects_from_file (yaml_base_path, &error);
g_assert_nonnull (base_objects);
g_assert_cmpint (base_objects->len, ==, 7);
+
+ yaml_override_path =
+ g_strdup_printf ("%s/test_data/defaults/overriding-nodejs.yaml",
+ g_getenv ("MESON_SOURCE_ROOT"));
+ g_assert_nonnull (yaml_override_path);
+
+ override_nodejs_objects =
+ modulemd_objects_from_file (yaml_override_path, &error);
+ g_clear_pointer (&yaml_override_path, g_free);
+ g_assert_nonnull (override_nodejs_objects);
+ g_assert_cmpint (override_nodejs_objects->len, ==, 1);
+
yaml_override_path = g_strdup_printf (
"%s/test_data/defaults/overriding.yaml", g_getenv ("MESON_SOURCE_ROOT"));
g_assert_nonnull (yaml_override_path);
override_objects = modulemd_objects_from_file (yaml_override_path, &error);
@@ -659,10 +672,52 @@ modulemd_defaults_test_prioritizer (DefaultsFixture *fixture,
fprintf (stderr, "Merge error: %s", error->message);
}
g_assert_true (result);
+ /*
+ * Test that importing the nodejs overrides at the same priority level fails.
+ *
+ * This YAML has a conflicting default stream which should be ignored and set
+ * to "no default stream".
+ */
+
+ result = modulemd_prioritizer_add (
+ prioritizer, override_nodejs_objects, prio, &error);
+ g_assert_true (result);
+
+ merged_objects = modulemd_prioritizer_resolve (prioritizer, &error);
+ g_assert_nonnull (merged_objects);
+ g_assert_cmpint (merged_objects->len, ==, 3);
+
+ for (gint i = 0; i < merged_objects->len; i++)
+ {
+ if (MODULEMD_IS_DEFAULTS (g_ptr_array_index (merged_objects, i)))
+ {
+ defaults = g_ptr_array_index (merged_objects, i);
+ if (!g_strcmp0 (modulemd_defaults_peek_module_name (defaults),
+ "nodejs"))
+ {
+ g_assert_null (modulemd_defaults_peek_default_stream (defaults));
+ }
+ }
+ }
+
+ g_clear_pointer (&merged_objects, g_ptr_array_unref);
+
+
+ /* Start over and test profile conflicts */
+ g_clear_pointer (&prioritizer, g_object_unref);
+ prioritizer = modulemd_prioritizer_new ();
+ result = modulemd_prioritizer_add (prioritizer, base_objects, prio, &error);
+ if (!result)
+ {
+ fprintf (stderr, "Merge error: %s", error->message);
+ }
+ g_assert_true (result);
+
+
/*
* Test that importing the overrides at the same priority level fails.
*
* These objects have several conflicts with the base objects that cannot be
* merged.
@@ -671,11 +726,11 @@ modulemd_defaults_test_prioritizer (DefaultsFixture *fixture,
modulemd_prioritizer_add (prioritizer, override_objects, prio, &error);
g_assert_false (result);
g_assert_cmpstr (
g_quark_to_string (error->domain), ==, "modulemd-defaults-error-quark");
g_assert_cmpint (
- error->code, ==, MODULEMD_DEFAULTS_ERROR_CONFLICTING_STREAMS);
+ error->code, ==, MODULEMD_DEFAULTS_ERROR_CONFLICTING_PROFILES);
g_clear_pointer (&error, g_error_free);
/* The object's internal state is undefined after an error, so delete it */
g_clear_pointer (&prioritizer, g_object_unref);
@@ -987,11 +1042,11 @@ modulemd_defaults_test_index_prioritizer (DefaultsFixture *fixture,
modulemd_prioritizer_add_index (prioritizer, override_index, prio, &error);
g_assert_false (result);
g_assert_cmpstr (
g_quark_to_string (error->domain), ==, "modulemd-defaults-error-quark");
g_assert_cmpint (
- error->code, ==, MODULEMD_DEFAULTS_ERROR_CONFLICTING_STREAMS);
+ error->code, ==, MODULEMD_DEFAULTS_ERROR_CONFLICTING_PROFILES);
g_clear_pointer (&error, g_error_free);
/* The object's internal state is undefined after an error, so delete it */
g_clear_pointer (&prioritizer, g_object_unref);
@@ -1138,10 +1193,15 @@ modulemd_regressions_issue44 (DefaultsFixture *fixture,
g_assert_true (result);
/* Add another almost-identical document, except with a conflicting default
* stream set.
+ *
+ * NOTE: when this was written (for issue 44 on GitHub), this was meant to be
+ * a hard error. As of 1.8.1 we expect this to just result in having no
+ * default stream for this module. This test has been slightly modified so
+ * that the expected result is now a pass.
*/
yaml_conflicting_path = g_strdup_printf (
"%s/test_data/defaults/issue44-2.yaml", g_getenv ("MESON_SOURCE_ROOT"));
g_assert_nonnull (yaml_conflicting_path);
@@ -1149,11 +1209,11 @@ modulemd_regressions_issue44 (DefaultsFixture *fixture,
modulemd_objects_from_file (yaml_conflicting_path, &error);
g_assert_nonnull (conflicting_objects);
result =
modulemd_prioritizer_add (prioritizer, conflicting_objects, 0, &error);
- g_assert_false (result);
+ g_assert_true (result);
}
static void
modulemd_regressions_issue45 (DefaultsFixture *fixture,
diff --git a/modulemd/v2/include/modulemd-2.0/modulemd-module-index-merger.h b/modulemd/v2/include/modulemd-2.0/modulemd-module-index-merger.h
index 27cccb738dc805724268afa04acc13d4e250eae2..b019f0ed856684a003e9c2f6abefc70e1448246a 100644
--- a/modulemd/v2/include/modulemd-2.0/modulemd-module-index-merger.h
+++ b/modulemd/v2/include/modulemd-2.0/modulemd-module-index-merger.h
@@ -51,22 +51,30 @@ G_BEGIN_DECLS
* there exists two #ModulemdModuleStream entries that have different content
* for the same NSVC, the behavior is undefined.
*
* Merging #ModulemdDefaults entries behaves as follows:
*
+ * - Within a ModuleIndex, if two or more default entries reference the same
+ * module, the one with the highest modified field will be used and the
+ * others discarded.
+ * - When merging ModuleIndexes, if two or more indexes contain Defaults for
+ * the same module, but different modified values, the one with the highest
+ * modified value will be used and the others discarded.
* - Any module default that is provided by a single repository is
* authoritative.
* - If the repos have different priorities (not common), then the default for
* this module and stream name coming from the repo of higher priority will
- * be used and the default from the lower-priority repo will not be included.
+ * be used and the default from the lower-priority repo will not be included
+ * even if it has a higher modified value.
* - If the repos have the same priority (such as "fedora" and "updates" in the
- * Fedora Project), the entries will be merged as follows:
- * - If both repositories specify a default stream for the module, use it.
+ * Fedora Project) and modified value, the entries will be merged as follows:
+ * - If both repositories specify the same default stream for the module, use
+ * it.
* - If either repository specifies a default stream for the module and the
* other does not, use the one specified.
- * - If both repositories specify different streams, this is an unresolvable
- * merge conflict and the merge resolution will fail and report an error.
+ * - If both repositories specify different default streams, the merge will
+ * unset the default stream and proceed with the merge.
* - If both repositories specify a set of default profiles for a stream and
* the sets are equivalent, use that set.
* - If one repository specifies a set of default profiles for a stream and
* the other does not, use the one specified.
* - If both repositories specify a set of default profiles for a stream and
diff --git a/modulemd/v2/include/modulemd-2.0/private/modulemd-defaults-v1-private.h b/modulemd/v2/include/modulemd-2.0/private/modulemd-defaults-v1-private.h
index 9cac6cc53175a0eecca986f4fa96a7b7b1070957..de2ede98e6fb49bfd792b5f2913868fad6ff27db 100644
--- a/modulemd/v2/include/modulemd-2.0/private/modulemd-defaults-v1-private.h
+++ b/modulemd/v2/include/modulemd-2.0/private/modulemd-defaults-v1-private.h
@@ -26,10 +26,12 @@ G_BEGIN_DECLS
* @stability: private
* @short_description: #ModulemdDefault methods that should only be used by
* internal consumers.
*/
+#define DEFAULT_MERGE_CONFLICT "__merge_conflict__"
+
/**
* modulemd_defaults_v1_parse_yaml:
* @subdoc: (in): A #ModulemdSubdocumentInfo representing a defaults document
* of metadata version 1.
* @strict: (in): Whether the parser should return failure if it encounters an
diff --git a/modulemd/v2/modulemd-defaults-v1.c b/modulemd/v2/modulemd-defaults-v1.c
index c8f983105b529519365d0a653d8d07715f610b97..1c1cdd7b1036734a477b72d12f12526af1de777d 100644
--- a/modulemd/v2/modulemd-defaults-v1.c
+++ b/modulemd/v2/modulemd-defaults-v1.c
@@ -179,11 +179,22 @@ modulemd_defaults_v1_get_default_stream (ModulemdDefaultsV1 *self,
{
const gchar *default_stream = NULL;
g_return_val_if_fail (MODULEMD_IS_DEFAULTS_V1 (self), NULL);
if (!intent)
- return self->default_stream;
+ {
+ if (self->default_stream &&
+ g_str_equal (self->default_stream, DEFAULT_MERGE_CONFLICT))
+ {
+ /* During an index merge, we determined that this was in conflict
+ * with another set of ModulemdDefaults for the same module. If we
+ * see this, treat it as no default stream when querying for it.
+ */
+ return NULL;
+ }
+ return self->default_stream;
+ }
default_stream = g_hash_table_lookup (self->intent_default_streams, intent);
if (default_stream)
{
if (default_stream[0] == '\0')
@@ -1159,12 +1170,10 @@ ModulemdDefaults *
modulemd_defaults_v1_merge (const gchar *module_name,
ModulemdDefaultsV1 *from,
ModulemdDefaultsV1 *into,
GError **error)
{
- const gchar *into_default_stream;
- const gchar *from_default_stream;
g_autoptr (ModulemdDefaultsV1) merged = NULL;
GHashTableIter iter;
gpointer key, value;
GHashTable *intent_profiles = NULL;
GHashTable *merged_intent_profiles = NULL;
@@ -1175,37 +1184,45 @@ modulemd_defaults_v1_merge (const gchar *module_name,
g_autoptr (GError) nested_error = NULL;
merged = modulemd_defaults_v1_new (module_name);
/* Merge the default streams */
- into_default_stream = modulemd_defaults_v1_get_default_stream (into, NULL);
- from_default_stream = modulemd_defaults_v1_get_default_stream (from, NULL);
-
- if (into_default_stream && !from_default_stream)
+ if (into->default_stream && !from->default_stream)
{
modulemd_defaults_v1_set_default_stream (
- merged, into_default_stream, NULL);
+ merged, into->default_stream, NULL);
}
- else if (from_default_stream && !into_default_stream)
+ else if (from->default_stream && !into->default_stream)
{
modulemd_defaults_v1_set_default_stream (
- merged, from_default_stream, NULL);
+ merged, from->default_stream, NULL);
}
- else if (into_default_stream && from_default_stream)
+ else if (into->default_stream && from->default_stream)
{
- if (!g_str_equal (into_default_stream, from_default_stream))
+ if (g_str_equal (into->default_stream, DEFAULT_MERGE_CONFLICT))
{
- g_set_error (error,
- MODULEMD_ERROR,
- MODULEMD_ERROR_VALIDATE,
- "Module stream mismatch in merge: %s != %s",
- into_default_stream,
- from_default_stream);
- return NULL;
+ /* A previous pass over this same module encountered a merge
+ * conflict, so we need to propagate that.
+ */
+ modulemd_defaults_v1_set_default_stream (
+ merged, DEFAULT_MERGE_CONFLICT, NULL);
+ }
+ else if (!g_str_equal (into->default_stream, from->default_stream))
+ {
+ /* They have conflicting default streams */
+ g_info ("Module stream mismatch in merge: %s != %s",
+ into->default_stream,
+ from->default_stream);
+ modulemd_defaults_v1_set_default_stream (
+ merged, DEFAULT_MERGE_CONFLICT, NULL);
+ }
+ else
+ {
+ /* They're the same, so store that */
+ modulemd_defaults_v1_set_default_stream (
+ merged, into->default_stream, NULL);
}
- modulemd_defaults_v1_set_default_stream (
- merged, into_default_stream, NULL);
}
else
{
/* Both values were NULL.
* Nothing to do, leave it blank.
diff --git a/modulemd/v2/tests/ModulemdTests/merger.py b/modulemd/v2/tests/ModulemdTests/merger.py
index e7cbf4214bb111fbc5732fe983ee5ccee134fd83..49c2722959486aeb250d88daf7f068cacc8c3fe7 100644
--- a/modulemd/v2/tests/ModulemdTests/merger.py
+++ b/modulemd/v2/tests/ModulemdTests/merger.py
@@ -104,26 +104,41 @@ class TestModuleIndexMerger(TestBase):
self.assertEqual(
len(httpd_defaults.get_default_profiles_for_stream('2.4', 'workstation')), 1)
self.assertEqual(
len(httpd_defaults.get_default_profiles_for_stream('2.6', 'workstation')), 3)
+ # Get another set of objects that will override the default stream for
+ # nodejs
+ override_nodejs_index = Modulemd.ModuleIndex()
+ override_nodejs_index.update_from_file(
+ path.join(
+ self.source_root,
+ "modulemd/v2/tests/test_data/overriding-nodejs.yaml"), True)
+
+ # Test that adding both of these at the same priority level results in
+ # the no default stream
+ merger = Modulemd.ModuleIndexMerger()
+ merger.associate_index(base_index, 0)
+ merger.associate_index(override_nodejs_index, 0)
+
+ merged_index = merger.resolve()
+ self.assertIsNotNone(merged_index)
+
+ nodejs = merged_index.get_module('nodejs')
+ self.assertIsNotNone(nodejs)
+
+ nodejs_defaults = nodejs.get_defaults()
+ self.assertIsNotNone(nodejs_defaults)
+ self.assertIsNone(nodejs_defaults.get_default_stream())
+
# Get another set of objects that will override the above
override_index = Modulemd.ModuleIndex()
override_index.update_from_file(
path.join(
self.source_root,
"modulemd/v2/tests/test_data/overriding.yaml"), True)
- # Test that adding both of these at the same priority level fails
- # with a merge conflict.
- merger = Modulemd.ModuleIndexMerger()
- merger.associate_index(base_index, 0)
- merger.associate_index(override_index, 0)
-
- with self.assertRaisesRegex(GLib.GError, 'Module stream mismatch in merge'):
- merged_index = merger.resolve()
-
# Test that override_index at a higher priority level succeeds
# Test that adding both of these at the same priority level fails
# with a merge conflict.
# Use randomly-selected high and low values to make sure we don't have
# sorting issues.
diff --git a/modulemd/v2/tests/test_data/overriding-nodejs.yaml b/modulemd/v2/tests/test_data/overriding-nodejs.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..b588f5f542d84755fa74fc1dbf059c0766d2a712
--- /dev/null
+++ b/modulemd/v2/tests/test_data/overriding-nodejs.yaml
@@ -0,0 +1,11 @@
+---
+# Override the default stream
+document: modulemd-defaults
+version: 1
+data:
+ module: nodejs
+ stream: '9.0'
+ profiles:
+ '6.0': [default]
+ '8.0': [super]
+ '9.0': [supermegaultra]
\ No newline at end of file
diff --git a/test_data/defaults/overriding-nodejs.yaml b/test_data/defaults/overriding-nodejs.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..937a2b899afc6b5254fd3b3e61e5b32035a3130a
--- /dev/null
+++ b/test_data/defaults/overriding-nodejs.yaml
@@ -0,0 +1,10 @@
+---
+document: modulemd-defaults
+version: 1
+data:
+ module: nodejs
+ stream: '9.0'
+ profiles:
+ '6.0': [default]
+ '8.0': [super]
+ '9.0': [supermegaultra]
\ No newline at end of file
--
2.20.1

View File

@ -0,0 +1,29 @@
From 1a7bf143761ff8e3f4f6585b82c0be4dbd511fca Mon Sep 17 00:00:00 2001
From: Stephen Gallagher <sgallagh@redhat.com>
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 <sgallagh@redhat.com>
---
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

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

@ -0,0 +1,136 @@
From d9b41f72d4b2d545b2600aff7bd8a27ed0093750 Mon Sep 17 00:00:00 2001
From: Stephen Gallagher <sgallagh@redhat.com>
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 <sgallagh@redhat.com>
---
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

View File

@ -0,0 +1,150 @@
From 340e316bd6384562086b4e381c8cd42b1ccd0781 Mon Sep 17 00:00:00 2001
From: Stephen Gallagher <sgallagh@redhat.com>
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 <sgallagh@redhat.com>
---
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
+# <https://www.gnu.org/philosophy/free-sw.en.html>.
+
+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

View File

@ -1,16 +1,16 @@
%global libmodulemd_version 2.0.0
%global libmodulemd_v1_version 1.8.0
%global libmodulemd_version 2.5.0
%global libmodulemd_v1_version 1.8.11
Name: libmodulemd
Version: %{libmodulemd_version}
Release: 5%{?dist}
Release: 2%{?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
BuildRequires: meson >= 0.45.1-3
BuildRequires: meson >= 0.47
BuildRequires: pkgconfig
BuildRequires: gcc
BuildRequires: gcc-c++
@ -24,15 +24,15 @@ BuildRequires: python3-gobject-base
BuildRequires: valgrind
%endif
Obsoletes: python2-modulemd < 1.3.4
Obsoletes: python3-modulemd < 1.3.4
# Make sure we upgrade libmodulemd1 to match
Conflicts: libmodulemd1 < %{libmodulemd_v1_version}-%{release}
# Patches
Patch0001: 0001-Include-modified-value-when-copying-Defaults-objects.patch
Patch0002: 0001-Don-t-fail-merges-when-default-streams-differ.patch
Patch0001: 0001-Double-valgrind-timeout.patch
Patch0002: 0002-Parallelize-the-valgrind-tests.patch
Patch0003: 0003-Fix-transfer-type-for-Module.search_streams.patch
%description
C Library for manipulating module metadata files.
@ -42,9 +42,9 @@ more details.
%package -n python3-%{name}
Summary: Python 3 bindings for %{name}
BuildArch: noarch
Requires: libmodulemd = %{version}-%{release}
Requires: %{name}%{?_isa} = %{version}-%{release}
Requires: python3-gobject-base
Requires: %{py3_dist six}
Obsoletes: python3-modulemd < 1.3.4
%description -n python3-%{name}
@ -88,10 +88,12 @@ Development files for libmodulemd 1.x
%package -n python3-libmodulemd1
Summary: Python 3 bindings for %{name}1
Version: %{libmodulemd_v1_version}
BuildArch: noarch
Requires: libmodulemd1 = %{libmodulemd_v1_version}-%{release}
Requires: python3-gobject-base
Obsoletes: python3-libmodulemd < 2
Provides: python3-libmodulemd = %{libmodulemd_v1_version}-%{release}
%description -n python3-libmodulemd1
Python 3 bindings for libmodulemd1
@ -106,7 +108,7 @@ Python 3 bindings for libmodulemd1
%meson_build
%define _vpath_builddir api2
%meson -Ddeveloper_build=false -Dbuild_api_v1=false -Dbuild_api_v2=true
%meson -Ddeveloper_build=false -Dbuild_api_v1=false -Dbuild_api_v2=true -Dwith_py3_overrides=true -Dwith_py2_overrides=false
%meson_build
@ -114,7 +116,7 @@ Python 3 bindings for libmodulemd1
export LC_CTYPE=C.utf8
%ifarch %{power64}
%ifarch %{power64} s390x
# Valgrind is broken on ppc64[le] with GCC7:
# https://bugs.kde.org/show_bug.cgi?id=386945
export MMD_SKIP_VALGRIND=1
@ -148,7 +150,6 @@ ln -s libmodulemd.so.%{libmodulemd_v1_version} \
%{_libdir}/%{name}.so.2*
%dir %{_libdir}/girepository-1.0
%{_libdir}/girepository-1.0/Modulemd-2.0.typelib
%{python3_sitearch}/gi/overrides/
%files devel
@ -163,6 +164,7 @@ ln -s libmodulemd.so.%{libmodulemd_v1_version} \
%files -n python3-%{name}
%{python3_sitearch}/gi/overrides/
%files -n python3-libmodulemd1
@ -189,6 +191,19 @@ ln -s libmodulemd.so.%{libmodulemd_v1_version} \
%changelog
* Wed May 29 2019 Stephen Gallagher <sgallagh@redhat.com> - 2.5.0-2
- Fix memory corruption error using Module.search_rpms() from python
- Speed up valgrind tests
- Resolves: rhbz#1714766
* Wed May 22 2019 Stephen Gallagher <sgallagh@redhat.com> - 2.5.0-1
- Rebase to 2.5.0 and 1.8.11
- Related: rhbz#1693680
* Mon May 13 2019 Stephen Gallagher <sgallagh@redhat.com> - 2.4.0-1
- Rebase to 2.4.0 and 1.8.10
- Resolves: rhbz#1693680
* Fri Jan 18 2019 Stephen Gallagher <sgallagh@redhat.com> - 2.0.0-5
- Don't fail merges when default streams differ
- Resolves: rhbz#1666871