diff options
author | Vincent Untz <vuntz@gnome.org> | 2012-10-03 13:01:11 +0200 |
---|---|---|
committer | Vincent Untz <vuntz@gnome.org> | 2012-10-03 13:01:11 +0200 |
commit | 355b4c6f7e4203a7c8ae184a2db76ae157235003 (patch) | |
tree | 12173c63869433587462aa420c6d6929c3033ee9 | |
parent | b18be61ad4957ea312efcbe65c6cffe2ef52fc6a (diff) |
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.c | 62 |
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 " |