summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVincent Untz <vuntz@gnome.org>2012-10-03 13:01:11 +0200
committerVincent Untz <vuntz@gnome.org>2012-10-03 13:01:11 +0200
commit355b4c6f7e4203a7c8ae184a2db76ae157235003 (patch)
tree12173c63869433587462aa420c6d6929c3033ee9
parentb18be61ad4957ea312efcbe65c6cffe2ef52fc6a (diff)
downloaddesktop-file-utils-355b4c6f7e4203a7c8ae184a2db76ae157235003.tar.gz
validate: Rework multiple main categories detection
AudioVideo is required if Audio or Video is present, and that would be two main categories. But in that case, this is okay. So we need to ignore the case of two main categories when one is required by the other.
-rw-r--r--src/validate.c62
1 files changed, 51 insertions, 11 deletions
diff --git a/src/validate.c b/src/validate.c
index 61c8a90..ac51597 100644
--- a/src/validate.c
+++ b/src/validate.c
@@ -1511,8 +1511,7 @@ handle_categories_key (kf_validator *kf,
GHashTable *hashtable;
int i;
unsigned int j;
- gboolean main_category_present;
- gboolean more_than_one_main_category;
+ int main_categories_nb;
handle_key_for_application (kf, locale_key, value);
@@ -1546,8 +1545,7 @@ handle_categories_key (kf_validator *kf,
}
/* second pass */
- main_category_present = FALSE;
- more_than_one_main_category = FALSE;
+ main_categories_nb = 0;
for (i = 0; categories[i]; i++) {
unsigned int k;
@@ -1574,17 +1572,57 @@ handle_categories_key (kf_validator *kf,
continue;
}
- if (registered_categories[j].main && main_category_present &&
- !more_than_one_main_category) {
+ if (registered_categories[j].main) {
+ /* only count it as a main category if none of the required categories
+ * for this one is also a main category (and is present) */
+ gboolean required_main_category_present = FALSE;
+
+ for (k = 0; registered_categories[j].requires[k] != NULL; k++) {
+ char **required_categories;
+ int l;
+
+ required_categories = g_strsplit (registered_categories[j].requires[k],
+ ";", 0);
+
+ for (l = 0; required_categories[l]; l++) {
+ unsigned int m;
+
+ if (!g_hash_table_lookup (hashtable, required_categories[l]))
+ continue;
+
+ for (m = 0; m < G_N_ELEMENTS (registered_categories); m++) {
+ if (strcmp (required_categories[l],
+ registered_categories[m].name) != 0)
+ continue;
+
+ if (registered_categories[m].main)
+ required_main_category_present = TRUE;
+
+ break;
+ }
+
+ if (required_main_category_present)
+ break;
+ }
+
+ if (required_main_category_present) {
+ g_strfreev (required_categories);
+ break;
+ }
+
+ g_strfreev (required_categories);
+ }
+
+ if (!required_main_category_present)
+ main_categories_nb++;
+ }
+
+ if (registered_categories[j].main && main_categories_nb > 1)
print_hint (kf, "value \"%s\" for key \"%s\" in group \"%s\" "
"contains more than one main category; application "
"might appear more than once in the application menu\n",
value, locale_key, kf->current_group);
- more_than_one_main_category = TRUE;
- }
- if (registered_categories[j].main)
- main_category_present = TRUE;
if (registered_categories[j].deprecated) {
if (!kf->no_deprecated_warnings)
@@ -1698,7 +1736,9 @@ handle_categories_key (kf_validator *kf,
g_strfreev (categories);
g_hash_table_destroy (hashtable);
- if (!main_category_present)
+ g_assert (main_categories_nb >= 0);
+
+ if (main_categories_nb == 0)
print_hint (kf, "value \"%s\" for key \"%s\" in group \"%s\" "
"does not contain a registered main category; application "
"might only show up in a \"catch-all\" section of the "