Skip to content

Commit da1eaee

Browse files
mmathesiussgallagher
authored andcommitted
Implement public API PackagerV3.convert_to_index()
Signed-off-by: Merlin Mathesius <[email protected]>
1 parent 265ffcb commit da1eaee

File tree

4 files changed

+431
-0
lines changed

4 files changed

+431
-0
lines changed

modulemd/include/modulemd-2.0/modulemd-packager-v3.h

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
#include "modulemd-build-config.h"
1717
#include "modulemd-component-module.h"
1818
#include "modulemd-component-rpm.h"
19+
#include "modulemd-module-index.h"
1920
#include "modulemd-profile.h"
2021
#include "modulemd-subdocument-info.h"
2122
#include <glib-object.h>
@@ -722,4 +723,23 @@ ModulemdComponentRpm *
722723
modulemd_packager_v3_get_rpm_component (ModulemdPackagerV3 *self,
723724
const gchar *component_name);
724725

726+
727+
/**
728+
* modulemd_packager_v3_convert_to_index:
729+
* @self: (in): This #ModulemdPackagerV3 object.
730+
* @error: (out): A #GError that will return the reason for a conversion error.
731+
*
732+
* Returns: (transfer full): A newly-allocated #ModulemdModuleIndex object
733+
* containing a set of one or more #ModulemdModuleStreamV2 objects and possibly
734+
* a #ModulemdDefaults object corresponding to the #ModulemdPackagerV3 object
735+
* @self. NULL if there was an error doing the mapping and sets @error
736+
* appropriately.
737+
*
738+
* Since: 2.11
739+
*/
740+
ModulemdModuleIndex *
741+
modulemd_packager_v3_convert_to_index (ModulemdPackagerV3 *self,
742+
GError **error);
743+
744+
725745
G_END_DECLS

modulemd/modulemd-packager-v3.c

Lines changed: 192 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -983,6 +983,198 @@ modulemd_packager_v3_to_stream_v2_ext (ModulemdPackagerV3 *self,
983983
}
984984

985985

