forked from pool/desktop-file-utils
0b877baee6
Some upstream desktop files do not have a trailing semicolon in multivalued strings, which are optional with the latest spec: http://standards.freedesktop.org/desktop-entry-spec/latest/ar01s03.html Also add Cinnamon and EDE desktop environments. All three patches taken from upstream git. OBS-URL: https://build.opensuse.org/request/show/265209 OBS-URL: https://build.opensuse.org/package/show/X11:common:Factory/desktop-file-utils?expand=0&rev=44
175 lines
5.8 KiB
Diff
175 lines
5.8 KiB
Diff
From 9e279cc3fac9a7e92bf426867fa83c0c7aec5711 Mon Sep 17 00:00:00 2001
|
|
From: Jerome Leclanche <jerome@leclan.ch>
|
|
Date: Tue, 1 Apr 2014 15:33:16 +0200
|
|
Subject: desktop-file-validate: Trailing semicolons have been downgraded to
|
|
optional
|
|
|
|
https://bugs.freedesktop.org/show_bug.cgi?id=76902
|
|
Approved by David Faure and Ryan Lortie
|
|
|
|
diff --git a/src/validate.c b/src/validate.c
|
|
index 68fd6f0..77a5fda 100644
|
|
--- a/src/validate.c
|
|
+++ b/src/validate.c
|
|
@@ -765,9 +765,6 @@ validate_numeric_key (kf_validator *kf,
|
|
/* + Values of type string may contain all ASCII characters except for control
|
|
* characters.
|
|
* Checked.
|
|
- * + The multiple values should be separated by a semicolon. Those keys which
|
|
- * have several values should have a semicolon as the trailing character.
|
|
- * Checked.
|
|
* + FIXME: how should an empty list be handled?
|
|
*/
|
|
static gboolean
|
|
@@ -799,24 +796,6 @@ validate_string_regexp_list_key (kf_validator *kf,
|
|
return FALSE;
|
|
}
|
|
|
|
- if (i > 0 && value[i - 1] != ';') {
|
|
- print_fatal (kf, "value \"%s\" for %s list key \"%s\" in group \"%s\" "
|
|
- "does not have a semicolon (';') as trailing "
|
|
- "character\n",
|
|
- value, type, key, kf->current_group);
|
|
-
|
|
- return FALSE;
|
|
- }
|
|
-
|
|
- if (i > 1 && value[i - 1] == ';' && value[i - 2] == '\\' &&
|
|
- (i < 3 || value[i - 3] != '\\')) {
|
|
- print_fatal (kf, "value \"%s\" for %s list key \"%s\" in group \"%s\" "
|
|
- "has an escaped semicolon (';') as trailing character\n",
|
|
- value, type, key, kf->current_group);
|
|
-
|
|
- return FALSE;
|
|
- }
|
|
-
|
|
return TRUE;
|
|
}
|
|
|
|
@@ -845,10 +824,6 @@ validate_regexp_list_key (kf_validator *kf,
|
|
* + If a postfixed key occurs, the same key must be also present without the
|
|
* postfix.
|
|
* Checked.
|
|
- * + The multiple values should be separated by a semicolon. Those keys which
|
|
- * have several values should have a semicolon as the trailing character.
|
|
- * FIXME: partly checked. We use checks that work for sure for ascii
|
|
- * characters, but that could possibly fail in some weird UTF-8 strings.
|
|
* + FIXME: how should an empty list be handled?
|
|
*/
|
|
static gboolean
|
|
@@ -858,7 +833,6 @@ validate_localestring_list_key (kf_validator *kf,
|
|
const char *value)
|
|
{
|
|
char *locale_key;
|
|
- int len;
|
|
|
|
if (locale)
|
|
locale_key = g_strdup_printf ("%s[%s]", key, locale);
|
|
@@ -876,27 +850,6 @@ validate_localestring_list_key (kf_validator *kf,
|
|
return FALSE;
|
|
}
|
|
|
|
- len = strlen (value);
|
|
-
|
|
- if (len > 0 && value[len - 1] != ';') {
|
|
- print_fatal (kf, "value \"%s\" for locale string list key \"%s\" in group "
|
|
- "\"%s\" does not have a semicolon (';') as trailing "
|
|
- "character\n",
|
|
- value, locale_key, kf->current_group);
|
|
-
|
|
- return FALSE;
|
|
- }
|
|
-
|
|
- if (len > 1 && value[len - 1] == ';' && value[len - 2] == '\\' &&
|
|
- (len < 3 || value[len - 3] != '\\')) {
|
|
- print_fatal (kf, "value \"%s\" for locale string list key \"%s\" in group "
|
|
- "\"%s\" has an escaped semicolon (';') as trailing "
|
|
- "character\n",
|
|
- value, locale_key, kf->current_group);
|
|
-
|
|
- return FALSE;
|
|
- }
|
|
-
|
|
if (!g_hash_table_lookup (kf->current_keys, key)) {
|
|
print_fatal (kf, "key \"%s\" in group \"%s\" is a localized key, but "
|
|
"there is no non-localized key \"%s\"\n",
|
|
@@ -3109,45 +3062,11 @@ desktop_file_validate (const char *filename,
|
|
return (!kf.fatal_error);
|
|
}
|
|
|
|
-static void
|
|
-fixup_list (GKeyFile *keyfile,
|
|
- const gchar *filename,
|
|
- const gchar *key)
|
|
-{
|
|
- char *value;
|
|
- int len;
|
|
-
|
|
- value = g_key_file_get_value (keyfile, GROUP_DESKTOP_ENTRY, key, NULL);
|
|
- if (!value)
|
|
- return;
|
|
-
|
|
- len = strlen (value);
|
|
-
|
|
- if (len > 0 && (value[len - 1] != ';' ||
|
|
- (len > 1 && value[len - 2] == '\\' &&
|
|
- (len < 3 || value[len - 3] != '\\')))) {
|
|
- char *str;
|
|
-
|
|
- g_printerr ("%s: warning: key \"%s\" is a list and does not have a "
|
|
- "semicolon as trailing character, fixing\n",
|
|
- filename, key);
|
|
-
|
|
- str = g_strconcat (value, ";", NULL);
|
|
- g_key_file_set_value (keyfile, GROUP_DESKTOP_ENTRY,
|
|
- key, str);
|
|
- g_free (str);
|
|
- }
|
|
-}
|
|
-
|
|
/* return FALSE if we were unable to fix the file */
|
|
gboolean
|
|
desktop_file_fixup (GKeyFile *keyfile,
|
|
const char *filename)
|
|
{
|
|
- gchar **keys;
|
|
- gsize keys_nb;
|
|
- unsigned int i;
|
|
-
|
|
if (g_key_file_has_group (keyfile, GROUP_KDE_DESKTOP_ENTRY)) {
|
|
g_printerr ("%s: warning: renaming deprecated \"%s\" group to \"%s\"\n",
|
|
filename, GROUP_KDE_DESKTOP_ENTRY, GROUP_DESKTOP_ENTRY);
|
|
@@ -3155,29 +3074,5 @@ desktop_file_fixup (GKeyFile *keyfile,
|
|
GROUP_KDE_DESKTOP_ENTRY, GROUP_DESKTOP_ENTRY);
|
|
}
|
|
|
|
- keys = g_key_file_get_keys (keyfile, GROUP_DESKTOP_ENTRY, &keys_nb, NULL);
|
|
-
|
|
- /* Fix lists to have a ';' at the end if they don't */
|
|
- for (i = 0; i < G_N_ELEMENTS (registered_desktop_keys); i++) {
|
|
- if (registered_desktop_keys[i].type == DESKTOP_STRING_LIST_TYPE ||
|
|
- registered_desktop_keys[i].type == DESKTOP_REGEXP_LIST_TYPE)
|
|
- fixup_list (keyfile, filename, registered_desktop_keys[i].name);
|
|
-
|
|
- if (registered_desktop_keys[i].type == DESKTOP_LOCALESTRING_LIST_TYPE) {
|
|
- gsize keylen;
|
|
- guint j;
|
|
-
|
|
- keylen = strlen (registered_desktop_keys[i].name);
|
|
- for (j = 0; j < keys_nb; j++) {
|
|
- if (g_str_has_prefix (keys[j], registered_desktop_keys[i].name) &&
|
|
- (keys[j][keylen] == '[' || keys[j][keylen] == '\0')) {
|
|
- fixup_list (keyfile, filename, keys[j]);
|
|
- }
|
|
- }
|
|
- }
|
|
- }
|
|
-
|
|
- g_strfreev (keys);
|
|
-
|
|
return TRUE;
|
|
}
|
|
--
|
|
cgit v0.10.2
|
|
|