summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--client/as-util.c10
-rw-r--r--libappstream-glib/as-app-validate.c47
-rw-r--r--libappstream-glib/as-app.c93
-rw-r--r--libappstream-glib/as-app.h41
-rw-r--r--libappstream-glib/as-self-test.c101
-rw-r--r--libappstream-glib/as-store.c117
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);