diff options
author | Richard Hughes <richard@hughsie.com> | 2016-03-31 18:40:03 +0100 |
---|---|---|
committer | Richard Hughes <richard@hughsie.com> | 2016-03-31 18:41:44 +0100 |
commit | d196fc01e467af2d206ade417f1c38818be1d3f0 (patch) | |
tree | ed775d6dcbd45ffce8e5392cbea8a68a9d71fab9 | |
parent | 74a51424283b3176bb6708b9eb6cad045dcaa2c3 (diff) | |
download | appstream-glib-d196fc01e467af2d206ade417f1c38818be1d3f0.tar.gz |
Enforce the requirement of AppData for 'Categories=DesktopSettings'
This is enforced for both generation of AppStream metadata, and the display of
installed apps. If your system settings program disappears, just write an
AppData file!
-rw-r--r-- | libappstream-glib/as-store.c | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/libappstream-glib/as-store.c b/libappstream-glib/as-store.c index 3d53b0b..c808751 100644 --- a/libappstream-glib/as-store.c +++ b/libappstream-glib/as-store.c @@ -1549,6 +1549,69 @@ as_store_apps_sort_cb (gconstpointer a, gconstpointer b) } /** + * as_store_check_app_for_veto: + **/ +static void +as_store_check_app_for_veto (AsApp *app) +{ + /* these categories need AppData files */ + if (as_app_get_description_size (app) == 0) { + guint i; + const gchar *cats_require_appdata[] = { + "ConsoleOnly", + "DesktopSettings", + "Settings", + NULL }; + for (i = 0; cats_require_appdata[i] != NULL; i++) { + if (as_app_has_category (app, cats_require_appdata[i])) { + as_app_add_veto (app, "%s requires an AppData file", + cats_require_appdata[i]); + } + } + } +} + +/** + * as_store_check_apps_for_veto: + **/ +static void +as_store_check_apps_for_veto (AsStore *store) +{ + guint i; + AsApp *app; + AsStorePrivate *priv = GET_PRIVATE (store); + + /* add any vetos */ + for (i = 0; i < priv->array->len; i++) { + app = g_ptr_array_index (priv->array, i); + as_store_check_app_for_veto (app); + } +} + +/** + * as_store_remove_apps_with_veto: + **/ +static void +as_store_remove_apps_with_veto (AsStore *store) +{ + guint i; + AsApp *app; + AsStorePrivate *priv = GET_PRIVATE (store); + + do { + for (i = 0; i < priv->array->len; i++) { + app = g_ptr_array_index (priv->array, i); + if (as_app_get_vetos (app)->len > 0) { + g_debug ("removing %s as vetoed", + as_app_get_id (app)); + as_store_remove_app (store, app); + break; + } + } + } while (i < priv->array->len); +} + +/** * as_store_to_xml: * @store: a #AsStore instance. * @flags: the AsNodeToXmlFlags, e.g. %AS_NODE_INSERT_FLAG_NONE. @@ -1571,6 +1634,9 @@ as_store_to_xml (AsStore *store, AsNodeToXmlFlags flags) gchar version[6]; g_autofree AsNodeContext *ctx = NULL; + /* check categories of apps about to be written */ + as_store_check_apps_for_veto (store); + /* get XML text */ node_root = as_node_new (); node_apps = as_node_insert (node_root, "components", NULL, 0, NULL); @@ -2555,6 +2621,10 @@ as_store_load (AsStore *store, if (!as_store_search_per_system (store, flags, cancellable, error)) return FALSE; + /* find and remove any vetoed applications */ + as_store_check_apps_for_veto (store); + as_store_remove_apps_with_veto (store); + /* match again, for applications extended from different roots */ as_store_match_addons (store); |