@@ -3523,26 +3523,41 @@ builder_manifest_finish (BuilderManifest *self,
35233523
35243524 if (sub_ids -> len > 0 )
35253525 {
3526- g_autoptr (GFile ) metadata_file = NULL ;
3527- g_autoptr (GFileOutputStream ) output = NULL ;
3528- g_autoptr (GString ) extension_contents = g_string_new ("\n"
3529- "[Build]\n" );
3526+ g_autoptr (GFile ) metadata_file = g_file_get_child (app_dir , "metadata" );
3527+ g_autoptr (GKeyFile ) keyfile = g_key_file_new ();
3528+ g_auto (GStrv ) old_subs = NULL ;
3529+ g_autoptr (GPtrArray ) all_subs = g_ptr_array_new ();
3530+ gsize j ;
3531+
3532+ if (!g_key_file_load_from_file (keyfile ,
3533+ flatpak_file_get_path_cached (metadata_file ),
3534+ G_KEY_FILE_KEEP_COMMENTS | G_KEY_FILE_KEEP_TRANSLATIONS ,
3535+ error ))
3536+ return FALSE;
3537+
3538+ old_subs = g_key_file_get_string_list (keyfile ,
3539+ FLATPAK_METADATA_GROUP_BUILD ,
3540+ FLATPAK_METADATA_KEY_BUILD_EXTENSIONS ,
3541+ NULL , NULL );
3542+
3543+ for (j = 0 ; old_subs != NULL && old_subs [j ] != NULL ; j ++ )
3544+ g_ptr_array_add (all_subs , old_subs [j ]);
35303545
3531- g_string_append (extension_contents , FLATPAK_METADATA_KEY_BUILD_EXTENSIONS "=" );
3532- for (i = 0 ; i < sub_ids -> len ; i ++ )
3546+ for (j = 0 ; j < sub_ids -> len ; j ++ )
35333547 {
3534- g_string_append ( extension_contents , ( const char * ) sub_ids -> pdata [i ]);
3535- g_string_append ( extension_contents , ";" );
3548+ if (! g_strv_contains (( const char * const * ) old_subs , sub_ids -> pdata [j ]))
3549+ g_ptr_array_add ( all_subs , sub_ids -> pdata [ j ] );
35363550 }
35373551
3538- metadata_file = g_file_get_child (app_dir , "metadata" );
3539- output = g_file_append_to (metadata_file , G_FILE_CREATE_NONE , NULL , error );
3540- if (output == NULL )
3541- return FALSE;
3552+ g_key_file_set_string_list (keyfile ,
3553+ FLATPAK_METADATA_GROUP_BUILD ,
3554+ FLATPAK_METADATA_KEY_BUILD_EXTENSIONS ,
3555+ (const char * const * ) all_subs -> pdata ,
3556+ all_subs -> len );
35423557
3543- if (!g_output_stream_write_all ( G_OUTPUT_STREAM ( output ) ,
3544- extension_contents -> str , extension_contents -> len ,
3545- NULL , NULL , error ))
3558+ if (!g_key_file_save_to_file ( keyfile ,
3559+ flatpak_file_get_path_cached ( metadata_file ) ,
3560+ error ))
35463561 return FALSE;
35473562 }
35483563
@@ -3965,27 +3980,44 @@ builder_manifest_finish_platform (BuilderManifest *self,
39653980
39663981 if (sub_ids -> len > 0 )
39673982 {
3968- g_autoptr (GFile ) metadata_file = NULL ;
3969- g_autoptr (GFileOutputStream ) output = NULL ;
3970- g_autoptr (GString ) extension_contents = g_string_new ("\n"
3971- "[Build]\n" );
3983+ g_autoptr (GFile ) metadata_file = g_file_get_child (app_dir , "metadata.platform" );
3984+ g_autoptr (GKeyFile ) keyfile = g_key_file_new ();
3985+ g_auto (GStrv ) old_subs = NULL ;
3986+ g_autoptr (GPtrArray ) all_subs = g_ptr_array_new ();
3987+ gsize j ;
39723988
3973- g_string_append (extension_contents , FLATPAK_METADATA_KEY_BUILD_EXTENSIONS "=" );
3974- for (i = 0 ; i < sub_ids -> len ; i ++ )
3975- {
3976- g_string_append (extension_contents , (const char * )sub_ids -> pdata [i ]);
3977- g_string_append (extension_contents , ";" );
3978- }
3979- metadata_file = g_file_get_child (app_dir , "metadata.platform" );
39803989 if (!flatpak_break_hardlink (metadata_file , error ))
39813990 return FALSE;
3982- output = g_file_append_to (metadata_file , G_FILE_CREATE_NONE , NULL , error );
3983- if (output == NULL )
3991+
3992+ if (!g_key_file_load_from_file (keyfile ,
3993+ flatpak_file_get_path_cached (metadata_file ),
3994+ G_KEY_FILE_KEEP_COMMENTS | G_KEY_FILE_KEEP_TRANSLATIONS ,
3995+ error ))
39843996 return FALSE;
39853997
3986- if (!g_output_stream_write_all (G_OUTPUT_STREAM (output ),
3987- extension_contents -> str , extension_contents -> len ,
3988- NULL , NULL , error ))
3998+ old_subs = g_key_file_get_string_list (keyfile ,
3999+ FLATPAK_METADATA_GROUP_BUILD ,
4000+ FLATPAK_METADATA_KEY_BUILD_EXTENSIONS ,
4001+ NULL , NULL );
4002+
4003+ for (j = 0 ; old_subs != NULL && old_subs [j ] != NULL ; j ++ )
4004+ g_ptr_array_add (all_subs , old_subs [j ]);
4005+
4006+ for (j = 0 ; j < sub_ids -> len ; j ++ )
4007+ {
4008+ if (!g_strv_contains ((const char * const * ) old_subs , sub_ids -> pdata [j ]))
4009+ g_ptr_array_add (all_subs , sub_ids -> pdata [j ]);
4010+ }
4011+
4012+ g_key_file_set_string_list (keyfile ,
4013+ FLATPAK_METADATA_GROUP_BUILD ,
4014+ FLATPAK_METADATA_KEY_BUILD_EXTENSIONS ,
4015+ (const char * const * ) all_subs -> pdata ,
4016+ all_subs -> len );
4017+
4018+ if (!g_key_file_save_to_file (keyfile ,
4019+ flatpak_file_get_path_cached (metadata_file ),
4020+ error ))
39894021 return FALSE;
39904022 }
39914023
0 commit comments