@@ -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+
9861178static gboolean
9871179modulemd_packager_v3_parse_build_configs (yaml_parser_t * parser ,
9881180 ModulemdPackagerV3 * packager ,
0 commit comments