From 5a7e894edd53a8159b478f4190d1cd05950c1a05 Mon Sep 17 00:00:00 2001 From: Alexander Larsson Date: Wed, 17 Feb 2016 16:21:20 +0100 Subject: appstream: Add runtime, sdk and tags to appstream xml --- common/xdg-app-utils.c | 97 ++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 87 insertions(+), 10 deletions(-) diff --git a/common/xdg-app-utils.c b/common/xdg-app-utils.c index 46c8fe6..8b2f804 100644 --- a/common/xdg-app-utils.c +++ b/common/xdg-app-utils.c @@ -1529,10 +1529,14 @@ commit_filter (OstreeRepo *repo, static gboolean validate_component (XdgAppXml *component, const char *ref, - const char *id) + const char *id, + char **tags, + const char *runtime, + const char *sdk) { - XdgAppXml *bundle, *text, *prev, *id_node, *id_text_node; + XdgAppXml *bundle, *text, *prev, *id_node, *id_text_node, *metadata, *value; g_autofree char *id_text = NULL; + int i; if (g_strcmp0 (component->element_name, "component") != 0) return FALSE; @@ -1557,19 +1561,62 @@ validate_component (XdgAppXml *component, xdg_app_xml_free (xdg_app_xml_unlink (component, bundle)); bundle = xdg_app_xml_new ("bundle"); - bundle->attribute_names = g_new0 (char *, 2); - bundle->attribute_values = g_new0 (char *, 2); + bundle->attribute_names = g_new0 (char *, 2 * 4); + bundle->attribute_values = g_new0 (char *, 2 * 4); bundle->attribute_names[0] = g_strdup ("type"); bundle->attribute_values[0] = g_strdup ("xdg-app"); + i = 1; + if (runtime) + { + bundle->attribute_names[i] = g_strdup ("runtime"); + bundle->attribute_values[i] = g_strdup (runtime); + i++; + } + + if (sdk) + { + bundle->attribute_names[i] = g_strdup ("sdk"); + bundle->attribute_values[i] = g_strdup (sdk); + i++; + } + + text = xdg_app_xml_new (NULL); + text->text = g_strdup (ref); + xdg_app_xml_add (bundle, text); + xdg_app_xml_add (component, xdg_app_xml_new_text (" ")); xdg_app_xml_add (component, bundle); xdg_app_xml_add (component, xdg_app_xml_new_text ("\n ")); - text = xdg_app_xml_new (NULL); - text->text = g_strdup (ref); + if (tags != NULL && tags[0] != NULL) + { + metadata = xdg_app_xml_find (component, "metadata", NULL); + if (metadata == NULL) + { + metadata = xdg_app_xml_new ("metadata"); + metadata->attribute_names = g_new0 (char *, 1); + metadata->attribute_values = g_new0 (char *, 1); - xdg_app_xml_add (bundle, text); + xdg_app_xml_add (component, xdg_app_xml_new_text (" ")); + xdg_app_xml_add (component, metadata); + xdg_app_xml_add (component, xdg_app_xml_new_text ("\n ")); + } + + value = xdg_app_xml_new ("value"); + value->attribute_names = g_new0 (char *, 2); + value->attribute_values = g_new0 (char *, 2); + value->attribute_names[0] = g_strdup ("key"); + value->attribute_values[0] = g_strdup ("X-XdgApp-Tags"); + xdg_app_xml_add (metadata, xdg_app_xml_new_text ("\n ")); + xdg_app_xml_add (metadata, value); + xdg_app_xml_add (metadata, xdg_app_xml_new_text ("\n ")); + + text = xdg_app_xml_new (NULL); + text->text = g_strjoinv (",", tags); + xdg_app_xml_add (value, text); + + } return TRUE; } @@ -1578,18 +1625,32 @@ static gboolean migrate_xml (XdgAppXml *root, XdgAppXml *appstream, const char *ref, - const char *id) + const char *id, + GKeyFile *metadata) { XdgAppXml *components; XdgAppXml *component; XdgAppXml *prev_component; gboolean migrated = FALSE; + g_auto(GStrv) tags = NULL; + g_autofree const char *runtime = NULL; + g_autofree const char *sdk = NULL; + const char *group; if (root->first_child == NULL || root->first_child->next_sibling != NULL || g_strcmp0 (root->first_child->element_name, "components") != 0) return FALSE; + if (g_str_has_prefix (ref, "app/")) + group = "Application"; + else + group = "Runtime"; + + tags = g_key_file_get_string_list (metadata, group, "tags", NULL, NULL); + runtime = g_key_file_get_string (metadata, group, "runtime", NULL); + sdk = g_key_file_get_string (metadata, group, "sdk", NULL); + components = root->first_child; component = components->first_child; @@ -1598,7 +1659,7 @@ migrate_xml (XdgAppXml *root, { XdgAppXml *next = component->next_sibling; - if (validate_component (component, ref, id)) + if (validate_component (component, ref, id, tags, runtime, sdk)) { xdg_app_xml_add (appstream, xdg_app_xml_unlink (component, prev_component)); migrated = TRUE; @@ -1666,13 +1727,29 @@ extract_appstream (OstreeRepo *repo, g_autoptr(GFile) root = NULL; g_autoptr(GFile) xmls_dir = NULL; g_autoptr(GFile) appstream_file = NULL; + g_autoptr(GFile) metadata = NULL; g_autofree char *appstream_basename = NULL; g_autoptr(GInputStream) in = NULL; g_autoptr(XdgAppXml) xml_root = NULL; + g_autoptr(GKeyFile) keyfile = NULL; if (!ostree_repo_read_commit (repo, ref, &root, NULL, NULL, error)) return FALSE; + keyfile = g_key_file_new (); + metadata = g_file_get_child (root, "metadata"); + if (g_file_query_exists (metadata, cancellable)) + { + g_autofree char *content = NULL; + gsize len; + + if (!g_file_load_contents (metadata, cancellable, &content, &len, NULL, error)) + return FALSE; + + if (!g_key_file_load_from_data (keyfile, content, len, G_KEY_FILE_NONE, error)) + return FALSE; + } + xmls_dir = g_file_resolve_relative_path (root, "files/share/app-info/xmls"); appstream_basename = g_strconcat (id, ".xml.gz", NULL); appstream_file = g_file_get_child (xmls_dir, appstream_basename); @@ -1685,7 +1762,7 @@ extract_appstream (OstreeRepo *repo, if (xml_root == NULL) return FALSE; - if (migrate_xml (xml_root, appstream_components, ref, id)) + if (migrate_xml (xml_root, appstream_components, ref, id, keyfile)) { g_autoptr(GError) my_error = NULL; if (!copy_icon (id, root, dest, "64x64", &my_error)) -- cgit v1.2.1