summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Hughes <richard@hughsie.com>2017-02-27 10:30:45 +0000
committerRichard Hughes <richard@hughsie.com>2017-02-27 11:36:28 +0000
commitf764ee1fbe80bee4dffa6924744173d457957290 (patch)
tree8ccf44418ede09997287317d983c3025f0076482
parentcbf6498b64a62ef7a7d1c1472f312630ad93d4d3 (diff)
downloadappstream-glib-f764ee1fbe80bee4dffa6924744173d457957290.tar.gz
Deprecate app_set_source_file() and app_set_source_kind()
Implement these in terms of AsFormat objects to maintain API compatibility. This allows us to have multiple 'formats' that make up an AsApp, for instance, an application might be referenced in: * The .desktop file (for the icon) * The AppData file (for the installed long description) * The AppStream XML file (for the origin information) Doing this allows us to keep track of all formats that make up an AsApp, and this allows us to update the state as each type is removed and added. This allows us to remove the need to "promote" apps to different types, which was unreliable and was the source of several bugs where the AsApp was removed from the AsStore before all the sources had been removed. With this commit, GNOME Software again works reliably.
-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);