1b5975d6bSopenharmony_ciFrom f74589f53041abff29d538a5d9884c3202f2c00a Mon Sep 17 00:00:00 2001 2b5975d6bSopenharmony_ciFrom: =?UTF-8?q?Ga=C3=ABl=20Bonithon?= <gael@xfce.org> 3b5975d6bSopenharmony_ciDate: Thu, 20 Apr 2023 16:52:19 +0200 4b5975d6bSopenharmony_ciSubject: [PATCH 1/2] gkeyfile: Replace g_slice_*() with 5b5975d6bSopenharmony_ci g_new*()/g_free_sized() 6b5975d6bSopenharmony_ci 7b5975d6bSopenharmony_ciConflict:NA 8b5975d6bSopenharmony_ciReference:https://gitlab.gnome.org/GNOME/glib/-/commit/f74589f53041abff29d538a5d9884c3202f2c00a 9b5975d6bSopenharmony_ci 10b5975d6bSopenharmony_ci--- 11b5975d6bSopenharmony_ci glib/gkeyfile.c | 26 +++++++++++++------------- 12b5975d6bSopenharmony_ci 1 file changed, 13 insertions(+), 13 deletions(-) 13b5975d6bSopenharmony_ci 14b5975d6bSopenharmony_cidiff --git a/glib/gkeyfile.c b/glib/gkeyfile.c 15b5975d6bSopenharmony_ciindex 9a4821bc5a..d76335653f 100644 16b5975d6bSopenharmony_ci--- a/glib/gkeyfile.c 17b5975d6bSopenharmony_ci+++ b/glib/gkeyfile.c 18b5975d6bSopenharmony_ci@@ -638,7 +638,7 @@ G_DEFINE_QUARK (g-key-file-error-quark, g_key_file_error) 19b5975d6bSopenharmony_ci static void 20b5975d6bSopenharmony_ci g_key_file_init (GKeyFile *key_file) 21b5975d6bSopenharmony_ci { 22b5975d6bSopenharmony_ci- key_file->current_group = g_slice_new0 (GKeyFileGroup); 23b5975d6bSopenharmony_ci+ key_file->current_group = g_new0 (GKeyFileGroup, 1); 24b5975d6bSopenharmony_ci key_file->groups = g_list_prepend (NULL, key_file->current_group); 25b5975d6bSopenharmony_ci key_file->group_hash = NULL; 26b5975d6bSopenharmony_ci key_file->start_group = NULL; 27b5975d6bSopenharmony_ci@@ -700,7 +700,7 @@ g_key_file_new (void) 28b5975d6bSopenharmony_ci { 29b5975d6bSopenharmony_ci GKeyFile *key_file; 30b5975d6bSopenharmony_ci 31b5975d6bSopenharmony_ci- key_file = g_slice_new0 (GKeyFile); 32b5975d6bSopenharmony_ci+ key_file = g_new0 (GKeyFile, 1); 33b5975d6bSopenharmony_ci key_file->ref_count = 1; 34b5975d6bSopenharmony_ci g_key_file_init (key_file); 35b5975d6bSopenharmony_ci 36b5975d6bSopenharmony_ci@@ -1205,7 +1205,7 @@ g_key_file_free (GKeyFile *key_file) 37b5975d6bSopenharmony_ci g_key_file_clear (key_file); 38b5975d6bSopenharmony_ci 39b5975d6bSopenharmony_ci if (g_atomic_int_dec_and_test (&key_file->ref_count)) 40b5975d6bSopenharmony_ci- g_slice_free (GKeyFile, key_file); 41b5975d6bSopenharmony_ci+ g_free_sized (key_file, sizeof (GKeyFile)); 42b5975d6bSopenharmony_ci else 43b5975d6bSopenharmony_ci g_key_file_init (key_file); 44b5975d6bSopenharmony_ci } 45b5975d6bSopenharmony_ci@@ -1227,7 +1227,7 @@ g_key_file_unref (GKeyFile *key_file) 46b5975d6bSopenharmony_ci if (g_atomic_int_dec_and_test (&key_file->ref_count)) 47b5975d6bSopenharmony_ci { 48b5975d6bSopenharmony_ci g_key_file_clear (key_file); 49b5975d6bSopenharmony_ci- g_slice_free (GKeyFile, key_file); 50b5975d6bSopenharmony_ci+ g_free_sized (key_file, sizeof (GKeyFile)); 51b5975d6bSopenharmony_ci } 52b5975d6bSopenharmony_ci } 53b5975d6bSopenharmony_ci 54b5975d6bSopenharmony_ci@@ -1317,7 +1317,7 @@ g_key_file_parse_comment (GKeyFile *key_file, 55b5975d6bSopenharmony_ci 56b5975d6bSopenharmony_ci g_warn_if_fail (key_file->current_group != NULL); 57b5975d6bSopenharmony_ci 58b5975d6bSopenharmony_ci- pair = g_slice_new (GKeyFileKeyValuePair); 59b5975d6bSopenharmony_ci+ pair = g_new (GKeyFileKeyValuePair, 1); 60b5975d6bSopenharmony_ci pair->key = NULL; 61b5975d6bSopenharmony_ci pair->value = g_strndup (line, length); 62b5975d6bSopenharmony_ci 63b5975d6bSopenharmony_ci@@ -1442,7 +1442,7 @@ g_key_file_parse_key_value_pair (GKeyFile *key_file, 64b5975d6bSopenharmony_ci { 65b5975d6bSopenharmony_ci GKeyFileKeyValuePair *pair; 66b5975d6bSopenharmony_ci 67b5975d6bSopenharmony_ci- pair = g_slice_new (GKeyFileKeyValuePair); 68b5975d6bSopenharmony_ci+ pair = g_new (GKeyFileKeyValuePair, 1); 69b5975d6bSopenharmony_ci pair->key = g_steal_pointer (&key); 70b5975d6bSopenharmony_ci pair->value = g_strndup (value_start, value_len); 71b5975d6bSopenharmony_ci 72b5975d6bSopenharmony_ci@@ -3339,7 +3339,7 @@ g_key_file_set_key_comment (GKeyFile *key_file, 73b5975d6bSopenharmony_ci 74b5975d6bSopenharmony_ci /* Now we can add our new comment 75b5975d6bSopenharmony_ci */ 76b5975d6bSopenharmony_ci- pair = g_slice_new (GKeyFileKeyValuePair); 77b5975d6bSopenharmony_ci+ pair = g_new (GKeyFileKeyValuePair, 1); 78b5975d6bSopenharmony_ci pair->key = NULL; 79b5975d6bSopenharmony_ci pair->value = g_key_file_parse_comment_as_value (key_file, comment); 80b5975d6bSopenharmony_ci 81b5975d6bSopenharmony_ci@@ -3383,7 +3383,7 @@ g_key_file_set_group_comment (GKeyFile *key_file, 82b5975d6bSopenharmony_ci 83b5975d6bSopenharmony_ci /* Now we can add our new comment 84b5975d6bSopenharmony_ci */ 85b5975d6bSopenharmony_ci- group->comment = g_slice_new (GKeyFileKeyValuePair); 86b5975d6bSopenharmony_ci+ group->comment = g_new (GKeyFileKeyValuePair, 1); 87b5975d6bSopenharmony_ci group->comment->key = NULL; 88b5975d6bSopenharmony_ci group->comment->value = g_key_file_parse_comment_as_value (key_file, comment); 89b5975d6bSopenharmony_ci 90b5975d6bSopenharmony_ci@@ -3416,7 +3416,7 @@ g_key_file_set_top_comment (GKeyFile *key_file, 91b5975d6bSopenharmony_ci if (comment == NULL) 92b5975d6bSopenharmony_ci return TRUE; 93b5975d6bSopenharmony_ci 94b5975d6bSopenharmony_ci- pair = g_slice_new (GKeyFileKeyValuePair); 95b5975d6bSopenharmony_ci+ pair = g_new (GKeyFileKeyValuePair, 1); 96b5975d6bSopenharmony_ci pair->key = NULL; 97b5975d6bSopenharmony_ci pair->value = g_key_file_parse_comment_as_value (key_file, comment); 98b5975d6bSopenharmony_ci 99b5975d6bSopenharmony_ci@@ -3840,7 +3840,7 @@ g_key_file_add_group (GKeyFile *key_file, 100b5975d6bSopenharmony_ci return; 101b5975d6bSopenharmony_ci } 102b5975d6bSopenharmony_ci 103b5975d6bSopenharmony_ci- group = g_slice_new0 (GKeyFileGroup); 104b5975d6bSopenharmony_ci+ group = g_new0 (GKeyFileGroup, 1); 105b5975d6bSopenharmony_ci group->name = g_strdup (group_name); 106b5975d6bSopenharmony_ci group->lookup_map = g_hash_table_new (g_str_hash, g_str_equal); 107b5975d6bSopenharmony_ci key_file->groups = g_list_prepend (key_file->groups, group); 108b5975d6bSopenharmony_ci@@ -3862,7 +3862,7 @@ g_key_file_key_value_pair_free (GKeyFileKeyValuePair *pair) 109b5975d6bSopenharmony_ci { 110b5975d6bSopenharmony_ci g_free (pair->key); 111b5975d6bSopenharmony_ci g_free (pair->value); 112b5975d6bSopenharmony_ci- g_slice_free (GKeyFileKeyValuePair, pair); 113b5975d6bSopenharmony_ci+ g_free_sized (pair, sizeof (GKeyFileKeyValuePair)); 114b5975d6bSopenharmony_ci } 115b5975d6bSopenharmony_ci } 116b5975d6bSopenharmony_ci 117b5975d6bSopenharmony_ci@@ -3971,7 +3971,7 @@ g_key_file_remove_group_node (GKeyFile *key_file, 118b5975d6bSopenharmony_ci } 119b5975d6bSopenharmony_ci 120b5975d6bSopenharmony_ci g_free ((gchar *) group->name); 121b5975d6bSopenharmony_ci- g_slice_free (GKeyFileGroup, group); 122b5975d6bSopenharmony_ci+ g_free_sized (group, sizeof (GKeyFileGroup)); 123b5975d6bSopenharmony_ci g_list_free_1 (group_node); 124b5975d6bSopenharmony_ci } 125b5975d6bSopenharmony_ci 126b5975d6bSopenharmony_ci@@ -4031,7 +4031,7 @@ g_key_file_add_key (GKeyFile *key_file, 127b5975d6bSopenharmony_ci { 128b5975d6bSopenharmony_ci GKeyFileKeyValuePair *pair; 129b5975d6bSopenharmony_ci 130b5975d6bSopenharmony_ci- pair = g_slice_new (GKeyFileKeyValuePair); 131b5975d6bSopenharmony_ci+ pair = g_new (GKeyFileKeyValuePair, 1); 132b5975d6bSopenharmony_ci pair->key = g_strdup (key); 133b5975d6bSopenharmony_ci pair->value = g_strdup (value); 134b5975d6bSopenharmony_ci 135b5975d6bSopenharmony_ci-- 136b5975d6bSopenharmony_ciGitLab 137b5975d6bSopenharmony_ci 138b5975d6bSopenharmony_ci 139b5975d6bSopenharmony_ciFrom 86b4b0453ea3a814167d4a5f7a4031d467543716 Mon Sep 17 00:00:00 2001 140b5975d6bSopenharmony_ciFrom: =?UTF-8?q?Ga=C3=ABl=20Bonithon?= <gael@xfce.org> 141b5975d6bSopenharmony_ciDate: Fri, 14 Apr 2023 19:40:30 +0200 142b5975d6bSopenharmony_ciSubject: [PATCH 2/2] gkeyfile: Fix group comment management 143b5975d6bSopenharmony_ci 144b5975d6bSopenharmony_ciThis removes the `comment` member of the GKeyFileGroup structure, which 145b5975d6bSopenharmony_ciseemed intended to distinguish comments just above a group from comments 146b5975d6bSopenharmony_ciabove them, separated by one or more blank lines. Indeed: 147b5975d6bSopenharmony_ci* This does not seem to match any specification in the documentation, 148b5975d6bSopenharmony_ci where blank lines and lines starting with `#` are indiscriminately 149b5975d6bSopenharmony_ci considered comments. In particular, no distinction is made between the 150b5975d6bSopenharmony_ci comment above the first group and the comment at the beginning of the 151b5975d6bSopenharmony_ci file. 152b5975d6bSopenharmony_ci* This distinction was only half implemented, resulting in confusion 153b5975d6bSopenharmony_ci between comment above a group and comment at the end of the preceding 154b5975d6bSopenharmony_ci group. 155b5975d6bSopenharmony_ci 156b5975d6bSopenharmony_ciInstead, the same logic is used for groups as for keys: the comment 157b5975d6bSopenharmony_ciabove a group is simply the sequence of key-value pairs of the preceding 158b5975d6bSopenharmony_cigroup where the key is null, starting from the bottom. 159b5975d6bSopenharmony_ci 160b5975d6bSopenharmony_ciThe addition of a blank line above groups when writing, involved in 161b5975d6bSopenharmony_cibugs #104 and #2927, is kept, but: 162b5975d6bSopenharmony_ci* It is now added as a comment as soon as the group is added (since a 163b5975d6bSopenharmony_ci blank line is considered a comment), so that 164b5975d6bSopenharmony_ci `g_key_file_get_comment()` returns the correct result right away. 165b5975d6bSopenharmony_ci* It is always added if comments are not kept. 166b5975d6bSopenharmony_ci* Otherwise it is only added if the group is newly created (not present 167b5975d6bSopenharmony_ci in the original data), in order to really keep comments (existing and 168b5975d6bSopenharmony_ci not existing). 169b5975d6bSopenharmony_ci 170b5975d6bSopenharmony_ciCloses: #104, #2927 171b5975d6bSopenharmony_ci 172b5975d6bSopenharmony_ciConflict:NA 173b5975d6bSopenharmony_ciReference:https://gitlab.gnome.org/GNOME/glib/-/commit/86b4b0453ea3a814167d4a5f7a4031d467543716 174b5975d6bSopenharmony_ci 175b5975d6bSopenharmony_ci--- 176b5975d6bSopenharmony_ci glib/gkeyfile.c | 137 +++++++++++++++++++++++-------------------- 177b5975d6bSopenharmony_ci glib/tests/keyfile.c | 75 ++++++++++++++++++++++- 178b5975d6bSopenharmony_ci 2 files changed, 147 insertions(+), 65 deletions(-) 179b5975d6bSopenharmony_ci 180b5975d6bSopenharmony_cidiff --git a/glib/gkeyfile.c b/glib/gkeyfile.c 181b5975d6bSopenharmony_ciindex d76335653f..1fcef9fc91 100644 182b5975d6bSopenharmony_ci--- a/glib/gkeyfile.c 183b5975d6bSopenharmony_ci+++ b/glib/gkeyfile.c 184b5975d6bSopenharmony_ci@@ -529,8 +529,6 @@ struct _GKeyFileGroup 185b5975d6bSopenharmony_ci { 186b5975d6bSopenharmony_ci const gchar *name; /* NULL for above first group (which will be comments) */ 187b5975d6bSopenharmony_ci 188b5975d6bSopenharmony_ci- GKeyFileKeyValuePair *comment; /* Special comment that is stuck to the top of a group */ 189b5975d6bSopenharmony_ci- 190b5975d6bSopenharmony_ci GList *key_value_pairs; 191b5975d6bSopenharmony_ci 192b5975d6bSopenharmony_ci /* Used in parallel with key_value_pairs for 193b5975d6bSopenharmony_ci@@ -579,7 +577,8 @@ static void g_key_file_add_key (GKeyFile 194b5975d6bSopenharmony_ci const gchar *key, 195b5975d6bSopenharmony_ci const gchar *value); 196b5975d6bSopenharmony_ci static void g_key_file_add_group (GKeyFile *key_file, 197b5975d6bSopenharmony_ci- const gchar *group_name); 198b5975d6bSopenharmony_ci+ const gchar *group_name, 199b5975d6bSopenharmony_ci+ gboolean created); 200b5975d6bSopenharmony_ci static gboolean g_key_file_is_group_name (const gchar *name); 201b5975d6bSopenharmony_ci static gboolean g_key_file_is_key_name (const gchar *name, 202b5975d6bSopenharmony_ci gsize len); 203b5975d6bSopenharmony_ci@@ -1354,7 +1353,7 @@ g_key_file_parse_group (GKeyFile *key_file, 204b5975d6bSopenharmony_ci return; 205b5975d6bSopenharmony_ci } 206b5975d6bSopenharmony_ci 207b5975d6bSopenharmony_ci- g_key_file_add_group (key_file, group_name); 208b5975d6bSopenharmony_ci+ g_key_file_add_group (key_file, group_name, FALSE); 209b5975d6bSopenharmony_ci g_free (group_name); 210b5975d6bSopenharmony_ci } 211b5975d6bSopenharmony_ci 212b5975d6bSopenharmony_ci@@ -1610,14 +1609,6 @@ g_key_file_to_data (GKeyFile *key_file, 213b5975d6bSopenharmony_ci 214b5975d6bSopenharmony_ci group = (GKeyFileGroup *) group_node->data; 215b5975d6bSopenharmony_ci 216b5975d6bSopenharmony_ci- /* separate groups by at least an empty line */ 217b5975d6bSopenharmony_ci- if (data_string->len >= 2 && 218b5975d6bSopenharmony_ci- data_string->str[data_string->len - 2] != '\n') 219b5975d6bSopenharmony_ci- g_string_append_c (data_string, '\n'); 220b5975d6bSopenharmony_ci- 221b5975d6bSopenharmony_ci- if (group->comment != NULL) 222b5975d6bSopenharmony_ci- g_string_append_printf (data_string, "%s\n", group->comment->value); 223b5975d6bSopenharmony_ci- 224b5975d6bSopenharmony_ci if (group->name != NULL) 225b5975d6bSopenharmony_ci g_string_append_printf (data_string, "[%s]\n", group->name); 226b5975d6bSopenharmony_ci 227b5975d6bSopenharmony_ci@@ -1902,7 +1893,7 @@ g_key_file_set_value (GKeyFile *key_file, 228b5975d6bSopenharmony_ci 229b5975d6bSopenharmony_ci if (!group) 230b5975d6bSopenharmony_ci { 231b5975d6bSopenharmony_ci- g_key_file_add_group (key_file, group_name); 232b5975d6bSopenharmony_ci+ g_key_file_add_group (key_file, group_name, TRUE); 233b5975d6bSopenharmony_ci group = (GKeyFileGroup *) key_file->groups->data; 234b5975d6bSopenharmony_ci 235b5975d6bSopenharmony_ci g_key_file_add_key (key_file, group, key, value); 236b5975d6bSopenharmony_ci@@ -3349,6 +3340,42 @@ g_key_file_set_key_comment (GKeyFile *key_file, 237b5975d6bSopenharmony_ci return TRUE; 238b5975d6bSopenharmony_ci } 239b5975d6bSopenharmony_ci 240b5975d6bSopenharmony_ci+static gboolean 241b5975d6bSopenharmony_ci+g_key_file_set_top_comment (GKeyFile *key_file, 242b5975d6bSopenharmony_ci+ const gchar *comment, 243b5975d6bSopenharmony_ci+ GError **error) 244b5975d6bSopenharmony_ci+{ 245b5975d6bSopenharmony_ci+ GList *group_node; 246b5975d6bSopenharmony_ci+ GKeyFileGroup *group; 247b5975d6bSopenharmony_ci+ GKeyFileKeyValuePair *pair; 248b5975d6bSopenharmony_ci+ 249b5975d6bSopenharmony_ci+ /* The last group in the list should be the top (comments only) 250b5975d6bSopenharmony_ci+ * group in the file 251b5975d6bSopenharmony_ci+ */ 252b5975d6bSopenharmony_ci+ g_warn_if_fail (key_file->groups != NULL); 253b5975d6bSopenharmony_ci+ group_node = g_list_last (key_file->groups); 254b5975d6bSopenharmony_ci+ group = (GKeyFileGroup *) group_node->data; 255b5975d6bSopenharmony_ci+ g_warn_if_fail (group->name == NULL); 256b5975d6bSopenharmony_ci+ 257b5975d6bSopenharmony_ci+ /* Note all keys must be comments at the top of 258b5975d6bSopenharmony_ci+ * the file, so we can just free it all. 259b5975d6bSopenharmony_ci+ */ 260b5975d6bSopenharmony_ci+ g_list_free_full (group->key_value_pairs, (GDestroyNotify) g_key_file_key_value_pair_free); 261b5975d6bSopenharmony_ci+ group->key_value_pairs = NULL; 262b5975d6bSopenharmony_ci+ 263b5975d6bSopenharmony_ci+ if (comment == NULL) 264b5975d6bSopenharmony_ci+ return TRUE; 265b5975d6bSopenharmony_ci+ 266b5975d6bSopenharmony_ci+ pair = g_new (GKeyFileKeyValuePair, 1); 267b5975d6bSopenharmony_ci+ pair->key = NULL; 268b5975d6bSopenharmony_ci+ pair->value = g_key_file_parse_comment_as_value (key_file, comment); 269b5975d6bSopenharmony_ci+ 270b5975d6bSopenharmony_ci+ group->key_value_pairs = 271b5975d6bSopenharmony_ci+ g_list_prepend (group->key_value_pairs, pair); 272b5975d6bSopenharmony_ci+ 273b5975d6bSopenharmony_ci+ return TRUE; 274b5975d6bSopenharmony_ci+} 275b5975d6bSopenharmony_ci+ 276b5975d6bSopenharmony_ci static gboolean 277b5975d6bSopenharmony_ci g_key_file_set_group_comment (GKeyFile *key_file, 278b5975d6bSopenharmony_ci const gchar *group_name, 279b5975d6bSopenharmony_ci@@ -3356,6 +3383,8 @@ g_key_file_set_group_comment (GKeyFile *key_file, 280b5975d6bSopenharmony_ci GError **error) 281b5975d6bSopenharmony_ci { 282b5975d6bSopenharmony_ci GKeyFileGroup *group; 283b5975d6bSopenharmony_ci+ GList *group_node; 284b5975d6bSopenharmony_ci+ GKeyFileKeyValuePair *pair; 285b5975d6bSopenharmony_ci 286b5975d6bSopenharmony_ci g_return_val_if_fail (group_name != NULL && g_key_file_is_group_name (group_name), FALSE); 287b5975d6bSopenharmony_ci 288b5975d6bSopenharmony_ci@@ -3370,12 +3399,22 @@ g_key_file_set_group_comment (GKeyFile *key_file, 289b5975d6bSopenharmony_ci return FALSE; 290b5975d6bSopenharmony_ci } 291b5975d6bSopenharmony_ci 292b5975d6bSopenharmony_ci+ if (group == key_file->start_group) 293b5975d6bSopenharmony_ci+ return g_key_file_set_top_comment (key_file, comment, error); 294b5975d6bSopenharmony_ci+ 295b5975d6bSopenharmony_ci /* First remove any existing comment 296b5975d6bSopenharmony_ci */ 297b5975d6bSopenharmony_ci- if (group->comment) 298b5975d6bSopenharmony_ci+ group_node = g_key_file_lookup_group_node (key_file, group_name); 299b5975d6bSopenharmony_ci+ group = group_node->next->data; 300b5975d6bSopenharmony_ci+ for (GList *lp = group->key_value_pairs; lp != NULL; ) 301b5975d6bSopenharmony_ci { 302b5975d6bSopenharmony_ci- g_key_file_key_value_pair_free (group->comment); 303b5975d6bSopenharmony_ci- group->comment = NULL; 304b5975d6bSopenharmony_ci+ GList *lnext = lp->next; 305b5975d6bSopenharmony_ci+ pair = lp->data; 306b5975d6bSopenharmony_ci+ if (pair->key != NULL) 307b5975d6bSopenharmony_ci+ break; 308b5975d6bSopenharmony_ci+ 309b5975d6bSopenharmony_ci+ g_key_file_remove_key_value_pair_node (key_file, group, lp); 310b5975d6bSopenharmony_ci+ lp = lnext; 311b5975d6bSopenharmony_ci } 312b5975d6bSopenharmony_ci 313b5975d6bSopenharmony_ci if (comment == NULL) 314b5975d6bSopenharmony_ci@@ -3383,45 +3422,10 @@ g_key_file_set_group_comment (GKeyFile *key_file, 315b5975d6bSopenharmony_ci 316b5975d6bSopenharmony_ci /* Now we can add our new comment 317b5975d6bSopenharmony_ci */ 318b5975d6bSopenharmony_ci- group->comment = g_new (GKeyFileKeyValuePair, 1); 319b5975d6bSopenharmony_ci- group->comment->key = NULL; 320b5975d6bSopenharmony_ci- group->comment->value = g_key_file_parse_comment_as_value (key_file, comment); 321b5975d6bSopenharmony_ci- 322b5975d6bSopenharmony_ci- return TRUE; 323b5975d6bSopenharmony_ci-} 324b5975d6bSopenharmony_ci- 325b5975d6bSopenharmony_ci-static gboolean 326b5975d6bSopenharmony_ci-g_key_file_set_top_comment (GKeyFile *key_file, 327b5975d6bSopenharmony_ci- const gchar *comment, 328b5975d6bSopenharmony_ci- GError **error) 329b5975d6bSopenharmony_ci-{ 330b5975d6bSopenharmony_ci- GList *group_node; 331b5975d6bSopenharmony_ci- GKeyFileGroup *group; 332b5975d6bSopenharmony_ci- GKeyFileKeyValuePair *pair; 333b5975d6bSopenharmony_ci- 334b5975d6bSopenharmony_ci- /* The last group in the list should be the top (comments only) 335b5975d6bSopenharmony_ci- * group in the file 336b5975d6bSopenharmony_ci- */ 337b5975d6bSopenharmony_ci- g_warn_if_fail (key_file->groups != NULL); 338b5975d6bSopenharmony_ci- group_node = g_list_last (key_file->groups); 339b5975d6bSopenharmony_ci- group = (GKeyFileGroup *) group_node->data; 340b5975d6bSopenharmony_ci- g_warn_if_fail (group->name == NULL); 341b5975d6bSopenharmony_ci- 342b5975d6bSopenharmony_ci- /* Note all keys must be comments at the top of 343b5975d6bSopenharmony_ci- * the file, so we can just free it all. 344b5975d6bSopenharmony_ci- */ 345b5975d6bSopenharmony_ci- g_list_free_full (group->key_value_pairs, (GDestroyNotify) g_key_file_key_value_pair_free); 346b5975d6bSopenharmony_ci- group->key_value_pairs = NULL; 347b5975d6bSopenharmony_ci- 348b5975d6bSopenharmony_ci- if (comment == NULL) 349b5975d6bSopenharmony_ci- return TRUE; 350b5975d6bSopenharmony_ci- 351b5975d6bSopenharmony_ci pair = g_new (GKeyFileKeyValuePair, 1); 352b5975d6bSopenharmony_ci pair->key = NULL; 353b5975d6bSopenharmony_ci pair->value = g_key_file_parse_comment_as_value (key_file, comment); 354b5975d6bSopenharmony_ci- 355b5975d6bSopenharmony_ci- group->key_value_pairs = 356b5975d6bSopenharmony_ci- g_list_prepend (group->key_value_pairs, pair); 357b5975d6bSopenharmony_ci+ group->key_value_pairs = g_list_prepend (group->key_value_pairs, pair); 358b5975d6bSopenharmony_ci 359b5975d6bSopenharmony_ci return TRUE; 360b5975d6bSopenharmony_ci } 361b5975d6bSopenharmony_ci@@ -3629,9 +3633,6 @@ g_key_file_get_group_comment (GKeyFile *key_file, 362b5975d6bSopenharmony_ci return NULL; 363b5975d6bSopenharmony_ci } 364b5975d6bSopenharmony_ci 365b5975d6bSopenharmony_ci- if (group->comment) 366b5975d6bSopenharmony_ci- return g_strdup (group->comment->value); 367b5975d6bSopenharmony_ci- 368b5975d6bSopenharmony_ci group_node = g_key_file_lookup_group_node (key_file, group_name); 369b5975d6bSopenharmony_ci group_node = group_node->next; 370b5975d6bSopenharmony_ci group = (GKeyFileGroup *)group_node->data; 371b5975d6bSopenharmony_ci@@ -3826,7 +3827,8 @@ g_key_file_has_key (GKeyFile *key_file, 372b5975d6bSopenharmony_ci 373b5975d6bSopenharmony_ci static void 374b5975d6bSopenharmony_ci g_key_file_add_group (GKeyFile *key_file, 375b5975d6bSopenharmony_ci- const gchar *group_name) 376b5975d6bSopenharmony_ci+ const gchar *group_name, 377b5975d6bSopenharmony_ci+ gboolean created) 378b5975d6bSopenharmony_ci { 379b5975d6bSopenharmony_ci GKeyFileGroup *group; 380b5975d6bSopenharmony_ci 381b5975d6bSopenharmony_ci@@ -3847,7 +3849,22 @@ g_key_file_add_group (GKeyFile *key_file, 382b5975d6bSopenharmony_ci key_file->current_group = group; 383b5975d6bSopenharmony_ci 384b5975d6bSopenharmony_ci if (key_file->start_group == NULL) 385b5975d6bSopenharmony_ci- key_file->start_group = group; 386b5975d6bSopenharmony_ci+ { 387b5975d6bSopenharmony_ci+ key_file->start_group = group; 388b5975d6bSopenharmony_ci+ } 389b5975d6bSopenharmony_ci+ else if (!(key_file->flags & G_KEY_FILE_KEEP_COMMENTS) || created) 390b5975d6bSopenharmony_ci+ { 391b5975d6bSopenharmony_ci+ /* separate groups by a blank line if we don't keep comments or group is created */ 392b5975d6bSopenharmony_ci+ GKeyFileGroup *next_group = key_file->groups->next->data; 393b5975d6bSopenharmony_ci+ if (next_group->key_value_pairs == NULL || 394b5975d6bSopenharmony_ci+ ((GKeyFileKeyValuePair *) next_group->key_value_pairs->data)->key != NULL) 395b5975d6bSopenharmony_ci+ { 396b5975d6bSopenharmony_ci+ GKeyFileKeyValuePair *pair = g_new (GKeyFileKeyValuePair, 1); 397b5975d6bSopenharmony_ci+ pair->key = NULL; 398b5975d6bSopenharmony_ci+ pair->value = g_strdup (""); 399b5975d6bSopenharmony_ci+ next_group->key_value_pairs = g_list_prepend (next_group->key_value_pairs, pair); 400b5975d6bSopenharmony_ci+ } 401b5975d6bSopenharmony_ci+ } 402b5975d6bSopenharmony_ci 403b5975d6bSopenharmony_ci if (!key_file->group_hash) 404b5975d6bSopenharmony_ci key_file->group_hash = g_hash_table_new (g_str_hash, g_str_equal); 405b5975d6bSopenharmony_ci@@ -3958,12 +3975,6 @@ g_key_file_remove_group_node (GKeyFile *key_file, 406b5975d6bSopenharmony_ci 407b5975d6bSopenharmony_ci g_warn_if_fail (group->key_value_pairs == NULL); 408b5975d6bSopenharmony_ci 409b5975d6bSopenharmony_ci- if (group->comment) 410b5975d6bSopenharmony_ci- { 411b5975d6bSopenharmony_ci- g_key_file_key_value_pair_free (group->comment); 412b5975d6bSopenharmony_ci- group->comment = NULL; 413b5975d6bSopenharmony_ci- } 414b5975d6bSopenharmony_ci- 415b5975d6bSopenharmony_ci if (group->lookup_map) 416b5975d6bSopenharmony_ci { 417b5975d6bSopenharmony_ci g_hash_table_destroy (group->lookup_map); 418b5975d6bSopenharmony_cidiff --git a/glib/tests/keyfile.c b/glib/tests/keyfile.c 419b5975d6bSopenharmony_ciindex 3d72d9670e..d3eed29841 100644 420b5975d6bSopenharmony_ci--- a/glib/tests/keyfile.c 421b5975d6bSopenharmony_ci+++ b/glib/tests/keyfile.c 422b5975d6bSopenharmony_ci@@ -382,7 +382,9 @@ test_comments (void) 423b5975d6bSopenharmony_ci "key4 = value4\n" 424b5975d6bSopenharmony_ci "# group comment\n" 425b5975d6bSopenharmony_ci "# group comment, continued\n" 426b5975d6bSopenharmony_ci- "[group2]\n"; 427b5975d6bSopenharmony_ci+ "[group2]\n\n" 428b5975d6bSopenharmony_ci+ "[group3]\n" 429b5975d6bSopenharmony_ci+ "[group4]\n"; 430b5975d6bSopenharmony_ci 431b5975d6bSopenharmony_ci const gchar *top_comment = " top comment\n top comment, continued"; 432b5975d6bSopenharmony_ci const gchar *group_comment = " group comment\n group comment, continued"; 433b5975d6bSopenharmony_ci@@ -427,6 +429,12 @@ test_comments (void) 434b5975d6bSopenharmony_ci check_name ("top comment", comment, top_comment, 0); 435b5975d6bSopenharmony_ci g_free (comment); 436b5975d6bSopenharmony_ci 437b5975d6bSopenharmony_ci+ g_key_file_remove_comment (keyfile, NULL, NULL, &error); 438b5975d6bSopenharmony_ci+ check_no_error (&error); 439b5975d6bSopenharmony_ci+ comment = g_key_file_get_comment (keyfile, NULL, NULL, &error); 440b5975d6bSopenharmony_ci+ check_no_error (&error); 441b5975d6bSopenharmony_ci+ g_assert_null (comment); 442b5975d6bSopenharmony_ci+ 443b5975d6bSopenharmony_ci comment = g_key_file_get_comment (keyfile, "group1", "key2", &error); 444b5975d6bSopenharmony_ci check_no_error (&error); 445b5975d6bSopenharmony_ci check_name ("key comment", comment, key_comment, 0); 446b5975d6bSopenharmony_ci@@ -448,7 +456,25 @@ test_comments (void) 447b5975d6bSopenharmony_ci check_name ("group comment", comment, group_comment, 0); 448b5975d6bSopenharmony_ci g_free (comment); 449b5975d6bSopenharmony_ci 450b5975d6bSopenharmony_ci+ g_test_bug ("https://gitlab.gnome.org/GNOME/glib/-/issues/104"); 451b5975d6bSopenharmony_ci+ 452b5975d6bSopenharmony_ci+ /* check if comments above another group than the first one are properly removed */ 453b5975d6bSopenharmony_ci+ g_key_file_remove_comment (keyfile, "group2", NULL, &error); 454b5975d6bSopenharmony_ci+ check_no_error (&error); 455b5975d6bSopenharmony_ci+ comment = g_key_file_get_comment (keyfile, "group2", NULL, &error); 456b5975d6bSopenharmony_ci+ check_no_error (&error); 457b5975d6bSopenharmony_ci+ g_assert_null (comment); 458b5975d6bSopenharmony_ci+ 459b5975d6bSopenharmony_ci comment = g_key_file_get_comment (keyfile, "group3", NULL, &error); 460b5975d6bSopenharmony_ci+ check_no_error (&error); 461b5975d6bSopenharmony_ci+ check_name ("group comment", comment, "", 0); 462b5975d6bSopenharmony_ci+ g_free (comment); 463b5975d6bSopenharmony_ci+ 464b5975d6bSopenharmony_ci+ comment = g_key_file_get_comment (keyfile, "group4", NULL, &error); 465b5975d6bSopenharmony_ci+ check_no_error (&error); 466b5975d6bSopenharmony_ci+ g_assert_null (comment); 467b5975d6bSopenharmony_ci+ 468b5975d6bSopenharmony_ci+ comment = g_key_file_get_comment (keyfile, "group5", NULL, &error); 469b5975d6bSopenharmony_ci check_error (&error, 470b5975d6bSopenharmony_ci G_KEY_FILE_ERROR, 471b5975d6bSopenharmony_ci G_KEY_FILE_ERROR_GROUP_NOT_FOUND); 472b5975d6bSopenharmony_ci@@ -1321,9 +1347,16 @@ test_reload_idempotency (void) 473b5975d6bSopenharmony_ci "[fifth]\n"; 474b5975d6bSopenharmony_ci GKeyFile *keyfile; 475b5975d6bSopenharmony_ci GError *error = NULL; 476b5975d6bSopenharmony_ci- gchar *data1, *data2; 477b5975d6bSopenharmony_ci+ gchar *data1, *data2, *comment; 478b5975d6bSopenharmony_ci gsize len1, len2; 479b5975d6bSopenharmony_ci 480b5975d6bSopenharmony_ci+ const gchar *key_comment = " A random comment in the first group"; 481b5975d6bSopenharmony_ci+ const gchar *top_comment = " Top comment\n\n First comment"; 482b5975d6bSopenharmony_ci+ const gchar *group_comment_1 = top_comment; 483b5975d6bSopenharmony_ci+ const gchar *group_comment_2 = " Second comment - one line"; 484b5975d6bSopenharmony_ci+ const gchar *group_comment_3 = " Third comment - two lines\n Third comment - two lines"; 485b5975d6bSopenharmony_ci+ const gchar *group_comment_4 = "\n"; 486b5975d6bSopenharmony_ci+ 487b5975d6bSopenharmony_ci g_test_bug ("https://bugzilla.gnome.org/show_bug.cgi?id=420686"); 488b5975d6bSopenharmony_ci 489b5975d6bSopenharmony_ci /* check that we only insert a single new line between groups */ 490b5975d6bSopenharmony_ci@@ -1347,6 +1380,44 @@ test_reload_idempotency (void) 491b5975d6bSopenharmony_ci 492b5975d6bSopenharmony_ci data2 = g_key_file_to_data (keyfile, &len2, &error); 493b5975d6bSopenharmony_ci g_assert_nonnull (data2); 494b5975d6bSopenharmony_ci+ 495b5975d6bSopenharmony_ci+ g_test_bug ("https://gitlab.gnome.org/GNOME/glib/-/issues/2927"); 496b5975d6bSopenharmony_ci+ 497b5975d6bSopenharmony_ci+ /* check if comments are preserved on reload */ 498b5975d6bSopenharmony_ci+ comment = g_key_file_get_comment (keyfile, "first", "anotherkey", &error); 499b5975d6bSopenharmony_ci+ check_no_error (&error); 500b5975d6bSopenharmony_ci+ g_assert_cmpstr (comment, ==, key_comment); 501b5975d6bSopenharmony_ci+ g_free (comment); 502b5975d6bSopenharmony_ci+ 503b5975d6bSopenharmony_ci+ comment = g_key_file_get_comment (keyfile, NULL, NULL, &error); 504b5975d6bSopenharmony_ci+ check_no_error (&error); 505b5975d6bSopenharmony_ci+ g_assert_cmpstr (comment, ==, top_comment); 506b5975d6bSopenharmony_ci+ g_free (comment); 507b5975d6bSopenharmony_ci+ 508b5975d6bSopenharmony_ci+ comment = g_key_file_get_comment (keyfile, "first", NULL, &error); 509b5975d6bSopenharmony_ci+ check_no_error (&error); 510b5975d6bSopenharmony_ci+ g_assert_cmpstr (comment, ==, group_comment_1); 511b5975d6bSopenharmony_ci+ g_free (comment); 512b5975d6bSopenharmony_ci+ 513b5975d6bSopenharmony_ci+ comment = g_key_file_get_comment (keyfile, "second", NULL, &error); 514b5975d6bSopenharmony_ci+ check_no_error (&error); 515b5975d6bSopenharmony_ci+ g_assert_cmpstr (comment, ==, group_comment_2); 516b5975d6bSopenharmony_ci+ g_free (comment); 517b5975d6bSopenharmony_ci+ 518b5975d6bSopenharmony_ci+ comment = g_key_file_get_comment (keyfile, "third", NULL, &error); 519b5975d6bSopenharmony_ci+ check_no_error (&error); 520b5975d6bSopenharmony_ci+ g_assert_cmpstr (comment, ==, group_comment_3); 521b5975d6bSopenharmony_ci+ g_free (comment); 522b5975d6bSopenharmony_ci+ 523b5975d6bSopenharmony_ci+ comment = g_key_file_get_comment (keyfile, "fourth", NULL, &error); 524b5975d6bSopenharmony_ci+ check_no_error (&error); 525b5975d6bSopenharmony_ci+ g_assert_cmpstr (comment, ==, group_comment_4); 526b5975d6bSopenharmony_ci+ g_free (comment); 527b5975d6bSopenharmony_ci+ 528b5975d6bSopenharmony_ci+ comment = g_key_file_get_comment (keyfile, "fifth", NULL, &error); 529b5975d6bSopenharmony_ci+ check_no_error (&error); 530b5975d6bSopenharmony_ci+ g_assert_null (comment); 531b5975d6bSopenharmony_ci+ 532b5975d6bSopenharmony_ci g_key_file_free (keyfile); 533b5975d6bSopenharmony_ci 534b5975d6bSopenharmony_ci g_assert_cmpstr (data1, ==, data2); 535b5975d6bSopenharmony_ci-- 536b5975d6bSopenharmony_ciGitLab