Skip to content

Commit d69dcc3

Browse files
committed
builder-manifest: Prevent writing duplicate build groups
Additionally merge the sub-IDs and dedup the string values as well Fixes the second issue in #618
1 parent 5fff033 commit d69dcc3

File tree

1 file changed

+63
-31
lines changed

1 file changed

+63
-31
lines changed

src/builder-manifest.c

Lines changed: 63 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)