Fix gsettings tool string handling

There are some bugs caused by the way that gsettings-tool currently
attempts to help the user when they leave the quotes off of a string
value that they are setting.

Simplify the code to make it more robust and add some comments about why
it should be done this way.

https://bugzilla.gnome.org/show_bug.cgi?id=649915
This commit is contained in:
Ryan Lortie 2011-05-17 11:58:46 -04:00
parent d9440687ff
commit 8148a3c396

View File

@ -465,21 +465,33 @@ gsettings_set (GSettings *settings,
new = g_variant_parse (type, value, NULL, NULL, &error); new = g_variant_parse (type, value, NULL, NULL, &error);
/* A common error is to specify a string with single quotes /* If that didn't work and the type is string then we should assume
* (or use completion for that), and forget that the shell * that the user is just trying to set a string directly and forgot
* will eat one level of quoting, resulting in 'unknown keyword' * the quotes (or had them consumed by the shell).
* error from the gvariant parser. *
* To handle this case, try to parse again with an extra level * If the user started with a quote then we assume that some deeper
* of quotes. * problem is at play and we want the failure in that case.
*
* Consider:
*
* gsettings set x.y.z key "'i don't expect this to work'"
*
* Note that we should not just add quotes and try parsing again, but
* rather assume that the user is providing us with a bare string.
* Assume we added single quotes, then consider this case:
*
* gsettings set x.y.z key "i'd expect this to work"
*
* A similar example could be given for double quotes.
*
* Avoid that whole mess by just using g_variant_new_string().
*/ */
if (new == NULL && if (new == NULL &&
g_error_matches (error, G_VARIANT_PARSE_ERROR, g_variant_type_equal (type, G_VARIANT_TYPE_STRING) &&
G_VARIANT_PARSE_ERROR_UNKNOWN_KEYWORD)) value[0] != '\'' && value[0] != '"')
{ {
value = freeme = g_strdup_printf ("\"%s\"", value); g_clear_error (&error);
new = g_variant_parse (type, value, NULL, NULL, NULL); new = g_variant_new_string (value);
if (new != NULL)
g_clear_error (&error);
} }
if (new == NULL) if (new == NULL)