From 355b4c6f7e4203a7c8ae184a2db76ae157235003 Mon Sep 17 00:00:00 2001 From: Vincent Untz Date: Wed, 3 Oct 2012 13:01:11 +0200 Subject: 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. --- src/validate.c | 62 +++++++++++++++++++++++++++++++++++++++++++++++----------- 1 file 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 " -- cgit v1.2.1