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