From 3e771509b487fbc671e9217f8dcbd20daa44c116 Mon Sep 17 00:00:00 2001 From: Ryan Lortie Date: Mon, 27 Sep 2010 11:10:11 -0400 Subject: [PATCH] Bug 628937 - gracefully handle broken schemas MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Implement the second feature requested in the bug: silently ignore override files that attempt to override schemas that are not currently installed. Also, support 'strictness' being optional for other errors when parsing override files (ie: inability to open the file, unknown key name, parse errors, out of range). We don't completely back out the file in this case — as that is difficult with the current implementation — but just ignore the override for the single key. --- gio/glib-compile-schemas.c | 121 +++++++++++++++++++++++++------------ 1 file changed, 83 insertions(+), 38 deletions(-) diff --git a/gio/glib-compile-schemas.c b/gio/glib-compile-schemas.c index 977c71147..c2725b481 100644 --- a/gio/glib-compile-schemas.c +++ b/gio/glib-compile-schemas.c @@ -1685,9 +1685,10 @@ compare_strings (gconstpointer a, static gboolean set_overrides (GHashTable *schema_table, gchar **files, - GError **error) + gboolean strict) { const gchar *filename; + GError *error = NULL; while ((filename = *files++)) { @@ -1696,10 +1697,19 @@ set_overrides (GHashTable *schema_table, gint i; key_file = g_key_file_new (); - if (!g_key_file_load_from_file (key_file, filename, 0, error)) + if (!g_key_file_load_from_file (key_file, filename, 0, &error)) { + fprintf (stderr, "%s: %s. ", filename, error->message); g_key_file_free (key_file); + g_clear_error (&error); + if (!strict) + { + fprintf (stderr, _("Ignoring this file.\n")); + continue; + } + + fprintf (stderr, _("--strict was specified; exiting.\n")); return FALSE; } @@ -1715,16 +1725,11 @@ set_overrides (GHashTable *schema_table, schema = g_hash_table_lookup (schema_table, group); if (schema == NULL) - { - g_set_error (error, G_KEY_FILE_ERROR, - G_KEY_FILE_ERROR_GROUP_NOT_FOUND, - _("No such schema `%s' specified in " - "override file `%s'"), group, filename); - g_key_file_free (key_file); - g_strfreev (groups); - - return FALSE; - } + /* Having the schema not be installed is expected to be a + * common case. Don't even emit an error message about + * that. + */ + continue; keys = g_key_file_get_keys (key_file, group, NULL, NULL); g_assert (keys != NULL); @@ -1740,11 +1745,17 @@ set_overrides (GHashTable *schema_table, if (state == NULL) { - g_set_error (error, G_KEY_FILE_ERROR, - G_KEY_FILE_ERROR_KEY_NOT_FOUND, - _("No such key `%s' in schema `%s' as " - "specified in override file `%s'"), - key, group, filename); + fprintf (stderr, _("No such key `%s' in schema `%s' as " + "specified in override file `%s'"), + key, group, filename); + + if (!strict) + { + fprintf (stderr, _("; ignoring override for this key.\n")); + continue; + } + + fprintf (stderr, _(" and --strict was specified; exiting.\n")); g_key_file_free (key_file); g_strfreev (groups); g_strfreev (keys); @@ -1756,14 +1767,28 @@ set_overrides (GHashTable *schema_table, g_assert (string != NULL); value = g_variant_parse (state->type, string, - NULL, NULL, error); + NULL, NULL, &error); if (value == NULL) { + fprintf (stderr, _("error parsing key `%s' in schema `%s' " + "as specified in override file `%s': " + "%s. "), + key, group, filename, error->message); + + g_clear_error (&error); + g_free (string); + + if (!strict) + { + fprintf (stderr, _("Ignoring override for this key.\n")); + continue; + } + + fprintf (stderr, _("--strict was specified; exiting.\n")); g_key_file_free (key_file); g_strfreev (groups); g_strfreev (keys); - g_free (string); return FALSE; } @@ -1773,18 +1798,25 @@ set_overrides (GHashTable *schema_table, if (g_variant_compare (value, state->minimum) < 0 || g_variant_compare (value, state->maximum) > 0) { - g_set_error (error, G_MARKUP_ERROR, - G_MARKUP_ERROR_INVALID_CONTENT, - _("override for key `%s' in schema `%s' in " - "override file `%s' is out of the range " - "given in the schema"), - key, group, filename); + fprintf (stderr, + _("override for key `%s' in schema `%s' in " + "override file `%s' is out of the range " + "given in the schema"), + key, group, filename); - g_key_file_free (key_file); g_variant_unref (value); + g_free (string); + + if (!strict) + { + fprintf (stderr, _("; ignoring override for this key.\n")); + continue; + } + + fprintf (stderr, _(" and --strict was specified; exiting.\n")); + g_key_file_free (key_file); g_strfreev (groups); g_strfreev (keys); - g_free (string); return FALSE; } @@ -1794,18 +1826,25 @@ set_overrides (GHashTable *schema_table, { if (!is_valid_choices (value, state->strinfo)) { - g_set_error (error, G_MARKUP_ERROR, - G_MARKUP_ERROR_INVALID_CONTENT, - _("override for key `%s' in schema `%s' in " - "override file `%s' is not in the list " - "of valid choices"), - key, group, filename); + fprintf (stderr, + _("override for key `%s' in schema `%s' in " + "override file `%s' is not in the list " + "of valid choices"), + key, group, filename); - g_key_file_free (key_file); g_variant_unref (value); + g_free (string); + + if (!strict) + { + fprintf (stderr, _("; ignoring override for this key.\n")); + continue; + } + + fprintf (stderr, _(" and --strict was specified; exiting.\n")); + g_key_file_free (key_file); g_strfreev (groups); g_strfreev (keys); - g_free (string); return FALSE; } @@ -1813,9 +1852,9 @@ set_overrides (GHashTable *schema_table, g_variant_unref (state->default_value); state->default_value = value; + g_free (string); } - g_strfreev (keys); } @@ -1939,8 +1978,14 @@ main (int argc, char **argv) return 1; } - if ((override_files != NULL && !set_overrides (table, override_files, &error)) || - (!dry_run && !write_to_file (table, target, &error))) + if (override_files != NULL && + !set_overrides (table, override_files, strict)) + { + g_free (target); + return 1; + } + + if (!dry_run && !write_to_file (table, target, &error)) { fprintf (stderr, "%s\n", error->message); g_free (target);