If the group is already there, make it current. (#385910, Joe Halliwell)
authorMatthias Clasen <mclasen@redhat.com>
Thu, 14 Dec 2006 23:19:28 +0000 (23:19 +0000)
committerMatthias Clasen <matthiasc@src.gnome.org>
Thu, 14 Dec 2006 23:19:28 +0000 (23:19 +0000)
2006-12-14  Matthias Clasen  <mclasen@redhat.com>

        * glib/gkeyfile.c (g_key_file_add_group): If the group
        is already there, make it current.  (#385910, Joe Halliwell)

        * tests/keyfile-test.c: Add a test for duplicate groups/keys.

ChangeLog
docs/reference/ChangeLog
docs/reference/glib/tmpl/keyfile.sgml
glib/gkeyfile.c
tests/keyfile-test.c

index 2b292fdb6d70a33c83116317385ee4eac23515b4..572ec4f13939dcf8da6995420d6137943730910f 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2006-12-14  Matthias Clasen  <mclasen@redhat.com>
+
+       * glib/gkeyfile.c (g_key_file_add_group): If the group
+       is already there, make it current.  (#385910, Joe Halliwell)
+
+       * tests/keyfile-test.c: Add a test for duplicate groups/keys.
+
 2006-12-13  Matthias Clasen  <mclasen@redhat.com>
 
        * m4macros/glib-gettext.m4: Require AC_CANONICAL_HOST in
index d728ed2cebf847ec43d99a68ba7a5583a8f0004a..397b1328feebaa6623fdf61f875b4e49d753ea1b 100644 (file)
@@ -1,3 +1,8 @@
+2006-12-14  Matthias Clasen  <mclasen@redhat.com>
+
+       * glib/tmpl/keyfile.sgml: Clarify the behaviour
+       wrt. to duplicate keys and groups.
+
 2006-12-13  Matthias Clasen  <mclasen@redhat.com>
 
        * glib/tmpl/modules.sgml: Point out that valid symbols may be NULL.
index 6b1714e4bd5b00fdddf9aa6a230495eba4f55973..950b6cfd04bd55a3e1bbd51ff10d7eae35e6bef6 100644 (file)
@@ -92,6 +92,14 @@ Key and Group names are case-sensitive, for example a group called
 </itemizedlist>
 </para>
 
+<para>
+Note that in contrast to the
+<ulink url="http://freedesktop.org/Standards/desktop-entry-spec">Desktop
+Entry Specification</ulink>, groups in key files may contain the same
+key multiple times; the last entry wins. Key files may also contain
+multiple groups with the same name; they are merged together.
+</para>
+
 <!-- ##### SECTION See_Also ##### -->
 <para>
 
index 3ab7823e960346fd33cca01338050132371a4c5f..3542c2b9ca8b0f587decad3c5062601d3b5422b2 100644 (file)
@@ -2887,8 +2887,12 @@ g_key_file_add_group (GKeyFile    *key_file,
   g_return_if_fail (key_file != NULL);
   g_return_if_fail (group_name != NULL);
 
-  if (g_key_file_lookup_group_node (key_file, group_name) != NULL)
-    return;
+  group = g_key_file_lookup_group (key_file, group_name);
+  if (group != NULL)
+    {
+      key_file->current_group = group;
+      return;
+    }
 
   group = g_new0 (GKeyFileGroup, 1);
   group->name = g_strdup (group_name);
index fc704bb245f41eef36c73d2b170443f99bf462c3..77a2c53a51a69b5756180aeac4dd362f199d19c6 100644 (file)
@@ -1001,10 +1001,31 @@ test_duplicate_groups (void)
     "key2=123\n";
   
   keyfile = load_data (data, 0);
+  check_string_value (keyfile, "Desktop Entry", "key1", "123");
+  check_string_value (keyfile, "Desktop Entry", "key2", "123");
 
   g_key_file_free (keyfile);  
 }
 
+/* http://bugzilla.gnome.org/show_bug.cgi?id=385910 */
+static void
+test_duplicate_groups2 (void)
+{
+  GKeyFile *keyfile;
+  const gchar *data = 
+    "[A]\n"
+    "foo=bar\n"
+    "[B]\n"
+    "foo=baz\n"
+    "[A]\n"
+    "foo=bang\n";
+  
+  keyfile = load_data (data, 0);
+  check_string_value (keyfile, "A", "foo", "bang");
+  check_string_value (keyfile, "B", "foo", "baz");
+
+  g_key_file_free (keyfile);  
+}
 
 int
 main (int argc, char *argv[])
@@ -1023,6 +1044,7 @@ main (int argc, char *argv[])
   test_groups ();
   test_duplicate_keys ();
   test_duplicate_groups ();
+  test_duplicate_groups2 ();
   
   return 0;
 }