986+
ModulemdModuleIndex *
987+
modulemd_packager_v3_convert_to_index (ModulemdPackagerV3 *self,
988+
GError **error)
989+
{
990+
g_auto (GStrv) contexts = NULL;
991+
g_autoptr (ModulemdModuleIndex) index = NULL;
992+
g_autoptr (ModulemdModuleStreamV2) v2_stream = NULL;
993+
g_autoptr (ModulemdProfile) profile = NULL;
994+
g_autoptr (ModulemdDependencies) deps = NULL;
995+
g_autoptr (ModulemdDefaults) defaults = NULL;
996+
g_auto (GStrv) modules = NULL;
997+
g_autoptr (GError) nested_error = NULL;
998+
ModulemdBuildConfig *bc;
999+
GHashTableIter iter;
1000+
gpointer value;
1001+
1002+
g_return_val_if_fail (error == NULL || *error == NULL, NULL);
1003+
g_return_val_if_fail (MODULEMD_IS_PACKAGER_V3 (self), NULL);
1004+
1005+
/* get the list of packager build configuration contexts */
1006+
contexts = modulemd_packager_v3_get_build_config_contexts_as_strv (self);
1007+
1008+
if (g_strv_length (contexts) == 0)
1009+
{
1010+
g_set_error_literal (error,
1011+
MODULEMD_ERROR,
1012+
MMD_ERROR_VALIDATE,
1013+
"Packager document with no build configurations "
1014+
"cannot be converted to stream");
1015+
return NULL;
1016+
}
1017+
1018+
/* create a ModuleIndex to contain the results */
1019+
index = modulemd_module_index_new ();
1020+
1021+
/* create a StreamV2 object for each BuildConfig object */
1022+
for (guint i = 0; i < g_strv_length (contexts); i++)
1023+
{
1024+
bc = modulemd_packager_v3_get_build_config (self, contexts[i]);
1025+
1026+
v2_stream = modulemd_module_stream_v2_new (
1027+
modulemd_packager_v3_get_module_name (self),
1028+
modulemd_packager_v3_get_stream_name (self));
1029+
1030+
modulemd_module_stream_set_context (MODULEMD_MODULE_STREAM (v2_stream),
1031+
contexts[i]);
1032+
1033+
/* set attributes that are the same for all streams */
1034+
1035+
modulemd_module_stream_v2_set_summary (
1036+
v2_stream, modulemd_packager_v3_get_summary (self));
1037+
1038+
modulemd_module_stream_v2_set_description (
1039+
v2_stream, modulemd_packager_v3_get_description (self));
1040+
1041+
/* Packager v3 "license" is optional. Stream v2 "license" is required
1042+
* Fill in the default Packager v3 license if none has been specified.
1043+
*/
1044+
if (g_hash_table_size (self->module_licenses) == 0)
1045+
{
1046+
modulemd_module_stream_v2_add_module_license (
1047+
v2_stream, MMD_PACKAGER_DEFAULT_MODULE_LICENSE);
1048+
}
1049+
else
1050+
{
1051+
MODULEMD_REPLACE_SET (v2_stream->module_licenses,
1052+
self->module_licenses);
1053+
}
1054+
1055+
modulemd_module_stream_v2_set_xmd (v2_stream,
1056+
modulemd_packager_v3_get_xmd (self));
1057+
1058+
modulemd_module_stream_v2_set_community (
1059+
v2_stream, modulemd_packager_v3_get_community (self));
1060+
1061+
modulemd_module_stream_v2_set_documentation (
1062+
v2_stream, modulemd_packager_v3_get_documentation (self));
1063+
1064+
modulemd_module_stream_v2_set_tracker (
1065+
v2_stream, modulemd_packager_v3_get_tracker (self));
1066+
1067+
g_hash_table_iter_init (&iter, self->profiles);
1068+
while (g_hash_table_iter_next (&iter, NULL, &value))
1069+
{
1070+
profile = modulemd_profile_copy (MODULEMD_PROFILE (value));
1071+
modulemd_profile_unset_default (profile);
1072+
modulemd_module_stream_v2_add_profile (v2_stream, profile);
1073+
g_clear_object (&profile);
1074+
}
1075+
1076+
modulemd_module_stream_v2_replace_rpm_api (v2_stream, self->rpm_api);
1077+
1078+
modulemd_module_stream_v2_replace_rpm_filters (v2_stream,
1079+
self->rpm_filters);
1080+
1081+
COPY_HASHTABLE_BY_VALUE_ADDER (v2_stream,
1082+
self,
1083+
rpm_components,
1084+
modulemd_module_stream_v2_add_component);
1085+
1086+
COPY_HASHTABLE_BY_VALUE_ADDER (v2_stream,
1087+
self,
1088+
module_components,
1089+
modulemd_module_stream_v2_add_component);
1090+
1091+
1092+
/* set attributes that are the unique per build configuration */
1093+
1094+
if (modulemd_build_config_get_buildopts (bc))
1095+
{
1096+
modulemd_module_stream_v2_set_buildopts (
1097+
v2_stream, modulemd_build_config_get_buildopts (bc));
1098+
}
1099+
1100+
deps = modulemd_dependencies_new ();
1101+
1102+
modulemd_dependencies_add_buildtime_stream (
1103+
deps, "platform", modulemd_build_config_get_platform (bc));
1104+
modulemd_dependencies_add_runtime_stream (
1105+
deps, "platform", modulemd_build_config_get_platform (bc));
1106+
1107+
modules = modulemd_build_config_get_buildtime_modules_as_strv (bc);
1108+
for (guint j = 0; j < g_strv_length (modules); j++)
1109+
{
1110+
modulemd_dependencies_add_buildtime_stream (
1111+
deps,
1112+
modules[j],
1113+
modulemd_build_config_get_buildtime_requirement_stream (
1114+
bc, modules[j]));
1115+
}
1116+
g_clear_pointer (&modules, g_strfreev);
1117+
1118+
modules = modulemd_build_config_get_runtime_modules_as_strv (bc);
1119+
for (guint j = 0; j < g_strv_length (modules); j++)
1120+
{
1121+
modulemd_dependencies_add_runtime_stream (
1122+
deps,
1123+
modules[j],
1124+
modulemd_build_config_get_runtime_requirement_stream (bc,
1125+
modules[j]));
1126+
}
1127+
g_clear_pointer (&modules, g_strfreev);
1128+
1129+
modulemd_module_stream_v2_add_dependencies (v2_stream, deps);
1130+
g_clear_object (&deps);
1131+
1132+
if (!modulemd_module_stream_validate (MODULEMD_MODULE_STREAM (v2_stream),
1133+
&nested_error))
1134+
{
1135+
g_propagate_error (error, g_steal_pointer (&nested_error));
1136+
return NULL;
1137+
}
1138+
1139+
/* autogen module/stream names if necessary for adding to index */
1140+
1141+
modulemd_module_stream_set_autogen_module_name (
1142+
MODULEMD_MODULE_STREAM (v2_stream), 0);
1143+
modulemd_module_stream_set_autogen_stream_name (
1144+
MODULEMD_MODULE_STREAM (v2_stream), 0);
1145+
1146+
if (!modulemd_module_index_add_module_stream (
1147+
index, MODULEMD_MODULE_STREAM (v2_stream), &nested_error))
1148+
{
1149+
g_propagate_error (error, g_steal_pointer (&nested_error));
1150+
return NULL;
1151+
}
1152+
1153+
g_clear_object (&v2_stream);
1154+
}
1155+
g_clear_pointer (&contexts, g_strfreev);
1156+
1157+
if (!modulemd_packager_v3_to_defaults (self, &defaults, &nested_error))
1158+
{
1159+
g_propagate_error (error, g_steal_pointer (&nested_error));
1160+
return NULL;
1161+
}
1162+
1163+
if (defaults)
1164+
{
1165+
if (!modulemd_module_index_add_defaults (index, defaults, &nested_error))
1166+
{
1167+
g_propagate_error (error, g_steal_pointer (&nested_error));
1168+
return NULL;
1169+
}
1170+
1171+
g_clear_object (&defaults);
1172+
}
1173+
1174+
return g_steal_pointer (&index);
1175+
}
1176+
1177+
9861178
static gboolean
9871179
modulemd_packager_v3_parse_build_configs (yaml_parser_t *parser,
9881180
ModulemdPackagerV3 *packager,

modulemd/tests/test-modulemd-packager-v3.c

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -470,6 +470,48 @@ packager_test_map_to_stream_v2 (void)
470470
g_clear_pointer (&expected_str, g_free);
471471
}
472472

