Skip to content

Commit 3f11316

Browse files
committed
Add ModuleStream.depends_on_stream()
Adds two new functions for streams to determine whether they apply to a particular module and stream. This is primarily useful during mass-rebuild processing. Fixes: #173 Signed-off-by: Stephen Gallagher <[email protected]>
1 parent be8ea44 commit 3f11316

File tree

9 files changed

+406
-2
lines changed

9 files changed

+406
-2
lines changed

modulemd/v2/include/modulemd-2.0/modulemd-module-stream.h

Lines changed: 40 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -70,9 +70,17 @@ struct _ModulemdModuleStreamClass
7070

7171
guint64 (*get_mdversion) (ModulemdModuleStream *self);
7272

73-
/* Padding to allow adding up to 10 new virtual functions without
73+
gboolean (*depends_on_stream) (ModulemdModuleStream *self,
74+
const gchar *module_name,
75+
const gchar *stream_name);
76+
77+
gboolean (*build_depends_on_stream) (ModulemdModuleStream *self,
78+
const gchar *module_name,
79+
const gchar *stream_name);
80+
81+
/* Padding to allow adding up to 8 new virtual functions without
7482
* breaking ABI. */
75-
gpointer padding[10];
83+
gpointer padding[8];
7684
};
7785

7886

@@ -349,4 +357,34 @@ gchar *
349357
modulemd_module_stream_get_nsvc_as_string (ModulemdModuleStream *self);
350358

351359

360+
/**
361+
* modulemd_module_stream_depends_on_stream:
362+
* @self: (not nullable): This #ModulemdModuleStream.
363+
* @module_name: (not nullable): A module name
364+
* @stream_name: (not nullable): The stream of the module
365+
*
366+
* Since: 2.1
367+
*
368+
* Stability: unstable
369+
*/
370+
gboolean
371+
modulemd_module_stream_depends_on_stream (ModulemdModuleStream *self,
372+
const gchar *module_name,
373+
const gchar *stream_name);
374+
375+
376+
/**
377+
* modulemd_module_stream_build_depends_on_stream:
378+
* @self: (not nullable): This #ModulemdModuleStream.
379+
* @module_name: (not nullable): A module name
380+
* @stream_name: (not nullable): The stream of the module
381+
*
382+
* Since: 2.1
383+
*
384+
* Stability: unstable
385+
*/
386+
gboolean
387+
modulemd_module_stream_build_depends_on_stream (ModulemdModuleStream *self,
388+
const gchar *module_name,
389+
const gchar *stream_name);
352390
G_END_DECLS

modulemd/v2/include/modulemd-2.0/private/modulemd-dependencies-private.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,3 +67,14 @@ modulemd_dependencies_emit_yaml (ModulemdDependencies *self,
6767

6868
gboolean
6969
modulemd_dependencies_validate (ModulemdDependencies *self, GError **error);
70+
71+
72+
gboolean
73+
modulemd_dependencies_requires_module_and_stream (ModulemdDependencies *self,
74+
const gchar *module_name,
75+
const gchar *stream_name);
76+
gboolean
77+
modulemd_dependencies_buildrequires_module_and_stream (
78+
ModulemdDependencies *self,
79+
const gchar *module_name,
80+
const gchar *stream_name);

modulemd/v2/modulemd-dependencies.c

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -616,3 +616,72 @@ modulemd_dependencies_emit_yaml (ModulemdDependencies *self,
616616
}
617617
return TRUE;
618618
}
619+
620+
621+
static gboolean
622+
requires_module_and_stream (GHashTable *modules,
623+
const gchar *module_name,
624+
const gchar *stream_name)
625+
{
626+
GHashTable *streams = NULL;
627+
GHashTableIter iter;
628+
gpointer key, value;
629+
g_autofree gchar *negated = NULL;
630+
631+
streams = g_hash_table_lookup (modules, module_name);
632+
/* If the module doesn't appear at all, return false */
633+
if (!streams)
634+
{
635+
return FALSE;
636+
}
637+
638+
/* Check whether this module is the empty set (which means "all streams") */
639+
if (g_hash_table_size (streams) == 0)
640+
{
641+
return TRUE;
642+
}
643+
644+
/* Check whether it includes the stream name explicitly */
645+
if (g_hash_table_contains (streams, stream_name))
646+
{
647+
return TRUE;
648+
}
649+
650+
651+
/* Get the first item from the table and check if it's a negation */
652+
negated = g_strdup_printf ("-%s", stream_name);
653+
654+
g_hash_table_iter_init (&iter, streams);
655+
g_hash_table_iter_next (&iter, &key, &value);
656+
657+
/* If we have a negative value for any entry, they all must be negative.
658+
* Check whether we're explicitly excluding the requested stream */
659+
if (((const gchar *)key)[0] == '-' &&
660+
(!g_hash_table_contains (streams, negated)))
661+
{
662+
return TRUE;
663+
}
664+
665+
return FALSE;
666+
}
667+
668+
669+
gboolean
670+
modulemd_dependencies_requires_module_and_stream (ModulemdDependencies *self,
671+
const gchar *module_name,
672+
const gchar *stream_name)
673+
{
674+
return requires_module_and_stream (
675+
self->runtime_deps, module_name, stream_name);
676+
}
677+
678+
679+
gboolean
680+
modulemd_dependencies_buildrequires_module_and_stream (
681+
ModulemdDependencies *self,
682+
const gchar *module_name,
683+
const gchar *stream_name)
684+
{
685+
return requires_module_and_stream (
686+
self->buildtime_deps, module_name, stream_name);
687+
}

