summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRyan Lortie <desrt@desrt.ca>2010-09-27 11:10:11 -0400
committerRyan Lortie <desrt@desrt.ca>2010-10-01 11:21:13 -0400
commit3e771509b487fbc671e9217f8dcbd20daa44c116 (patch)
tree7538607aea9821094eb1d279bcd1079a5d1d1bc9
parentbd290081ff8c7951c6509d0aee23246739a928a2 (diff)
Bug 628937 - gracefully handle broken schemas
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.
-rw-r--r--gio/glib-compile-schemas.c121
1 files 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);