473+
474+
static void
475+
packager_test_convert_to_index (void)
476+
{
477+
g_autoptr (ModulemdPackagerV3) packager = NULL;
478+
g_autoptr (ModulemdModuleIndex) index = NULL;
479+
g_autoptr (GError) error = NULL;
480+
g_autofree gchar *yaml_str = NULL;
481+
g_autofree gchar *expected_path = NULL;
482+
g_autofree gchar *expected_str = NULL;
483+
484+
packager = read_spec ();
485+
486+
index = modulemd_packager_v3_convert_to_index (packager, &error);
487+
g_assert_no_error (error);
488+
g_assert_nonnull (index);
489+
g_assert_true (MODULEMD_IS_MODULE_INDEX (index));
490+
491+
yaml_str = modulemd_module_index_dump_to_string (index, &error);
492+
g_assert_no_error (error);
493+
g_assert_nonnull (yaml_str);
494+
495+
g_debug ("YAML dump of index from PackageV3 to Index mapping:\n%s",
496+
yaml_str);
497+
498+
expected_path = g_strdup_printf ("%s/upgrades/packager_v3_to_index.yaml",
499+
g_getenv ("TEST_DATA_PATH"));
500+
g_assert_nonnull (expected_path);
501+
g_assert_true (
502+
g_file_get_contents (expected_path, &expected_str, NULL, &error));
503+
g_assert_no_error (error);
504+
g_assert_nonnull (expected_str);
505+
506+
g_assert_cmpstr (expected_str, ==, yaml_str);
507+
508+
g_clear_object (&index);
509+
g_clear_pointer (&yaml_str, g_free);
510+
g_clear_pointer (&expected_path, g_free);
511+
g_clear_pointer (&expected_str, g_free);
512+
}
513+
514+
473515
static void
474516
packager_test_map_to_stream_v2_autoname (void)
475517
{
@@ -633,5 +675,8 @@ main (int argc, char *argv[])
633675
g_test_add_func ("/modulemd/v2/packager/index/read",
634676
packager_test_read_to_index);
635677

678+
g_test_add_func ("/modulemd/v2/packager/to_index",
679+
packager_test_convert_to_index);
680+
636681
return g_test_run ();
637682
}

0 commit comments

Comments
 (0)