modulemd/v2/modulemd-module-stream-v1.c

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1065,6 +1065,52 @@ modulemd_module_stream_v1_copy (ModulemdModuleStream *self,
10651065
}
10661066

10671067

1068+
static gboolean
1069+
modulemd_module_stream_v1_depends_on_stream (ModulemdModuleStream *self,
1070+
const gchar *module_name,
1071+
const gchar *stream_name)
1072+
{
1073+
const gchar *stream = NULL;
1074+
ModulemdModuleStreamV1 *v1_self = NULL;
1075+
1076+
g_return_val_if_fail (MODULEMD_IS_MODULE_STREAM_V1 (self), FALSE);
1077+
g_return_val_if_fail (module_name && stream_name, FALSE);
1078+
1079+
v1_self = MODULEMD_MODULE_STREAM_V1 (self);
1080+
1081+
stream = g_hash_table_lookup (v1_self->runtime_deps, module_name);
1082+
if (!stream)
1083+
{
1084+
return FALSE;
1085+
}
1086+
1087+
return g_str_equal (stream, stream_name);
1088+
}
1089+
1090+
1091+
static gboolean
1092+
modulemd_module_stream_v1_build_depends_on_stream (ModulemdModuleStream *self,
1093+
const gchar *module_name,
1094+
const gchar *stream_name)
1095+
{
1096+
const gchar *stream = NULL;
1097+
ModulemdModuleStreamV1 *v1_self = NULL;
1098+
1099+
g_return_val_if_fail (MODULEMD_IS_MODULE_STREAM_V1 (self), FALSE);
1100+
g_return_val_if_fail (module_name && stream_name, FALSE);
1101+
1102+
v1_self = MODULEMD_MODULE_STREAM_V1 (self);
1103+
1104+
stream = g_hash_table_lookup (v1_self->buildtime_deps, module_name);
1105+
if (!stream)
1106+
{
1107+
return FALSE;
1108+
}
1109+
1110+
return g_str_equal (stream, stream_name);
1111+
}
1112+
1113+
10681114
static void
10691115
modulemd_module_stream_v1_class_init (ModulemdModuleStreamV1Class *klass)
10701116
{
@@ -1079,6 +1125,10 @@ modulemd_module_stream_v1_class_init (ModulemdModuleStreamV1Class *klass)
10791125
stream_class->get_mdversion = modulemd_module_stream_v1_get_mdversion;
10801126
stream_class->copy = modulemd_module_stream_v1_copy;
10811127
stream_class->validate = modulemd_module_stream_v1_validate;
1128+
stream_class->depends_on_stream =
1129+
modulemd_module_stream_v1_depends_on_stream;
1130+
stream_class->build_depends_on_stream =
1131+
modulemd_module_stream_v1_build_depends_on_stream;
10821132

10831133
properties[PROP_ARCH] = g_param_spec_string (
10841134
"arch",

modulemd/v2/modulemd-module-stream-v2.c

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -952,6 +952,62 @@ modulemd_module_stream_v2_copy (ModulemdModuleStream *self,
952952
return MODULEMD_MODULE_STREAM (g_steal_pointer (&copy));
953953
}
954954

955+
956+
static gboolean
957+
depends_on_stream (ModulemdModuleStreamV2 *self,
958+
const gchar *module_name,
959+
const gchar *stream_name,
960+
gboolean is_builddep)
961+
{
962+
ModulemdDependencies *dep = NULL;
963+
964+
/* Iterate through all of the dependency objects */
965+
for (gint i = 0; i < self->dependencies->len; i++)
966+
{
967+
dep = g_ptr_array_index (self->dependencies, i);
968+
if (is_builddep)
969+
{
970+
if (modulemd_dependencies_buildrequires_module_and_stream (
971+
dep, module_name, stream_name))
972+
return TRUE;
973+
}
974+
else
975+
{
976+
if (modulemd_dependencies_requires_module_and_stream (
977+
dep, module_name, stream_name))
978+
return TRUE;
979+
}
980+
}
981+
982+
return FALSE;
983+
}
984+
985+
static gboolean
986+
modulemd_module_stream_v2_depends_on_stream (ModulemdModuleStream *self,
987+
const gchar *module_name,
988+
const gchar *stream_name)
989+
{
990+
g_return_val_if_fail (MODULEMD_IS_MODULE_STREAM_V2 (self), FALSE);
991+
g_return_val_if_fail (module_name && stream_name, FALSE);
992+
993+
return depends_on_stream (
994+
MODULEMD_MODULE_STREAM_V2 (self), module_name, stream_name, FALSE);
995+
}
996+
997+
998+
static gboolean
999+
modulemd_module_stream_v2_build_depends_on_stream (ModulemdModuleStream *self,
1000+
const gchar *module_name,
1001+
const gchar *stream_name)
1002+
{
1003+
g_return_val_if_fail (MODULEMD_IS_MODULE_STREAM_V2 (self), FALSE);
1004+
g_return_val_if_fail (module_name && stream_name, FALSE);
1005+
1006+
return depends_on_stream (
1007+
MODULEMD_MODULE_STREAM_V2 (self), module_name, stream_name, TRUE);
1008+
}
1009+
1010+
9551011
static void
9561012
modulemd_module_stream_v2_class_init (ModulemdModuleStreamV2Class *klass)
9571013
{
@@ -966,6 +1022,11 @@ modulemd_module_stream_v2_class_init (ModulemdModuleStreamV2Class *klass)
9661022
stream_class->get_mdversion = modulemd_module_stream_v2_get_mdversion;
9671023
stream_class->copy = modulemd_module_stream_v2_copy;
9681024
stream_class->validate = modulemd_module_stream_v2_validate;
1025+
stream_class->depends_on_stream =
1026+
modulemd_module_stream_v2_depends_on_stream;
1027+
stream_class->build_depends_on_stream =
1028+
modulemd_module_stream_v2_build_depends_on_stream;
1029+
9691030

9701031
properties[PROP_ARCH] = g_param_spec_string (
9711032
"arch",

modulemd/v2/modulemd-module-stream.c

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -958,3 +958,35 @@ modulemd_module_stream_emit_yaml_base (ModulemdModuleStream *self,
958958
/* The rest of the fields will be emitted by the version-specific emitters */
959959
return TRUE;
960960
}
961+
962+
963+
gboolean
964+
modulemd_module_stream_depends_on_stream (ModulemdModuleStream *self,
965+
const gchar *module_name,
966+
const gchar *stream_name)
967+
{
968+
ModulemdModuleStreamClass *klass;
969+
970+
g_return_val_if_fail (MODULEMD_IS_MODULE_STREAM (self), FALSE);
971+
972+
klass = MODULEMD_MODULE_STREAM_GET_CLASS (self);
973+
g_return_val_if_fail (klass->depends_on_stream, FALSE);
974+
975+
return klass->depends_on_stream (self, module_name, stream_name);
976+
}
977+
978+
979+
gboolean
980+
modulemd_module_stream_build_depends_on_stream (ModulemdModuleStream *self,
981+
const gchar *module_name,
982+
const gchar *stream_name)
983+
{
984+
ModulemdModuleStreamClass *klass;
985+
986+
g_return_val_if_fail (MODULEMD_IS_MODULE_STREAM (self), FALSE);
987+
988+
klass = MODULEMD_MODULE_STREAM_GET_CLASS (self);
989+
g_return_val_if_fail (klass->build_depends_on_stream, FALSE);
990+
991+
return klass->build_depends_on_stream (self, module_name, stream_name);
992+
}

modulemd/v2/tests/ModulemdTests/modulestream.py

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1013,6 +1013,31 @@ def test_v1_yaml(self):
10131013
"%s/spec.v1.yaml" % os.getenv('MESON_SOURCE_ROOT'), True)
10141014
assert stream
10151015

1016+
def test_depends_on_stream(self):
1017+
1018+
for version in modulestream_versions:
1019+
stream = Modulemd.ModuleStream.read_file(
1020+
"%s/modulemd/v2/tests/test_data/dependson_v%d.yaml" % (
1021+
os.getenv('MESON_SOURCE_ROOT'),
1022+
version),
1023+
True)
1024+
self.assertIsNotNone(stream)
1025+
1026+
self.assertEqual(stream.depends_on_stream('platform', 'f30'), True)
1027+
self.assertEqual(
1028+
stream.build_depends_on_stream(
1029+
'platform', 'f30'), True)
1030+
1031+
self.assertEqual(
1032+
stream.depends_on_stream(
1033+
'platform', 'f28'), False)
1034+
self.assertEqual(
1035+
stream.build_depends_on_stream(
1036+
'platform', 'f28'), False)
1037+
1038+
self.assertEqual(stream.depends_on_stream('base', 'f30'), False)
1039+
self.assertEqual(stream.depends_on_stream('base', 'f30'), False)
1040+
10161041

10171042
if __name__ == '__main__':
10181043
unittest.main()

0 commit comments

Comments
 (0)