diff options
-rw-r--r-- | client/as-util.c | 10 | ||||
-rw-r--r-- | libappstream-glib/as-app-validate.c | 47 | ||||
-rw-r--r-- | libappstream-glib/as-app.c | 93 | ||||
-rw-r--r-- | libappstream-glib/as-app.h | 41 | ||||
-rw-r--r-- | libappstream-glib/as-self-test.c | 101 | ||||
-rw-r--r-- | libappstream-glib/as-store.c | 117 |
6 files changed, 272 insertions, 137 deletions
diff --git a/client/as-util.c b/client/as-util.c index 78736ac..aef892f 100644 --- a/client/as-util.c +++ b/client/as-util.c @@ -2970,14 +2970,16 @@ as_util_check_root_app_icon (AsApp *app, GError **error) static void as_util_check_root_app (AsApp *app, GPtrArray *problems) { + AsFormat *format; g_autoptr(GError) error_local = NULL; /* skip */ - if (as_app_get_source_kind (app) == AS_FORMAT_KIND_METAINFO) + format = as_app_get_format_default (app); + if (as_format_get_kind (format) == AS_FORMAT_KIND_METAINFO) return; /* relax this for now */ - if (as_app_get_source_kind (app) == AS_FORMAT_KIND_DESKTOP) + if (as_format_get_kind (format) == AS_FORMAT_KIND_DESKTOP) return; /* check one line summary */ @@ -2985,7 +2987,7 @@ as_util_check_root_app (AsApp *app, GPtrArray *problems) g_ptr_array_add (problems, g_strdup_printf ("%s has no Comment\n - Source: %s", as_app_get_id (app), - as_app_get_source_file (app))); + as_format_get_filename (format))); } /* check icon exists and is large enough */ @@ -2993,7 +2995,7 @@ as_util_check_root_app (AsApp *app, GPtrArray *problems) g_ptr_array_add (problems, g_strdup_printf ("%s\n - Source: %s", error_local->message, - as_app_get_source_file (app))); + as_format_get_filename (format))); } } diff --git a/libappstream-glib/as-app-validate.c b/libappstream-glib/as-app-validate.c index afdaab9..d145f2c 100644 --- a/libappstream-glib/as-app-validate.c +++ b/libappstream-glib/as-app-validate.c @@ -745,6 +745,7 @@ as_app_validate_icons (AsApp *app, AsAppValidateHelper *helper) static void as_app_validate_screenshots (AsApp *app, AsAppValidateHelper *helper) { + AsFormat *format; AsScreenshot *ss; GPtrArray *screenshots; gboolean screenshot_has_default = FALSE; @@ -765,11 +766,12 @@ as_app_validate_screenshots (AsApp *app, AsAppValidateHelper *helper) number_screenshots_min = 0; /* metainfo and inf do not require any screenshots */ - if (as_app_get_source_kind (app) == AS_FORMAT_KIND_METAINFO) + format = as_app_get_format_default (app); + if (as_format_get_kind (format) == AS_FORMAT_KIND_METAINFO) number_screenshots_min = 0; /* only for AppData and AppStream */ - if (as_app_get_source_kind (app) == AS_FORMAT_KIND_DESKTOP) + if (as_format_get_kind (format) == AS_FORMAT_KIND_DESKTOP) return; screenshots = as_app_get_screenshots (app); @@ -880,10 +882,12 @@ static gboolean as_app_validate_releases (AsApp *app, AsAppValidateHelper *helper, GError **error) { GPtrArray *releases; + AsFormat *format; /* only for AppData */ - if (as_app_get_source_kind (app) != AS_FORMAT_KIND_APPDATA && - as_app_get_source_kind (app) != AS_FORMAT_KIND_METAINFO) + format = as_app_get_format_default (app); + if (as_format_get_kind (format) != AS_FORMAT_KIND_APPDATA && + as_format_get_kind (format) != AS_FORMAT_KIND_METAINFO) return TRUE; releases = as_app_get_releases (app); @@ -1064,6 +1068,7 @@ GPtrArray * as_app_validate (AsApp *app, AsAppValidateFlags flags, GError **error) { AsAppProblems problems; + AsFormat *format; GError *error_local = NULL; GHashTable *urls; GList *l; @@ -1098,6 +1103,16 @@ as_app_validate (AsApp *app, AsAppValidateFlags flags, GError **error) g_autoptr(GList) keys = NULL; g_autoptr(AsAppValidateHelper) helper = g_new0 (AsAppValidateHelper, 1); + /* has to be set */ + format = as_app_get_format_default (app); + if (format == NULL) { + g_set_error_literal (error, + AS_APP_ERROR, + AS_APP_ERROR_FAILED, + "cannot validate without at least one format"); + return NULL; + } + /* relax the requirements a bit */ if ((flags & AS_APP_VALIDATE_FLAG_RELAX) > 0) { length_name_max = 100; @@ -1110,7 +1125,7 @@ as_app_validate (AsApp *app, AsAppValidateFlags flags, GError **error) number_para_min = 1; require_sentence_case = FALSE; require_translation = FALSE; - switch (as_app_get_source_kind (app)) { + switch (as_format_get_kind (format)) { case AS_FORMAT_KIND_METAINFO: case AS_FORMAT_KIND_APPDATA: require_name = FALSE; @@ -1131,7 +1146,7 @@ as_app_validate (AsApp *app, AsAppValidateFlags flags, GError **error) } /* addons don't need such a long description */ - switch (as_app_get_source_kind (app)) { + switch (as_format_get_kind (format)) { case AS_FORMAT_KIND_METAINFO: case AS_FORMAT_KIND_APPDATA: number_para_min = 1; @@ -1211,7 +1226,7 @@ as_app_validate (AsApp *app, AsAppValidateFlags flags, GError **error) } } if (license == NULL) { - switch (as_app_get_source_kind (app)) { + switch (as_format_get_kind (format)) { case AS_FORMAT_KIND_APPDATA: case AS_FORMAT_KIND_METAINFO: ai_app_validate_add (helper, @@ -1238,7 +1253,7 @@ as_app_validate (AsApp *app, AsAppValidateFlags flags, GError **error) } } if (require_project_license && license == NULL) { - switch (as_app_get_source_kind (app)) { + switch (as_format_get_kind (format)) { case AS_FORMAT_KIND_APPDATA: case AS_FORMAT_KIND_METAINFO: ai_app_validate_add (helper, @@ -1252,7 +1267,7 @@ as_app_validate (AsApp *app, AsAppValidateFlags flags, GError **error) /* translation */ if (require_translation && - as_app_get_source_kind (app) == AS_FORMAT_KIND_APPDATA && + as_format_get_kind (format) == AS_FORMAT_KIND_APPDATA && as_app_get_translations (app)->len == 0) { ai_app_validate_add (helper, AS_PROBLEM_KIND_TAG_MISSING, @@ -1261,7 +1276,7 @@ as_app_validate (AsApp *app, AsAppValidateFlags flags, GError **error) /* pkgname */ if (as_app_get_pkgname_default (app) != NULL && - as_app_get_source_kind (app) == AS_FORMAT_KIND_METAINFO) { + as_format_get_kind (format) == AS_FORMAT_KIND_METAINFO) { ai_app_validate_add (helper, AS_PROBLEM_KIND_TAG_INVALID, "<pkgname> not allowed in metainfo"); @@ -1269,7 +1284,7 @@ as_app_validate (AsApp *app, AsAppValidateFlags flags, GError **error) /* appdata */ if (as_app_get_icon_default (app) != NULL && - as_app_get_source_kind (app) == AS_FORMAT_KIND_APPDATA && + as_format_get_kind (format) == AS_FORMAT_KIND_APPDATA && as_app_get_kind (app) == AS_APP_KIND_DESKTOP) { ai_app_validate_add (helper, AS_PROBLEM_KIND_TAG_INVALID, @@ -1279,7 +1294,7 @@ as_app_validate (AsApp *app, AsAppValidateFlags flags, GError **error) /* extends */ if (as_app_get_extends(app)->len == 0 && as_app_get_kind (app) == AS_APP_KIND_ADDON && - as_app_get_source_kind (app) == AS_FORMAT_KIND_METAINFO) { + as_format_get_kind (format) == AS_FORMAT_KIND_METAINFO) { ai_app_validate_add (helper, AS_PROBLEM_KIND_TAG_MISSING, "<extends> is not present"); @@ -1300,7 +1315,7 @@ as_app_validate (AsApp *app, AsAppValidateFlags flags, GError **error) update_contact); } if (require_contactdetails && update_contact == NULL) { - switch (as_app_get_source_kind (app)) { + switch (as_format_get_kind (format)) { case AS_FORMAT_KIND_APPDATA: case AS_FORMAT_KIND_METAINFO: ai_app_validate_add (helper, @@ -1314,8 +1329,8 @@ as_app_validate (AsApp *app, AsAppValidateFlags flags, GError **error) /* only found for files */ problems = as_app_get_problems (app); - if (as_app_get_source_kind (app) == AS_FORMAT_KIND_APPDATA || - as_app_get_source_kind (app) == AS_FORMAT_KIND_METAINFO) { + if (as_format_get_kind (format) == AS_FORMAT_KIND_APPDATA || + as_format_get_kind (format) == AS_FORMAT_KIND_METAINFO) { if ((problems & AS_APP_PROBLEM_NO_XML_HEADER) > 0) { ai_app_validate_add (helper, AS_PROBLEM_KIND_MARKUP_INVALID, @@ -1579,7 +1594,7 @@ as_app_validate (AsApp *app, AsAppValidateFlags flags, GError **error) /* require homepage */ if (require_url && as_app_get_url_item (app, AS_URL_KIND_HOMEPAGE) == NULL) { - switch (as_app_get_source_kind (app)) { + switch (as_format_get_kind (format)) { case AS_FORMAT_KIND_APPDATA: case AS_FORMAT_KIND_METAINFO: ai_app_validate_add (helper, diff --git a/libappstream-glib/as-app.c b/libappstream-glib/as-app.c index eedc0ee..bbf0ac6 100644 --- a/libappstream-glib/as-app.c +++ b/libappstream-glib/as-app.c @@ -91,7 +91,6 @@ typedef struct GPtrArray *suggests; /* of AsSuggest */ GPtrArray *requires; /* of AsRequire */ GPtrArray *vetos; /* of AsRefString */ - AsFormatKind source_kind; AsAppScope scope; AsAppMergeKind merge_kind; AsAppState state; @@ -109,7 +108,6 @@ typedef struct AsRefString *update_contact; gchar *unique_id; gboolean unique_id_valid; - AsRefString *source_file; AsRefString *branch; gint priority; gsize token_cache_valid; @@ -439,8 +437,6 @@ as_app_finalize (GObject *object) if (priv->update_contact != NULL) as_ref_string_unref (priv->update_contact); g_free (priv->unique_id); - if (priv->source_file != NULL) - as_ref_string_unref (priv->source_file); if (priv->branch != NULL) as_ref_string_unref (priv->branch); g_hash_table_unref (priv->comments); @@ -1597,7 +1593,11 @@ AsFormatKind as_app_get_source_kind (AsApp *app) { AsAppPrivate *priv = GET_PRIVATE (app); - return priv->source_kind; + if (priv->formats->len > 0) { + AsFormat *format = g_ptr_array_index (priv->formats, 0); + return as_format_get_kind (format); + } + return AS_FORMAT_KIND_UNKNOWN; } /** @@ -2012,9 +2012,7 @@ as_app_get_origin (AsApp *app) * as_app_get_source_file: * @app: a #AsApp instance. * - * Gets the source filename the instance was populated from. - * - * NOTE: this is not set for %AS_FORMAT_KIND_APPSTREAM entries. + * Gets the default source filename the instance was populated from. * * Returns: string, or %NULL if unset * @@ -2024,7 +2022,11 @@ const gchar * as_app_get_source_file (AsApp *app) { AsAppPrivate *priv = GET_PRIVATE (app); - return priv->source_file; + if (priv->formats->len > 0) { + AsFormat *format = g_ptr_array_index (priv->formats, 0); + return as_format_get_filename (format); + } + return NULL; } /** @@ -2135,7 +2137,19 @@ void as_app_set_source_kind (AsApp *app, AsFormatKind source_kind) { AsAppPrivate *priv = GET_PRIVATE (app); - priv->source_kind = source_kind; + g_autoptr(AsFormat) format = NULL; + + /* already exists */ + if (priv->formats->len > 0) { + AsFormat *format_tmp = g_ptr_array_index (priv->formats, 0); + as_format_set_kind (format_tmp, source_kind); + return; + } + + /* create something */ + format = as_format_new (); + as_format_set_kind (format, source_kind); + as_app_add_format (app, format); } /** @@ -2398,8 +2412,9 @@ as_app_set_source_pkgname (AsApp *app, void as_app_set_source_file (AsApp *app, const gchar *source_file) { - AsAppPrivate *priv = GET_PRIVATE (app); - as_ref_string_assign_safe (&priv->source_file, source_file); + g_autoptr(AsFormat) format = as_format_new (); + as_format_set_filename (format, source_file); + as_app_add_format (app, format); } /** @@ -3691,9 +3706,9 @@ as_app_subsume_private (AsApp *app, AsApp *donor, AsAppSubsumeFlags flags) /* AppData or AppStream can overwrite the id-kind of desktop files */ if (flags & AS_APP_SUBSUME_FLAG_SOURCE_KIND) { - if ((priv->source_kind == AS_FORMAT_KIND_APPDATA || - priv->source_kind == AS_FORMAT_KIND_APPSTREAM) && - papp->source_kind == AS_FORMAT_KIND_DESKTOP) + if ((as_app_get_format_by_kind (donor, AS_FORMAT_KIND_APPDATA) != NULL || + as_app_get_format_by_kind (donor, AS_FORMAT_KIND_APPSTREAM) != NULL) && + as_app_get_format_by_kind (app, AS_FORMAT_KIND_DESKTOP) != NULL) as_app_set_kind (app, priv->kind); } @@ -3937,18 +3952,20 @@ as_app_subsume_private (AsApp *app, AsApp *donor, AsAppSubsumeFlags flags) if (flags & AS_APP_SUBSUME_FLAG_KEYWORDS) as_app_subsume_keywords (app, donor, flags); - /* source */ - if (flags & AS_APP_SUBSUME_FLAG_SOURCE_FILE) { - if (priv->source_file != NULL) - as_app_set_source_file (app, priv->source_file); - } - /* branch */ if (flags & AS_APP_SUBSUME_FLAG_BRANCH) { if (priv->branch != NULL) as_app_set_branch (app, priv->branch); } + /* formats */ + if (flags & AS_APP_SUBSUME_FLAG_FORMATS) { + for (i = 0; i < priv->formats->len; i++) { + AsFormat *fmt = g_ptr_array_index (priv->formats, i); + as_app_add_format (app, fmt); + } + } + /* source_pkgname */ if (flags & AS_APP_SUBSUME_FLAG_BUNDLES) { if (priv->source_pkgname != NULL) @@ -4573,9 +4590,10 @@ as_app_node_parse_child (AsApp *app, GNode *n, AsAppParseFlags flags, /* <description> */ case AS_TAG_DESCRIPTION: - + { /* unwrap appdata inline */ - if (priv->source_kind == AS_FORMAT_KIND_APPDATA) { + AsFormat *format = as_app_get_format_by_kind (app, AS_FORMAT_KIND_APPDATA); + if (format != NULL) { GError *error_local = NULL; g_autoptr(GHashTable) unwrapped = NULL; unwrapped = as_node_get_localized_unwrap (n, &error_local); @@ -4587,7 +4605,7 @@ as_app_node_parse_child (AsApp *app, GNode *n, AsAppParseFlags flags, debug = as_node_to_xml (n, AS_NODE_TO_XML_FLAG_NONE); g_warning ("ignoring description '%s' from %s: %s", debug->str, - as_app_get_source_file (app), + as_format_get_filename (format), error_local->message); g_error_free (error_local); break; @@ -4614,6 +4632,7 @@ as_app_node_parse_child (AsApp *app, GNode *n, AsAppParseFlags flags, xml->str); } break; + } /* <icon> */ case AS_TAG_ICON: @@ -5862,21 +5881,20 @@ as_app_parse_file (AsApp *app, AsAppParseFlags flags, GError **error) { - AsAppPrivate *priv = GET_PRIVATE (app); GPtrArray *vetos; + g_autoptr(AsFormat) format = as_format_new (); /* autodetect */ - if (priv->source_kind == AS_FORMAT_KIND_UNKNOWN) { - priv->source_kind = as_format_guess_kind (filename); - if (priv->source_kind == AS_FORMAT_KIND_UNKNOWN) { - g_set_error (error, - AS_APP_ERROR, - AS_APP_ERROR_INVALID_TYPE, - "%s has an unrecognised extension", - filename); - return FALSE; - } + as_format_set_filename (format, filename); + if (as_format_get_kind (format) == AS_FORMAT_KIND_UNKNOWN) { + g_set_error (error, + AS_APP_ERROR, + AS_APP_ERROR_INVALID_TYPE, + "%s has an unrecognised extension", + filename); + return FALSE; } + as_app_add_format (app, format); /* convert <_p> into <p> for easy validation */ if (g_str_has_suffix (filename, ".appdata.xml.in") || @@ -5888,11 +5906,8 @@ as_app_parse_file (AsApp *app, AS_APP_TRUST_FLAG_CHECK_DUPLICATES | AS_APP_TRUST_FLAG_CHECK_VALID_UTF8); - /* set the source location */ - as_app_set_source_file (app, filename); - /* parse */ - switch (priv->source_kind) { + switch (as_format_get_kind (format)) { case AS_FORMAT_KIND_DESKTOP: if (!as_app_parse_desktop_file (app, filename, flags, error)) return FALSE; diff --git a/libappstream-glib/as-app.h b/libappstream-glib/as-app.h index 21ffe73..9a4ea35 100644 --- a/libappstream-glib/as-app.h +++ b/libappstream-glib/as-app.h @@ -119,7 +119,7 @@ typedef enum { * @AS_APP_SUBSUME_FLAG_METADATA: Copy the metadata * @AS_APP_SUBSUME_FLAG_URL: Copy the urls * @AS_APP_SUBSUME_FLAG_KEYWORDS: Copy the keywords - * @AS_APP_SUBSUME_FLAG_SOURCE_FILE: Copy the source file + * @AS_APP_SUBSUME_FLAG_FORMATS: Copy the source file * @AS_APP_SUBSUME_FLAG_BRANCH: Copy the branch * @AS_APP_SUBSUME_FLAG_ORIGIN: Copy the origin * @AS_APP_SUBSUME_FLAG_METADATA_LICENSE: Copy the metadata license @@ -159,7 +159,7 @@ typedef enum { AS_APP_SUBSUME_FLAG_METADATA = 1ull << 25, /* Since: 0.6.1 */ AS_APP_SUBSUME_FLAG_URL = 1ull << 26, /* Since: 0.6.1 */ AS_APP_SUBSUME_FLAG_KEYWORDS = 1ull << 27, /* Since: 0.6.1 */ - AS_APP_SUBSUME_FLAG_SOURCE_FILE = 1ull << 28, /* Since: 0.6.1 */ + AS_APP_SUBSUME_FLAG_FORMATS = 1ull << 28, /* Since: 0.6.1 */ AS_APP_SUBSUME_FLAG_BRANCH = 1ull << 29, /* Since: 0.6.1 */ AS_APP_SUBSUME_FLAG_ORIGIN = 1ull << 30, /* Since: 0.6.1 */ AS_APP_SUBSUME_FLAG_METADATA_LICENSE = 1ull << 31, /* Since: 0.6.1 */ @@ -171,6 +171,9 @@ typedef enum { AS_APP_SUBSUME_FLAG_LAST, } AsAppSubsumeFlags; +/* deprecated */ +#define AS_APP_SUBSUME_FLAG_SOURCE_FILE AS_APP_SUBSUME_FLAG_FORMATS + /* safe to do from a merge <component> */ #define AS_APP_SUBSUME_FLAG_MERGE (AS_APP_SUBSUME_FLAG_CATEGORIES | \ AS_APP_SUBSUME_FLAG_COMMENT | \ @@ -194,6 +197,7 @@ typedef enum { AS_APP_SUBSUME_FLAG_SCREENSHOTS | \ AS_APP_SUBSUME_FLAG_SUGGESTS | \ AS_APP_SUBSUME_FLAG_TRANSLATIONS | \ + AS_APP_SUBSUME_FLAG_SOURCE_KIND | \ AS_APP_SUBSUME_FLAG_URL) /* deprecated name */ @@ -207,8 +211,7 @@ typedef enum { AS_APP_SUBSUME_FLAG_METADATA | \ AS_APP_SUBSUME_FLAG_ORIGIN | \ AS_APP_SUBSUME_FLAG_PROJECT_LICENSE | \ - AS_APP_SUBSUME_FLAG_SOURCE_FILE | \ - AS_APP_SUBSUME_FLAG_SOURCE_KIND | \ + AS_APP_SUBSUME_FLAG_FORMATS | \ AS_APP_SUBSUME_FLAG_STATE | \ AS_APP_SUBSUME_FLAG_VETOS) @@ -460,9 +463,6 @@ typedef enum __attribute__((__packed__)) { AsApp *as_app_new (void); GQuark as_app_error_quark (void); -AsFormatKind as_app_guess_source_kind (const gchar *filename); -AsFormatKind as_app_source_kind_from_string (const gchar *source_kind); -const gchar *as_app_source_kind_to_string (AsFormatKind source_kind); const gchar *as_app_state_to_string (AsAppState state); const gchar *as_app_kind_to_string (AsAppKind kind); AsAppKind as_app_kind_from_string (const gchar *kind); @@ -473,7 +473,6 @@ const gchar *as_app_merge_kind_to_string (AsAppMergeKind merge_kind); /* getters */ AsAppKind as_app_get_kind (AsApp *app); -AsFormatKind as_app_get_source_kind (AsApp *app); AsAppScope as_app_get_scope (AsApp *app); AsAppMergeKind as_app_get_merge_kind (AsApp *app); AsAppState as_app_get_state (AsApp *app); @@ -520,7 +519,6 @@ const gchar *as_app_get_project_group (AsApp *app); const gchar *as_app_get_project_license (AsApp *app); const gchar *as_app_get_metadata_license (AsApp *app); const gchar *as_app_get_update_contact (AsApp *app); -const gchar *as_app_get_source_file (AsApp *app); const gchar *as_app_get_branch (AsApp *app); const gchar *as_app_get_name (AsApp *app, const gchar *locale); @@ -560,8 +558,6 @@ void as_app_set_id (AsApp *app, const gchar *id); void as_app_set_kind (AsApp *app, AsAppKind kind); -void as_app_set_source_kind (AsApp *app, - AsFormatKind source_kind); void as_app_set_scope (AsApp *app, AsAppScope scope); void as_app_set_merge_kind (AsApp *app, @@ -596,8 +592,6 @@ void as_app_set_developer_name (AsApp *app, void as_app_set_description (AsApp *app, const gchar *locale, const gchar *description); -void as_app_set_source_file (AsApp *app, - const gchar *source_file); void as_app_set_branch (AsApp *app, const gchar *branch); void as_app_set_priority (AsApp *app, @@ -716,6 +710,27 @@ G_DEPRECATED_FOR(as_app_get_kind); void as_app_set_id_kind (AsApp *app, AsIdKind id_kind) G_DEPRECATED_FOR(as_app_set_kind); + +void as_app_set_source_file (AsApp *app, + const gchar *source_file) +G_DEPRECATED_FOR(as_app_add_format); +const gchar *as_app_get_source_file (AsApp *app) +G_DEPRECATED_FOR(as_app_get_formats); + +AsFormatKind as_app_get_source_kind (AsApp *app) +G_DEPRECATED_FOR(as_format_get_kind); +void as_app_set_source_kind (AsApp *app, + AsFormatKind source_kind) +G_DEPRECATED_FOR(as_format_set_kind); + +AsFormatKind as_app_source_kind_from_string (const gchar *source_kind) +G_DEPRECATED_FOR(as_format_kind_from_string); +const gchar *as_app_source_kind_to_string (AsFormatKind source_kind) +G_DEPRECATED_FOR(as_format_kind_to_string); + +AsFormatKind as_app_guess_source_kind (const gchar *filename) +G_DEPRECATED_FOR(as_format_guess_kind); + G_GNUC_END_IGNORE_DEPRECATIONS G_END_DECLS diff --git a/libappstream-glib/as-self-test.c b/libappstream-glib/as-self-test.c index 9598e01..c684dca 100644 --- a/libappstream-glib/as-self-test.c +++ b/libappstream-glib/as-self-test.c @@ -1686,7 +1686,6 @@ as_test_app_func (void) g_assert_cmpstr (as_app_get_description (app, "pt_BR"), ==, "<p>O aplicativo Software.</p>"); g_assert_cmpstr (as_app_get_developer_name (app, NULL), ==, "GNOME Foundation"); g_assert_cmpstr (as_app_get_source_pkgname (app), ==, "gnome-software-src"); - g_assert_cmpint (as_app_get_source_kind (app), ==, AS_FORMAT_KIND_UNKNOWN); g_assert_cmpstr (as_app_get_project_group (app), ==, "GNOME"); g_assert_cmpstr (as_app_get_project_license (app), ==, "GPLv2+"); g_assert_cmpstr (as_app_get_branch (app), ==, "master"); @@ -2089,9 +2088,11 @@ static void as_test_store_local_appdata_func (void) { AsApp *app; + AsFormat *format; GError *error = NULL; gboolean ret; g_autofree gchar *filename = NULL; + g_autofree gchar *filename_full = NULL; g_autoptr(AsStore) store = NULL; /* this are the warnings expected */ @@ -2112,7 +2113,14 @@ as_test_store_local_appdata_func (void) app = as_store_get_app_by_id (store, "broken.desktop"); g_assert (app != NULL); g_assert_cmpstr (as_app_get_name (app, "C"), ==, "Broken"); - g_assert_cmpint (as_app_get_source_kind (app), ==, AS_FORMAT_KIND_APPDATA); + + /* check format */ + format = as_app_get_format_by_kind (app, AS_FORMAT_KIND_APPDATA); + g_assert (format != NULL); + filename_full = g_build_filename (filename, + "usr/share/appdata/broken.appdata.xml", + NULL); + g_assert_cmpstr (as_format_get_filename (format), ==, filename_full); } static void @@ -2153,6 +2161,14 @@ as_test_store_validate_func (void) } static void +_as_app_add_format_kind (AsApp *app, AsFormatKind kind) +{ + AsFormat *format = as_format_new (); + as_format_set_kind (format, kind); + as_app_add_format (app, format); +} + +static void as_test_app_validate_style_func (void) { AsProblem *problem; @@ -2165,7 +2181,7 @@ as_test_app_validate_style_func (void) as_app_add_url (app, AS_URL_KIND_UNKNOWN, "dave.com"); as_app_set_id (app, "dave.exe"); as_app_set_kind (app, AS_APP_KIND_DESKTOP); - as_app_set_source_kind (app, AS_FORMAT_KIND_APPDATA); + _as_app_add_format_kind (app, AS_FORMAT_KIND_APPDATA); as_app_set_metadata_license (app, "BSD"); as_app_set_project_license (app, "GPL-2.0+"); as_app_set_name (app, "C", "Test app name that is very log indeed."); @@ -2209,6 +2225,7 @@ as_test_app_validate_style_func (void) static void as_test_app_parse_file_desktop_func (void) { + AsFormat *format; AsIcon *ic; GError *error = NULL; gboolean ret; @@ -2234,13 +2251,18 @@ as_test_app_parse_file_desktop_func (void) "Badanie i porównywanie zainstalowanych profilów kolorów"); g_assert_cmpint (as_app_get_vetos(app)->len, ==, 1); g_assert_cmpstr (as_app_get_project_group (app), ==, NULL); - g_assert_cmpstr (as_app_get_source_file (app), ==, filename); g_assert_cmpint (as_app_get_categories(app)->len, ==, 1); g_assert_cmpint (as_app_get_keywords(app, NULL)->len, ==, 2); g_assert_cmpint (as_app_get_keywords(app, "pl")->len, ==, 1); g_assert (as_app_has_category (app, "System")); g_assert (!as_app_has_category (app, "NotGoingToExist")); + /* check format */ + g_assert_cmpint (as_app_get_formats(app)->len, ==, 1); + format = as_app_get_format_by_kind (app, AS_FORMAT_KIND_DESKTOP); + g_assert (format != NULL); + g_assert_cmpstr (as_format_get_filename (format), ==, filename); + /* check icons */ g_assert_cmpint (as_app_get_icons(app)->len, ==, 1); ic = as_app_get_icon_default (app); @@ -3013,6 +3035,7 @@ static void as_test_store_auto_reload_file_func (void) { AsApp *app; + AsFormat *format; AsRelease *rel; gboolean ret; guint cnt = 0; @@ -3057,7 +3080,11 @@ as_test_store_auto_reload_file_func (void) g_assert (app != NULL); rel = as_app_get_release_default (app); g_assert_cmpstr (as_release_get_version (rel), ==, "0.1.2"); - g_assert_cmpstr (as_app_get_source_file (app), ==, "/tmp/foo.xml"); + + /* check format */ + format = as_app_get_format_by_kind (app, AS_FORMAT_KIND_APPSTREAM); + g_assert (format != NULL); + g_assert_cmpstr (as_format_get_filename (format), ==, "/tmp/foo.xml"); /* change the file, and ensure we get the callback */ g_debug ("changing file"); @@ -3156,12 +3183,14 @@ as_test_store_wildcard_func (void) as_app_set_id (app1, "gimp.desktop"); as_app_set_origin (app1, "fedora"); as_app_add_pkgname (app1, "polari"); + _as_app_add_format_kind (app1, AS_FORMAT_KIND_DESKTOP); as_store_add_app (store, app1); /* package from updates */ as_app_set_id (app2, "gimp.desktop"); as_app_set_origin (app2, "updates"); as_app_add_pkgname (app2, "polari"); + _as_app_add_format_kind (app2, AS_FORMAT_KIND_DESKTOP); as_store_add_app (store, app2); /* check negative match */ @@ -3178,6 +3207,7 @@ static void as_test_store_flatpak_func (void) { AsApp *app; + AsFormat *format; GError *error = NULL; GPtrArray *apps; gboolean ret; @@ -3212,7 +3242,11 @@ as_test_store_flatpak_func (void) g_assert_cmpstr (as_app_get_unique_id (app), ==, "system/flatpak/remote-name/desktop/test.desktop/master"); g_assert_cmpstr (as_app_get_id_filename (app), ==, "test"); g_assert_cmpstr (as_app_get_origin (app), ==, "remote-name"); - g_assert_cmpstr (as_app_get_source_file (app), ==, filename); + + /* check format */ + format = as_app_get_format_by_kind (app, AS_FORMAT_KIND_APPSTREAM); + g_assert (format != NULL); + g_assert_cmpstr (as_format_get_filename (format), ==, filename); /* back to normality */ g_unsetenv ("AS_SELF_TEST_PREFIX_DELIM"); @@ -3285,7 +3319,7 @@ as_test_store_merges_func (void) app_desktop = as_app_new (); as_app_set_id (app_desktop, "gimp.desktop"); - as_app_set_source_kind (app_desktop, AS_FORMAT_KIND_DESKTOP); + _as_app_add_format_kind (app_desktop, AS_FORMAT_KIND_DESKTOP); as_app_set_name (app_desktop, NULL, "GIMP"); as_app_set_comment (app_desktop, NULL, "GNU Bla Bla"); as_app_set_priority (app_desktop, -1); @@ -3294,7 +3328,7 @@ as_test_store_merges_func (void) app_appdata = as_app_new (); as_app_set_id (app_appdata, "gimp.desktop"); - as_app_set_source_kind (app_appdata, AS_FORMAT_KIND_APPDATA); + _as_app_add_format_kind (app_appdata, AS_FORMAT_KIND_APPDATA); as_app_set_description (app_appdata, NULL, "<p>Gimp is awesome</p>"); as_app_add_pkgname (app_appdata, "gimp"); as_app_set_priority (app_appdata, -1); @@ -3310,7 +3344,8 @@ as_test_store_merges_func (void) g_assert_cmpstr (as_app_get_comment (app_tmp, NULL), ==, "GNU Bla Bla"); g_assert_cmpstr (as_app_get_description (app_tmp, NULL), ==, "<p>Gimp is awesome</p>"); g_assert_cmpstr (as_app_get_pkgname_default (app_tmp), ==, "gimp"); - g_assert_cmpint (as_app_get_source_kind (app_tmp), ==, AS_FORMAT_KIND_APPDATA); + g_assert (as_app_get_format_by_kind (app_tmp, AS_FORMAT_KIND_DESKTOP) != NULL); + g_assert (as_app_get_format_by_kind (app_tmp, AS_FORMAT_KIND_APPDATA) != NULL); g_assert_cmpint (as_app_get_state (app_tmp), ==, AS_APP_STATE_INSTALLED); /* test desktop + appdata + appstream */ @@ -3318,7 +3353,7 @@ as_test_store_merges_func (void) app_appinfo = as_app_new (); as_app_set_id (app_appinfo, "gimp.desktop"); - as_app_set_source_kind (app_appinfo, AS_FORMAT_KIND_APPSTREAM); + _as_app_add_format_kind (app_appinfo, AS_FORMAT_KIND_APPSTREAM); as_app_set_name (app_appinfo, NULL, "GIMP"); as_app_set_comment (app_appinfo, NULL, "GNU Bla Bla"); as_app_set_description (app_appinfo, NULL, "<p>Gimp is Distro</p>"); @@ -3336,7 +3371,10 @@ as_test_store_merges_func (void) g_assert_cmpstr (as_app_get_comment (app_tmp, NULL), ==, "GNU Bla Bla"); g_assert_cmpstr (as_app_get_description (app_tmp, NULL), ==, "<p>Gimp is Distro</p>"); g_assert_cmpstr (as_app_get_pkgname_default (app_tmp), ==, "gimp"); - g_assert_cmpint (as_app_get_source_kind (app_tmp), ==, AS_FORMAT_KIND_APPSTREAM); + g_assert (as_app_get_format_by_kind (app_tmp, AS_FORMAT_KIND_DESKTOP) != NULL); + g_assert (as_app_get_format_by_kind (app_tmp, AS_FORMAT_KIND_APPDATA) != NULL); + g_assert (as_app_get_format_by_kind (app_tmp, AS_FORMAT_KIND_APPSTREAM) != NULL); + g_assert_cmpint (as_app_get_formats(app_tmp)->len, ==, 3); g_assert_cmpint (as_app_get_state (app_tmp), ==, AS_APP_STATE_INSTALLED); } @@ -3355,7 +3393,7 @@ as_test_store_merges_local_func (void) app_desktop = as_app_new (); as_app_set_id (app_desktop, "gimp.desktop"); - as_app_set_source_kind (app_desktop, AS_FORMAT_KIND_DESKTOP); + _as_app_add_format_kind (app_desktop, AS_FORMAT_KIND_DESKTOP); as_app_set_name (app_desktop, NULL, "GIMP"); as_app_set_comment (app_desktop, NULL, "GNU Bla Bla"); as_app_set_priority (app_desktop, -1); @@ -3363,7 +3401,7 @@ as_test_store_merges_local_func (void) app_appdata = as_app_new (); as_app_set_id (app_appdata, "gimp.desktop"); - as_app_set_source_kind (app_appdata, AS_FORMAT_KIND_APPDATA); + _as_app_add_format_kind (app_appdata, AS_FORMAT_KIND_APPDATA); as_app_set_description (app_appdata, NULL, "<p>Gimp is awesome</p>"); as_app_add_pkgname (app_appdata, "gimp"); as_app_set_priority (app_appdata, -1); @@ -3371,7 +3409,7 @@ as_test_store_merges_local_func (void) app_appinfo = as_app_new (); as_app_set_id (app_appinfo, "gimp.desktop"); - as_app_set_source_kind (app_appinfo, AS_FORMAT_KIND_APPSTREAM); + _as_app_add_format_kind (app_appinfo, AS_FORMAT_KIND_APPSTREAM); as_app_set_name (app_appinfo, NULL, "GIMP"); as_app_set_comment (app_appinfo, NULL, "Fedora GNU Bla Bla"); as_app_set_description (app_appinfo, NULL, "<p>Gimp is Distro</p>"); @@ -3390,7 +3428,10 @@ as_test_store_merges_local_func (void) g_assert_cmpstr (as_app_get_comment (app_tmp, NULL), ==, "GNU Bla Bla"); g_assert_cmpstr (as_app_get_description (app_tmp, NULL), ==, "<p>Gimp is awesome</p>"); g_assert_cmpstr (as_app_get_pkgname_default (app_tmp), ==, "gimp"); - g_assert_cmpint (as_app_get_source_kind (app_tmp), ==, AS_FORMAT_KIND_APPDATA); + g_assert (as_app_get_format_by_kind (app_tmp, AS_FORMAT_KIND_DESKTOP) != NULL); + g_assert (as_app_get_format_by_kind (app_tmp, AS_FORMAT_KIND_APPDATA) != NULL); + g_assert (as_app_get_format_by_kind (app_tmp, AS_FORMAT_KIND_APPSTREAM) != NULL); + g_assert_cmpint (as_app_get_formats(app_tmp)->len, ==, 3); g_assert_cmpint (as_app_get_state (app_tmp), ==, AS_APP_STATE_INSTALLED); } @@ -3679,7 +3720,7 @@ as_test_store_versions_func (void) /* verify source kind */ app = as_store_get_app_by_id (store, "test.desktop"); - g_assert_cmpint (as_app_get_source_kind (app), ==, AS_FORMAT_KIND_APPSTREAM); + g_assert (as_app_get_format_by_kind (app, AS_FORMAT_KIND_APPSTREAM) != NULL); /* test with latest features */ as_store_set_api_version (store, 0.6); @@ -3858,6 +3899,7 @@ static void as_test_store_origin_func (void) { AsApp *app; + AsFormat *format; GError *error = NULL; gboolean ret; g_autofree gchar *filename = NULL; @@ -3880,7 +3922,11 @@ as_test_store_origin_func (void) g_assert_cmpstr (as_app_get_icon_path (app), !=, NULL); g_assert (g_str_has_suffix (as_app_get_icon_path (app), "icons")); g_assert_cmpstr (as_app_get_origin (app), ==, "fedora-21"); - g_assert_cmpstr (as_app_get_source_file (app), ==, filename); + + /* check format */ + format = as_app_get_format_by_kind (app, AS_FORMAT_KIND_APPSTREAM); + g_assert (format != NULL); + g_assert_cmpstr (as_format_get_filename (format), ==, filename); } static void @@ -4974,6 +5020,7 @@ as_test_store_merge_func (void) g_autoptr (AsApp) app2 = NULL; g_autoptr (AsApp) app_merge = NULL; g_autoptr (AsStore) store = NULL; + g_autoptr (AsFormat) format = NULL; store = as_store_new (); as_store_set_add_flags (store, @@ -4984,7 +5031,7 @@ as_test_store_merge_func (void) app1 = as_app_new (); as_app_set_id (app1, "org.gnome.Software.desktop"); as_app_set_branch (app1, "master"); - as_app_set_source_kind (app1, AS_FORMAT_KIND_APPDATA); + _as_app_add_format_kind (app1, AS_FORMAT_KIND_APPDATA); as_app_add_pkgname (app1, "gnome-software"); g_assert_cmpstr (as_app_get_unique_id (app1), ==, "*/package/*/*/org.gnome.Software.desktop/master"); @@ -4994,11 +5041,13 @@ as_test_store_merge_func (void) app_merge = as_app_new (); as_app_set_kind (app_merge, AS_APP_KIND_DESKTOP); as_app_set_id (app_merge, "org.gnome.Software.desktop"); - as_app_set_source_kind (app_merge, AS_FORMAT_KIND_APPSTREAM); + _as_app_add_format_kind (app_merge, AS_FORMAT_KIND_APPSTREAM); as_app_set_origin (app_merge, "utopia"); as_app_set_scope (app_merge, AS_APP_SCOPE_USER); as_app_add_category (app_merge, "special"); - as_app_set_source_file (app_merge, "DO-NOT-SUBSUME.xml"); + format = as_format_new (); + as_format_set_filename (format, "DO-NOT-SUBSUME.xml"); + as_app_add_format (app_merge, format); as_store_add_app (store, app_merge); g_assert_cmpstr (as_app_get_unique_id (app_merge), ==, "*/*/*/desktop/org.gnome.Software.desktop/*"); @@ -5007,7 +5056,7 @@ as_test_store_merge_func (void) app2 = as_app_new (); as_app_set_id (app2, "org.gnome.Software.desktop"); as_app_set_branch (app2, "stable"); - as_app_set_source_kind (app2, AS_FORMAT_KIND_APPSTREAM); + _as_app_add_format_kind (app2, AS_FORMAT_KIND_APPSTREAM); as_app_add_pkgname (app2, "gnome-software"); g_assert_cmpstr (as_app_get_unique_id (app2), ==, "*/package/*/*/org.gnome.Software.desktop/stable"); @@ -5018,8 +5067,8 @@ as_test_store_merge_func (void) g_assert (as_app_has_category (app2, "special")); /* verify we didn't inherit the private bits */ - g_assert_cmpstr (as_app_get_source_file (app1), ==, NULL); - g_assert_cmpstr (as_app_get_source_file (app2), ==, NULL); + g_assert (as_app_get_format_by_kind (app1, AS_FORMAT_KIND_UNKNOWN) == NULL); + g_assert (as_app_get_format_by_kind (app2, AS_FORMAT_KIND_UNKNOWN) == NULL); } static void @@ -5037,7 +5086,7 @@ as_test_store_merge_replace_func (void) app1 = as_app_new (); as_app_set_id (app1, "org.gnome.Software.desktop"); as_app_set_branch (app1, "master"); - as_app_set_source_kind (app1, AS_FORMAT_KIND_APPDATA); + _as_app_add_format_kind (app1, AS_FORMAT_KIND_APPDATA); as_app_add_pkgname (app1, "gnome-software"); as_app_add_category (app1, "Family"); as_store_add_app (store, app1); @@ -5046,7 +5095,7 @@ as_test_store_merge_replace_func (void) app_merge = as_app_new (); as_app_set_kind (app_merge, AS_APP_KIND_DESKTOP); as_app_set_id (app_merge, "org.gnome.Software.desktop"); - as_app_set_source_kind (app_merge, AS_FORMAT_KIND_APPSTREAM); + _as_app_add_format_kind (app_merge, AS_FORMAT_KIND_APPSTREAM); as_app_set_origin (app_merge, "utopia"); as_app_set_scope (app_merge, AS_APP_SCOPE_USER); as_app_set_merge_kind (app_merge, AS_APP_MERGE_KIND_REPLACE); @@ -5059,7 +5108,7 @@ as_test_store_merge_replace_func (void) app2 = as_app_new (); as_app_set_id (app2, "org.gnome.Software.desktop"); as_app_set_branch (app2, "stable"); - as_app_set_source_kind (app2, AS_FORMAT_KIND_APPSTREAM); + _as_app_add_format_kind (app2, AS_FORMAT_KIND_APPSTREAM); as_app_add_pkgname (app2, "gnome-software"); as_app_add_category (app2, "Family"); as_store_add_app (store, app2); diff --git a/libappstream-glib/as-store.c b/libappstream-glib/as-store.c index f2bb795..555b40e 100644 --- a/libappstream-glib/as-store.c +++ b/libappstream-glib/as-store.c @@ -984,7 +984,7 @@ _as_app_is_perhaps_merge_component (AsApp *app) { if (as_app_get_kind (app) != AS_APP_KIND_DESKTOP) return FALSE; - if (as_app_get_source_kind (app) != AS_FORMAT_KIND_APPSTREAM) + if (as_app_get_format_by_kind (app, AS_FORMAT_KIND_APPSTREAM) == NULL) return FALSE; if (as_app_get_bundle_kind (app) != AS_BUNDLE_KIND_UNKNOWN) return FALSE; @@ -1129,38 +1129,51 @@ as_store_add_app (AsStore *store, AsApp *app) item = g_ptr_array_index (apps, 0); } if (item != NULL) { + AsFormat *app_format = as_app_get_format_default (app); + AsFormat *item_format = as_app_get_format_default (item); + + /* sanity check */ + if (app_format == NULL) { + g_warning ("no format specified in %s", + as_app_get_unique_id (app)); + } + if (item_format == NULL) { + g_warning ("no format specified in %s", + as_app_get_unique_id (item)); + } /* the previously stored app is what we actually want */ if ((priv->add_flags & AS_STORE_ADD_FLAG_PREFER_LOCAL) > 0) { - if (as_app_get_source_kind (app) == AS_FORMAT_KIND_APPSTREAM && - as_app_get_source_kind (item) == AS_FORMAT_KIND_APPDATA) { + if (as_format_get_kind (app_format) == AS_FORMAT_KIND_APPSTREAM && + as_format_get_kind (item_format) == AS_FORMAT_KIND_APPDATA) { g_debug ("ignoring AppStream entry as AppData exists: %s:%s", as_app_get_unique_id (app), as_app_get_unique_id (item)); + as_app_subsume_full (app, item, + AS_APP_SUBSUME_FLAG_FORMATS | + AS_APP_SUBSUME_FLAG_RELEASES); return; } - if (as_app_get_source_kind (app) == AS_FORMAT_KIND_APPSTREAM && - as_app_get_source_kind (item) == AS_FORMAT_KIND_DESKTOP) { + if (as_format_get_kind (app_format) == AS_FORMAT_KIND_APPSTREAM && + as_format_get_kind (item_format) == AS_FORMAT_KIND_DESKTOP) { g_debug ("ignoring AppStream entry as desktop exists: %s:%s", as_app_get_unique_id (app), as_app_get_unique_id (item)); return; } - if (as_app_get_source_kind (app) == AS_FORMAT_KIND_APPDATA && - as_app_get_source_kind (item) == AS_FORMAT_KIND_DESKTOP) { + if (as_format_get_kind (app_format) == AS_FORMAT_KIND_APPDATA && + as_format_get_kind (item_format) == AS_FORMAT_KIND_DESKTOP) { g_debug ("merging duplicate AppData:desktop entries: %s:%s", as_app_get_unique_id (app), as_app_get_unique_id (item)); as_app_subsume_full (app, item, AS_APP_SUBSUME_FLAG_BOTH_WAYS | AS_APP_SUBSUME_FLAG_DEDUPE); - /* promote the desktop source to AppData */ - as_app_set_source_kind (item, AS_FORMAT_KIND_APPDATA); return; } - if (as_app_get_source_kind (app) == AS_FORMAT_KIND_DESKTOP && - as_app_get_source_kind (item) == AS_FORMAT_KIND_APPDATA) { + if (as_format_get_kind (app_format) == AS_FORMAT_KIND_DESKTOP && + as_format_get_kind (item_format) == AS_FORMAT_KIND_APPDATA) { g_debug ("merging duplicate desktop:AppData entries: %s:%s", as_app_get_unique_id (app), as_app_get_unique_id (item)); @@ -1170,25 +1183,31 @@ as_store_add_app (AsStore *store, AsApp *app) return; } + /* xxx */ + as_app_subsume_full (app, item, + AS_APP_SUBSUME_FLAG_FORMATS | + AS_APP_SUBSUME_FLAG_RELEASES); + } else { - if (as_app_get_source_kind (app) == AS_FORMAT_KIND_APPDATA && - as_app_get_source_kind (item) == AS_FORMAT_KIND_APPSTREAM && + if (as_format_get_kind (app_format) == AS_FORMAT_KIND_APPDATA && + as_format_get_kind (item_format) == AS_FORMAT_KIND_APPSTREAM && as_app_get_scope (app) == AS_APP_SCOPE_SYSTEM) { - as_app_set_state (item, AS_APP_STATE_INSTALLED); g_debug ("ignoring AppData entry as AppStream exists: %s:%s", as_app_get_unique_id (app), as_app_get_unique_id (item)); as_app_subsume_full (item, app, + AS_APP_SUBSUME_FLAG_FORMATS | AS_APP_SUBSUME_FLAG_RELEASES); return; } - if (as_app_get_source_kind (app) == AS_FORMAT_KIND_DESKTOP && - as_app_get_source_kind (item) == AS_FORMAT_KIND_APPSTREAM && + if (as_format_get_kind (app_format) == AS_FORMAT_KIND_DESKTOP && + as_format_get_kind (item_format) == AS_FORMAT_KIND_APPSTREAM && as_app_get_scope (app) == AS_APP_SCOPE_SYSTEM) { - as_app_set_state (item, AS_APP_STATE_INSTALLED); g_debug ("ignoring desktop entry as AppStream exists: %s:%s", as_app_get_unique_id (app), as_app_get_unique_id (item)); + as_app_subsume_full (item, app, + AS_APP_SUBSUME_FLAG_FORMATS); return; } @@ -1196,10 +1215,13 @@ as_store_add_app (AsStore *store, AsApp *app) if (as_app_get_priority (item) > as_app_get_priority (app)) { g_debug ("ignoring duplicate %s:%s entry: %s:%s", - as_format_kind_to_string (as_app_get_source_kind (app)), - as_format_kind_to_string (as_app_get_source_kind (item)), + as_format_kind_to_string (as_format_get_kind (app_format)), + as_format_kind_to_string (as_format_get_kind (item_format)), as_app_get_unique_id (app), as_app_get_unique_id (item)); + as_app_subsume_full (item, app, + AS_APP_SUBSUME_FLAG_FORMATS | + AS_APP_SUBSUME_FLAG_RELEASES); return; } @@ -1207,18 +1229,13 @@ as_store_add_app (AsStore *store, AsApp *app) if (as_app_get_priority (item) == as_app_get_priority (app)) { g_debug ("merging duplicate %s:%s entries: %s:%s", - as_format_kind_to_string (as_app_get_source_kind (app)), - as_format_kind_to_string (as_app_get_source_kind (item)), + as_format_kind_to_string (as_format_get_kind (app_format)), + as_format_kind_to_string (as_format_get_kind (item_format)), as_app_get_unique_id (app), as_app_get_unique_id (item)); as_app_subsume_full (app, item, AS_APP_SUBSUME_FLAG_BOTH_WAYS | AS_APP_SUBSUME_FLAG_DEDUPE); - - /* promote the desktop source to AppData */ - if (as_app_get_source_kind (item) == AS_FORMAT_KIND_DESKTOP && - as_app_get_source_kind (app) == AS_FORMAT_KIND_APPDATA) - as_app_set_source_kind (item, AS_FORMAT_KIND_APPDATA); return; } } @@ -1226,10 +1243,11 @@ as_store_add_app (AsStore *store, AsApp *app) /* this new item has a higher priority than the one we've * previously stored */ g_debug ("removing %s entry: %s", - as_format_kind_to_string (as_app_get_source_kind (item)), + as_format_kind_to_string (as_format_get_kind (item_format)), as_app_get_unique_id (item)); - if (as_app_get_state (item) == AS_APP_STATE_INSTALLED) - as_app_set_state (app, AS_APP_STATE_INSTALLED); + as_app_subsume_full (app, item, + AS_APP_SUBSUME_FLAG_FORMATS | + AS_APP_SUBSUME_FLAG_RELEASES); as_store_remove_app (store, item); } @@ -1362,10 +1380,10 @@ as_store_from_root (AsStore *store, g_autofree gchar *origin_app = NULL; g_autofree gchar *origin_app_icons = NULL; _cleanup_uninhibit_ guint32 *tok = NULL; + g_autoptr(AsFormat) format = NULL; g_autoptr(AsProfileTask) ptask = NULL; g_autoptr(AsRefString) icon_path_str = NULL; g_autoptr(AsRefString) origin_str = NULL; - g_autoptr(AsRefString) source_filename_str = NULL; g_return_val_if_fail (AS_IS_STORE (store), FALSE); @@ -1485,13 +1503,17 @@ as_store_from_root (AsStore *store, as_store_set_builder_id (store, tmp); /* create refcounted versions */ - if (source_filename != NULL) - source_filename_str = as_ref_string_new (source_filename); if (origin_app != NULL) origin_str = as_ref_string_new (origin_app); if (icon_path != NULL) icon_path_str = as_ref_string_new (icon_path); + /* create format for all added apps */ + format = as_format_new (); + as_format_set_kind (format, AS_FORMAT_KIND_APPSTREAM); + if (source_filename != NULL) + as_format_set_filename (format, source_filename); + ctx = as_node_context_new (); for (n = apps->children; n != NULL; n = n->next) { g_autoptr(GError) error_local = NULL; @@ -1515,8 +1537,8 @@ as_store_from_root (AsStore *store, as_app_set_icon_path (app, icon_path_str); if (arch != NULL) as_app_add_arch (app, arch); + as_app_add_format (app, format); as_app_set_scope (app, scope); - as_app_set_source_kind (app, AS_FORMAT_KIND_APPSTREAM); if (!as_app_node_parse (app, n, ctx, &error_local)) { g_set_error (error, AS_STORE_ERROR, @@ -1540,8 +1562,6 @@ as_store_from_root (AsStore *store, if (origin_str != NULL) as_app_set_origin (app, origin_str); - if (source_filename_str != NULL) - as_app_set_source_file (app, source_filename_str); as_store_add_app (store, app); } @@ -1569,7 +1589,9 @@ as_store_load_yaml_file (AsStore *store, const gchar *tmp; g_autoptr(AsNodeContext) ctx = NULL; g_autofree gchar *icon_path = NULL; + g_autofree gchar *source_filename = NULL; g_autoptr(AsYaml) root = NULL; + g_autoptr(AsFormat) format = NULL; _cleanup_uninhibit_ guint32 *tok = NULL; /* load file */ @@ -1615,6 +1637,14 @@ as_store_load_yaml_file (AsStore *store, /* emit once when finished */ tok = as_store_changed_inhibit (store); + /* add format to each app */ + source_filename = g_file_get_path (file); + if (source_filename != NULL) { + format = as_format_new (); + as_format_set_kind (format, AS_FORMAT_KIND_APPSTREAM); + as_format_set_filename (format, source_filename); + } + /* parse applications */ for (app_n = root->children->next; app_n != NULL; app_n = app_n->next) { g_autoptr(AsApp) app = NULL; @@ -1631,7 +1661,7 @@ as_store_load_yaml_file (AsStore *store, if (icon_path != NULL) as_app_set_icon_path (app, icon_path); as_app_set_scope (app, scope); - as_app_set_source_kind (app, AS_FORMAT_KIND_APPSTREAM); + as_app_add_format (app, format); if (!as_app_node_parse_dep11 (app, app_n, ctx, error)) return FALSE; as_app_set_origin (app, priv->origin); @@ -1660,10 +1690,19 @@ as_store_remove_by_source_file (AsStore *store, const gchar *filename) ids = g_ptr_array_new_with_free_func (g_free); apps = as_store_get_apps (store); for (i = 0; i < apps->len; i++) { + AsFormat *format; app = g_ptr_array_index (apps, i); - if (g_strcmp0 (as_app_get_source_file (app), filename) != 0) + format = as_app_get_format_by_filename (app, filename); + if (format == NULL) continue; - g_ptr_array_add (ids, g_strdup (as_app_get_id (app))); + as_app_remove_format (app, format); + + /* remove the app when all the formats have gone */ + if (as_app_get_formats(app)->len == 0) { + g_debug ("no more formats for %s, deleting from store", + as_app_get_unique_id (app)); + g_ptr_array_add (ids, g_strdup (as_app_get_id (app))); + } } /* remove these from the store */ @@ -2731,7 +2770,7 @@ as_store_load_installed (AsStore *store, if ((priv->add_flags & AS_STORE_ADD_FLAG_PREFER_LOCAL) == 0) { app_tmp = as_store_get_app_by_id (store, tmp); if (app_tmp != NULL && - as_app_get_source_kind (app_tmp) == AS_FORMAT_KIND_DESKTOP) { + as_app_get_format_by_kind (app_tmp, AS_FORMAT_KIND_DESKTOP) != NULL) { as_app_set_state (app_tmp, AS_APP_STATE_INSTALLED); g_debug ("not parsing %s as %s already exists", filename, tmp); |