diff --git a/ChangeLog b/ChangeLog index c40e5ea50..d34e01c82 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,11 @@ 2005-02-01 Matthias Clasen + * tests/keyfile-test.c (test_key_remove): Add test case for + key removal. + + * glib/gkeyfile.c (g_key_file_remove_key): Actually remove + the key from the list of pairs. (#165980, David Hoover) + * glib/gkeyfile.c: Doc clarifications. (#165907, Vincent Untz) * tests/keyfile-test.c (test_group_remove): Add test case for diff --git a/ChangeLog.pre-2-10 b/ChangeLog.pre-2-10 index c40e5ea50..d34e01c82 100644 --- a/ChangeLog.pre-2-10 +++ b/ChangeLog.pre-2-10 @@ -1,5 +1,11 @@ 2005-02-01 Matthias Clasen + * tests/keyfile-test.c (test_key_remove): Add test case for + key removal. + + * glib/gkeyfile.c (g_key_file_remove_key): Actually remove + the key from the list of pairs. (#165980, David Hoover) + * glib/gkeyfile.c: Doc clarifications. (#165907, Vincent Untz) * tests/keyfile-test.c (test_group_remove): Add test case for diff --git a/ChangeLog.pre-2-12 b/ChangeLog.pre-2-12 index c40e5ea50..d34e01c82 100644 --- a/ChangeLog.pre-2-12 +++ b/ChangeLog.pre-2-12 @@ -1,5 +1,11 @@ 2005-02-01 Matthias Clasen + * tests/keyfile-test.c (test_key_remove): Add test case for + key removal. + + * glib/gkeyfile.c (g_key_file_remove_key): Actually remove + the key from the list of pairs. (#165980, David Hoover) + * glib/gkeyfile.c: Doc clarifications. (#165907, Vincent Untz) * tests/keyfile-test.c (test_group_remove): Add test case for diff --git a/ChangeLog.pre-2-8 b/ChangeLog.pre-2-8 index c40e5ea50..d34e01c82 100644 --- a/ChangeLog.pre-2-8 +++ b/ChangeLog.pre-2-8 @@ -1,5 +1,11 @@ 2005-02-01 Matthias Clasen + * tests/keyfile-test.c (test_key_remove): Add test case for + key removal. + + * glib/gkeyfile.c (g_key_file_remove_key): Actually remove + the key from the list of pairs. (#165980, David Hoover) + * glib/gkeyfile.c: Doc clarifications. (#165907, Vincent Untz) * tests/keyfile-test.c (test_group_remove): Add test case for diff --git a/glib/gkeyfile.c b/glib/gkeyfile.c index 298eeccce..6fe8eeed0 100644 --- a/glib/gkeyfile.c +++ b/glib/gkeyfile.c @@ -2765,11 +2765,14 @@ g_key_file_remove_group (GKeyFile *key_file, group_node = g_key_file_lookup_group_node (key_file, group_name); if (!group_node) - g_set_error (error, G_KEY_FILE_ERROR, - G_KEY_FILE_ERROR_GROUP_NOT_FOUND, - _("Key file does not have group '%s'"), - group_name); - else + { + g_set_error (error, G_KEY_FILE_ERROR, + G_KEY_FILE_ERROR_GROUP_NOT_FOUND, + _("Key file does not have group '%s'"), + group_name); + return; + } + g_key_file_remove_group_node (key_file, group_node); } @@ -2827,7 +2830,6 @@ g_key_file_remove_key (GKeyFile *key_file, return; } - group->key_value_pairs = g_list_remove (group->key_value_pairs, key_file); pair = g_key_file_lookup_key_value_pair (key_file, group, key); if (!pair) @@ -2839,9 +2841,10 @@ g_key_file_remove_key (GKeyFile *key_file, return; } - g_hash_table_remove (group->lookup_map, pair->key); - key_file->approximate_size -= strlen (pair->key) + strlen (pair->value) + 2; + + group->key_value_pairs = g_list_remove (group->key_value_pairs, pair); + g_hash_table_remove (group->lookup_map, pair->key); g_key_file_key_value_pair_free (pair); } diff --git a/tests/keyfile-test.c b/tests/keyfile-test.c index 62e4e2243..9b2559f33 100644 --- a/tests/keyfile-test.c +++ b/tests/keyfile-test.c @@ -568,71 +568,6 @@ test_integer (void) g_key_file_free (keyfile); } -/* http://bugzilla.gnome.org/show_bug.cgi?id=165887 */ -static void -test_group_remove (void) -{ - GKeyFile *keyfile; - gchar **names; - gsize len; - GError *error = NULL; - - const gchar *data = - "[group1]\n" - "[group2]\n" - "key1=bla\n" - "key2=bla\n" - "[group3]\n" - "key1=bla\n" - "key2=bla\n"; - - keyfile = load_data (data, 0); - - names = g_key_file_get_groups (keyfile, &len); - if (names == NULL) - { - g_print ("Error listing groups\n"); - exit (1); - } - - check_length ("groups", g_strv_length (names), len, 3); - check_name ("group name", names[0], "group1", 0); - check_name ("group name", names[1], "group2", 1); - check_name ("group name", names[2], "group3", 2); - - g_key_file_remove_group (keyfile, "group1", &error); - check_no_error (&error); - - names = g_key_file_get_groups (keyfile, &len); - if (names == NULL) - { - g_print ("Error listing groups\n"); - exit (1); - } - - check_length ("groups", g_strv_length (names), len, 2); - check_name ("group name", names[0], "group2", 0); - check_name ("group name", names[1], "group3", 1); - - g_key_file_remove_group (keyfile, "group2", &error); - check_no_error (&error); - - names = g_key_file_get_groups (keyfile, &len); - if (names == NULL) - { - g_print ("Error listing groups\n"); - exit (1); - } - - check_length ("groups", g_strv_length (names), len, 1); - check_name ("group name", names[0], "group3", 0); - - g_key_file_remove_group (keyfile, "no such group", &error); - check_error (&error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_GROUP_NOT_FOUND); - - g_key_file_free (keyfile); -} - /* check handling of translated strings */ static void test_locale_string (void) @@ -738,6 +673,105 @@ test_lists (void) g_key_file_free (keyfile); } +/* http://bugzilla.gnome.org/show_bug.cgi?id=165887 */ +static void +test_group_remove (void) +{ + GKeyFile *keyfile; + gchar **names; + gsize len; + GError *error = NULL; + + const gchar *data = + "[group1]\n" + "[group2]\n" + "key1=bla\n" + "key2=bla\n" + "[group3]\n" + "key1=bla\n" + "key2=bla\n"; + + keyfile = load_data (data, 0); + + names = g_key_file_get_groups (keyfile, &len); + if (names == NULL) + { + g_print ("Error listing groups\n"); + exit (1); + } + + check_length ("groups", g_strv_length (names), len, 3); + check_name ("group name", names[0], "group1", 0); + check_name ("group name", names[1], "group2", 1); + check_name ("group name", names[2], "group3", 2); + + g_key_file_remove_group (keyfile, "group1", &error); + check_no_error (&error); + + names = g_key_file_get_groups (keyfile, &len); + if (names == NULL) + { + g_print ("Error listing groups\n"); + exit (1); + } + + check_length ("groups", g_strv_length (names), len, 2); + check_name ("group name", names[0], "group2", 0); + check_name ("group name", names[1], "group3", 1); + + g_key_file_remove_group (keyfile, "group2", &error); + check_no_error (&error); + + names = g_key_file_get_groups (keyfile, &len); + if (names == NULL) + { + g_print ("Error listing groups\n"); + exit (1); + } + + check_length ("groups", g_strv_length (names), len, 1); + check_name ("group name", names[0], "group3", 0); + + g_key_file_remove_group (keyfile, "no such group", &error); + check_error (&error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_GROUP_NOT_FOUND); + + g_key_file_free (keyfile); +} + +/* http://bugzilla.gnome.org/show_bug.cgi?id=165980 */ +static void +test_key_remove (void) +{ + GKeyFile *keyfile; + gchar *value; + GError *error = NULL; + + const gchar *data = + "[group1]\n" + "key1=bla\n" + "key2=bla\n"; + + keyfile = load_data (data, 0); + + check_string_value (keyfile, "group1", "key1", "bla"); + + g_key_file_remove_key (keyfile, "group1", "key1", &error); + check_no_error (&error); + + value = g_key_file_get_string (keyfile, "group1", "key1", &error); + check_error (&error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_KEY_NOT_FOUND); + g_free (value); + + g_key_file_remove_key (keyfile, "group1", "key1", &error); + check_error (&error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_KEY_NOT_FOUND); + + g_key_file_remove_key (keyfile, "no such group", "key1", &error); + check_error (&error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_GROUP_NOT_FOUND); + + g_key_file_free (keyfile); +} + + int main (int argc, char *argv[]) { @@ -750,6 +784,7 @@ main (int argc, char *argv[]) test_locale_string (); test_lists (); test_group_remove (); + test_key_remove (); return 0; }