diff --git a/_service b/_service
new file mode 100644
index 0000000..4594d71
--- /dev/null
+++ b/_service
@@ -0,0 +1,19 @@
+
+
+
+ git
+ https://gitlab.gnome.org/GNOME/gnome-software.git
+ 46.0
+ @PARENT_TAG@+@TAG_OFFSET@
+ (.*)\+0
+ \1
+
+
+
+
+ *.tar
+ zst
+
+
+
+
diff --git a/gnome-software-45.2.tar.xz b/gnome-software-45.2.tar.xz
deleted file mode 100644
index de4e263..0000000
--- a/gnome-software-45.2.tar.xz
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:0bdd8fc0caecd6eb013c6010dbca93077397118a6ef5eaf264e2a820a292f5b7
-size 2475796
diff --git a/gnome-software-46.0.obscpio b/gnome-software-46.0.obscpio
new file mode 100644
index 0000000..411f874
--- /dev/null
+++ b/gnome-software-46.0.obscpio
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:92117bf4ebd23b8bc215644d061ebf48b36d22128e223442263fedc4458210e4
+size 19801613
diff --git a/gnome-software-plugin-opensuse-distro-upgrade.patch b/gnome-software-plugin-opensuse-distro-upgrade.patch
deleted file mode 100644
index 7404fa8..0000000
--- a/gnome-software-plugin-opensuse-distro-upgrade.patch
+++ /dev/null
@@ -1,697 +0,0 @@
-From 98ba5798c34db0f683312a5424489efa40fea426 Mon Sep 17 00:00:00 2001
-From: Jonathan Kang
-Date: Tue, 22 Nov 2022 09:21:19 +0800
-Subject: [PATCH] plugins: add opensuse-distro-upgrade plugin
-
----
- plugins/meson.build | 1 +
- .../gs-plugin-opensuse-distro-upgrade.c | 616 ++++++++++++++++++
- .../gs-plugin-opensuse-distro-upgrade.h | 19 +
- plugins/opensuse-distro-upgrade/meson.build | 14 +
- 4 files changed, 650 insertions(+)
- create mode 100644 plugins/opensuse-distro-upgrade/gs-plugin-opensuse-distro-upgrade.c
- create mode 100644 plugins/opensuse-distro-upgrade/gs-plugin-opensuse-distro-upgrade.h
- create mode 100644 plugins/opensuse-distro-upgrade/meson.build
-
-diff --git a/plugins/meson.build b/plugins/meson.build
-index 711b488e2..16c1eb753 100644
---- a/plugins/meson.build
-+++ b/plugins/meson.build
-@@ -12,6 +12,7 @@ subdir('dpkg')
- subdir('dummy')
- subdir('fedora-langpacks')
- subdir('fedora-pkgdb-collections')
-+subdir('opensuse-distro-upgrade')
-
- if get_option('eos_updater')
- subdir('eos-updater')
-diff --git a/plugins/opensuse-distro-upgrade/gs-plugin-opensuse-distro-upgrade.c b/plugins/opensuse-distro-upgrade/gs-plugin-opensuse-distro-upgrade.c
-new file mode 100644
-index 000000000..46de82d02
---- /dev/null
-+++ b/plugins/opensuse-distro-upgrade/gs-plugin-opensuse-distro-upgrade.c
-@@ -0,0 +1,616 @@
-+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
-+ *
-+ * Copyright (C) 2020 Jonathan Kang
-+ *
-+ * SPDX-License-Identifier: GPL-2.0+
-+ */
-+
-+#include
-+
-+#include
-+#include
-+#include
-+#include
-+
-+#include "gs-plugin-opensuse-distro-upgrade.h"
-+
-+#define OPENSUSE_DISTRO_UPGRADE_API_URI "https://get.opensuse.org/api/v0/distributions.json"
-+
-+struct _GsPluginOpensuseDistroUpgrade {
-+ GsPlugin Parent;
-+
-+ gchar *os_name;
-+ gchar *os_version;
-+ guint64 upgrade_weight;
-+
-+ gchar *cachefn;
-+ GFileMonitor *cachefn_monitor;
-+ GsApp *cached_origin;
-+ gboolean is_valid;
-+ GPtrArray *distros;
-+};
-+
-+typedef enum {
-+ DISTRO_UPGRADE_ITEM_STATE_ALPHA,
-+ DISTRO_UPGRADE_ITEM_STATE_BETA,
-+ DISTRO_UPGRADE_ITEM_STATE_STABLE,
-+ DISTRO_UPGRADE_ITEM_STATE_EOL,
-+ DISTRO_UPGRADE_ITEM_STATE_LAST,
-+} DistroUpgradeItemState;
-+
-+typedef struct {
-+ gchar *name;
-+ gchar *version;
-+ DistroUpgradeItemState state;
-+ guint upgrade_weight;
-+} DistroUpgradeItem;
-+
-+G_DEFINE_TYPE (GsPluginOpensuseDistroUpgrade, gs_plugin_opensuse_distro_upgrade, GS_TYPE_PLUGIN)
-+
-+static gboolean
-+_is_valid_upgrade (GsPluginOpensuseDistroUpgrade *self,
-+ DistroUpgradeItem *item)
-+{
-+ guint diff;
-+
-+ if (item->state != DISTRO_UPGRADE_ITEM_STATE_STABLE)
-+ return FALSE;
-+
-+ diff = item->upgrade_weight - self->upgrade_weight;
-+ if (diff == 1)
-+ return TRUE;
-+ else
-+ return FALSE;
-+}
-+
-+static GsApp *
-+_create_upgrade_app (GsPluginOpensuseDistroUpgrade *self,
-+ DistroUpgradeItem *item)
-+{
-+ GsApp *app;
-+ g_autofree gchar *app_id = NULL;
-+ g_autofree gchar *app_version = NULL;
-+ g_autofree gchar *background = NULL;
-+ g_autofree gchar *cache_key = NULL;
-+ g_autofree gchar *css = NULL;
-+ g_autofree gchar *url = NULL;
-+ g_autoptr(GFile) icon_file = NULL;
-+ g_autoptr(GIcon) ic = NULL;
-+
-+ cache_key = g_strdup_printf ("leap-%s", item->version);
-+ app = gs_plugin_cache_lookup (GS_PLUGIN (self), cache_key);
-+
-+ app_id = g_strdup_printf ("org.openSUSE.Leap-%s", item->version);
-+ app_version = g_strdup (item->version);
-+
-+ /* icon from disk */
-+ icon_file = g_file_new_for_path ("/usr/share/pixmaps/distribution-logos/square-symbolic.svg");
-+ ic = g_file_icon_new (icon_file);
-+
-+ app = gs_app_new (app_id);
-+ gs_app_set_state (app, GS_APP_STATE_AVAILABLE);
-+ gs_app_set_kind (app, AS_COMPONENT_KIND_OPERATING_SYSTEM);
-+ gs_app_set_bundle_kind (app, AS_BUNDLE_KIND_PACKAGE);
-+ gs_app_set_name (app, GS_APP_QUALITY_LOWEST, item->name);
-+ gs_app_set_summary (app, GS_APP_QUALITY_NORMAL,
-+ _("Upgrade for the latest features, performance and stability improvements."));
-+ gs_app_set_version (app, app_version);
-+ gs_app_set_size_installed (app, GS_SIZE_TYPE_UNKNOWABLE, 0);
-+ gs_app_set_size_download (app, GS_SIZE_TYPE_UNKNOWABLE, 0);
-+ gs_app_set_license (app, GS_APP_QUALITY_LOWEST, "LicenseRef-free");
-+ gs_app_add_quirk (app, GS_APP_QUIRK_NEEDS_REBOOT);
-+ gs_app_add_quirk (app, GS_APP_QUIRK_PROVENANCE);
-+ gs_app_add_quirk (app, GS_APP_QUIRK_NOT_REVIEWABLE);
-+ gs_app_add_icon (app, ic);
-+
-+ /* Save it in the cache. */
-+ gs_plugin_cache_add (GS_PLUGIN (self), cache_key, app);
-+
-+ return app;
-+}
-+
-+static void
-+_distro_upgrade_item_destroy (DistroUpgradeItem *item)
-+{
-+ g_free (item->name);
-+ g_free (item->version);
-+ g_slice_free (DistroUpgradeItem, item);
-+}
-+
-+static GPtrArray *
-+load_json (GsPluginOpensuseDistroUpgrade *self,
-+ GError **error)
-+{
-+ JsonArray *distros;
-+ JsonNode *root_node;
-+ JsonObject *root = NULL;
-+ g_autoptr(JsonParser) parser = NULL;
-+ g_autoptr(GPtrArray) new_distros = NULL;
-+
-+ new_distros = g_ptr_array_new_with_free_func ((GDestroyNotify) _distro_upgrade_item_destroy);
-+ parser = json_parser_new_immutable ();
-+
-+ if (!json_parser_load_from_mapped_file (parser, self->cachefn, error))
-+ return NULL;
-+
-+ root_node = json_parser_get_root (parser);
-+ if (root_node != NULL && JSON_NODE_HOLDS_OBJECT (root_node))
-+ root = json_node_get_object (root_node);
-+ if (root == NULL) {
-+ g_set_error (error,
-+ GS_PLUGIN_ERROR,
-+ GS_PLUGIN_ERROR_INVALID_FORMAT,
-+ "no root object");
-+ return NULL;
-+ }
-+
-+ distros = json_object_get_array_member (root, "Leap");
-+ if (distros == NULL) {
-+ g_set_error (error,
-+ GS_PLUGIN_ERROR,
-+ GS_PLUGIN_ERROR_INVALID_FORMAT,
-+ "No array member named \"Leap\".");
-+ return NULL;
-+ }
-+
-+ for (guint i = 0; i < json_array_get_length (distros); i++) {
-+ DistroUpgradeItem *item;
-+ DistroUpgradeItemState state;
-+ JsonObject *distro;
-+ const gchar *name;
-+ const gchar *version;
-+ const gchar *state_str;
-+ guint upgrade_weight;
-+
-+ distro = json_array_get_object_element (distros, i);
-+ if (distro == NULL)
-+ continue;
-+
-+ name = json_object_get_string_member (distro, "name");
-+ if (name == NULL)
-+ continue;
-+
-+ version = json_object_get_string_member (distro, "version");
-+ if (version == NULL)
-+ continue;
-+
-+ state_str = json_object_get_string_member (distro, "state");
-+ if (state_str == NULL)
-+ continue;
-+ if (g_strcmp0 (state_str, "Alpha") == 0)
-+ state = DISTRO_UPGRADE_ITEM_STATE_ALPHA;
-+ else if (g_strcmp0 (state_str, "Beta") == 0)
-+ state = DISTRO_UPGRADE_ITEM_STATE_BETA;
-+ else if (g_strcmp0 (state_str, "Stable") == 0)
-+ state = DISTRO_UPGRADE_ITEM_STATE_STABLE;
-+ else if (g_strcmp0 (state_str, "EOL") == 0)
-+ state = DISTRO_UPGRADE_ITEM_STATE_EOL;
-+ else
-+ continue;
-+
-+ upgrade_weight = json_object_get_int_member (distro, "upgrade-weight");
-+
-+ /* Set upgrade weight for current OS. */
-+ if (g_strcmp0 (self->os_version, version) == 0)
-+ self->upgrade_weight = upgrade_weight;
-+
-+ /* add item */
-+ item = g_slice_new0 (DistroUpgradeItem);
-+ item->name = g_strdup (name);
-+ item->version = g_strdup (version);
-+ item->state = state;
-+ item->upgrade_weight = upgrade_weight;
-+ g_ptr_array_add (self->distros, item);
-+ }
-+
-+ /* success */
-+ g_clear_pointer (&self->distros, g_ptr_array_unref);
-+ self->distros = g_ptr_array_ref (new_distros);
-+ self->is_valid = TRUE;
-+
-+ return g_steal_pointer (&new_distros);
-+}
-+
-+static void
-+download_cb (GObject *source_object,
-+ GAsyncResult *result,
-+ gpointer user_data)
-+{
-+ SoupSession *soup_session = SOUP_SESSION (source_object);
-+ g_autoptr(GTask) task = g_steal_pointer (&user_data);
-+ GsPluginOpensuseDistroUpgrade *self = g_task_get_source_object (task);
-+ g_autoptr(GError) local_error = NULL;
-+
-+ if (!gs_download_file_finish (soup_session, result, &local_error) &&
-+ !g_error_matches (local_error, GS_DOWNLOAD_ERROR, GS_DOWNLOAD_ERROR_NOT_MODIFIED)) {
-+ g_autoptr(GError) wrapped_error = NULL;
-+
-+ /* Wrap in a GsPluginError. */
-+ g_set_error_literal (&wrapped_error,
-+ GS_PLUGIN_ERROR,
-+ GS_PLUGIN_ERROR_DOWNLOAD_FAILED,
-+ local_error->message);
-+
-+ gs_utils_error_add_origin_id (&wrapped_error, self->cached_origin);
-+ g_task_return_error (task, g_steal_pointer (&wrapped_error));
-+ return;
-+ }
-+
-+ /* success */
-+ self->is_valid = FALSE;
-+
-+ g_task_return_boolean (task, TRUE);
-+}
-+
-+static void
-+_refresh_cache_async (GsPluginOpensuseDistroUpgrade *self,
-+ guint64 cache_age_secs,
-+ GCancellable *cancellable,
-+ GAsyncReadyCallback callback,
-+ gpointer user_data)
-+{
-+ GsPlugin *plugin = GS_PLUGIN (self);
-+ g_autoptr(GsApp) app_dl = gs_app_new (gs_plugin_get_name (plugin));
-+ g_autoptr(GTask) task = NULL;
-+ g_autoptr(GFile) output_file = g_file_new_for_path (self->cachefn);
-+ g_autoptr(SoupSession) soup_session = NULL;
-+
-+ task = g_task_new (self, cancellable, callback, user_data);
-+ g_task_set_source_tag (task, _refresh_cache_async);
-+
-+ /* check cache age */
-+ if (cache_age_secs > 0) {
-+ guint64 tmp = gs_utils_get_file_age (output_file);
-+ if (tmp < cache_age_secs) {
-+ g_debug ("%s is only %" G_GUINT64_FORMAT " seconds old",
-+ self->cachefn, tmp);
-+ g_task_return_boolean (task, TRUE);
-+ return;
-+ }
-+ }
-+
-+ /* download new file */
-+ gs_app_set_summary_missing (app_dl,
-+ /* TRANSLATORS: status text when downloading */
-+ _("Downloading upgrade information…"));
-+
-+ soup_session = gs_build_soup_session ();
-+
-+ gs_download_file_async (soup_session,
-+ OPENSUSE_DISTRO_UPGRADE_API_URI,
-+ output_file,
-+ G_PRIORITY_LOW,
-+ NULL, NULL, /* FIXME: progress reporting */
-+ cancellable,
-+ download_cb,
-+ g_steal_pointer (&task));
-+}
-+
-+static gboolean
-+_refresh_cache_finish (GsPluginOpensuseDistroUpgrade *self,
-+ GAsyncResult *result,
-+ GError **error)
-+{
-+ return g_task_propagate_boolean (G_TASK (result), error);
-+}
-+
-+static void
-+ensure_refresh_cb (GObject *source_object,
-+ GAsyncResult *result,
-+ gpointer user_data)
-+{
-+ GsPluginOpensuseDistroUpgrade *self = GS_PLUGIN_OPENSUSE_DISTRO_UPGRADE (source_object);
-+ g_autoptr(GTask) task = g_steal_pointer (&user_data);
-+ g_autoptr(GPtrArray) distros = NULL;
-+ g_autoptr(GError) local_error = NULL;
-+
-+ if (!_refresh_cache_finish (self, result, &local_error)) {
-+ g_task_return_error (task, g_steal_pointer (&local_error));
-+ return;
-+ }
-+
-+ distros = load_json (self, &local_error);
-+ if (distros == NULL) {
-+ g_autoptr(GFile) cache_file = g_file_new_for_path (self->cachefn);
-+
-+ g_debug ("Failed to load cache file ‘%s’, deleting it", self->cachefn);
-+ g_file_delete (cache_file, NULL, NULL);
-+
-+ g_task_return_error (task, g_steal_pointer (&local_error));
-+ return;
-+ }
-+
-+ g_task_return_pointer (task, g_steal_pointer (&distros), (GDestroyNotify) g_ptr_array_unref);
-+}
-+
-+/* This will return a strong reference to the latest distros
-+ * #GPtrArray. The caller should use this in their computation. */
-+static void
-+_ensure_cache_async (GsPluginOpensuseDistroUpgrade *self,
-+ GCancellable *cancellable,
-+ GAsyncReadyCallback callback,
-+ gpointer user_data)
-+{
-+ g_autoptr(GTask) task = NULL;
-+
-+ task = g_task_new (self, cancellable, callback, user_data);
-+ g_task_set_source_tag (task, _ensure_cache_async);
-+
-+ /* already done */
-+ if (self->is_valid) {
-+ g_task_return_pointer (task, g_ptr_array_ref (self->distros), (GDestroyNotify) g_ptr_array_unref);
-+ return;
-+ }
-+
-+ /* Ensure there is any data, no matter how old. This can download from
-+ * the network if needed. */
-+ _refresh_cache_async (self, G_MAXUINT, cancellable,
-+ ensure_refresh_cb, g_steal_pointer (&task));
-+}
-+
-+static GPtrArray *
-+_ensure_cache_finish (GsPluginOpensuseDistroUpgrade *self,
-+ GAsyncResult *result,
-+ GError **error)
-+{
-+ return g_task_propagate_pointer (G_TASK (result), error);
-+}
-+
-+static void
-+list_distro_upgrades_cb (GObject *source_object,
-+ GAsyncResult *result,
-+ gpointer user_data)
-+{
-+ GsPluginOpensuseDistroUpgrade *self = GS_PLUGIN_OPENSUSE_DISTRO_UPGRADE (source_object);
-+ g_autoptr(GTask) task = g_steal_pointer (&user_data);
-+ g_autoptr(GPtrArray) distros = NULL;
-+ g_autoptr(GsAppList) list = NULL;
-+ g_autoptr(GError) local_error = NULL;
-+
-+ distros = _ensure_cache_finish (self, result, &local_error);
-+ if (distros == NULL) {
-+ g_task_return_error (task, g_steal_pointer (&local_error));
-+ return;
-+ }
-+
-+ /* are any distros upgradable */
-+ list = gs_app_list_new ();
-+
-+ for (guint i = 0; i < distros->len; i++) {
-+ DistroUpgradeItem *item;
-+
-+ item = g_ptr_array_index (self->distros, i);
-+ if (_is_valid_upgrade (self, item)) {
-+ g_autoptr(GsApp) app = NULL;
-+
-+ app = _create_upgrade_app (self, item);
-+ gs_app_list_add (list, app);
-+
-+ break;
-+ }
-+ }
-+
-+ g_task_return_pointer (task, g_steal_pointer (&list), g_object_unref);
-+}
-+
-+static void
-+gs_plugin_opensuse_distro_upgrade_list_distro_upgrades_async (GsPlugin *plugin,
-+ GsPluginListDistroUpgradesFlags flags,
-+ GCancellable *cancellable,
-+ GAsyncReadyCallback callback,
-+ gpointer user_data)
-+{
-+ g_autoptr(GTask) task = NULL;
-+ g_autoptr(GsAppList) list = gs_app_list_new ();
-+ GsPluginOpensuseDistroUpgrade *self = GS_PLUGIN_OPENSUSE_DISTRO_UPGRADE (plugin);
-+
-+ task = g_task_new (plugin, cancellable, callback, user_data);
-+ g_task_set_source_tag (task, gs_plugin_opensuse_distro_upgrade_list_distro_upgrades_async);
-+
-+ /* Ensure valid data is loaded. */
-+ _ensure_cache_async (self, cancellable, list_distro_upgrades_cb, g_steal_pointer (&task));
-+
-+ g_task_return_pointer (task, g_steal_pointer (&list), g_object_unref);
-+}
-+
-+static GsAppList *
-+gs_plugin_opensuse_distro_upgrade_list_distro_upgrades_finish (GsPlugin *plugin,
-+ GAsyncResult *result,
-+ GError **error)
-+{
-+ return g_task_propagate_pointer (G_TASK (result), error);
-+}
-+
-+static void
-+gs_plugin_opensuse_distro_upgrade_dispose (GObject *object)
-+{
-+ GsPluginOpensuseDistroUpgrade *self = GS_PLUGIN_OPENSUSE_DISTRO_UPGRADE (object);
-+
-+ g_clear_object (&self->cachefn_monitor);
-+ g_clear_object (&self->cached_origin);
-+
-+ G_OBJECT_CLASS (gs_plugin_opensuse_distro_upgrade_parent_class)->dispose (object);
-+}
-+
-+static void
-+gs_plugin_opensuse_distro_upgrade_finalize (GObject *object)
-+{
-+ GsPluginOpensuseDistroUpgrade *self = GS_PLUGIN_OPENSUSE_DISTRO_UPGRADE (object);
-+
-+ g_clear_pointer (&self->distros, g_ptr_array_unref);
-+ g_clear_pointer (&self->os_name, g_free);
-+ g_clear_pointer (&self->os_version, g_free);
-+ g_clear_pointer (&self->cachefn, g_free);
-+
-+ G_OBJECT_CLASS (gs_plugin_opensuse_distro_upgrade_parent_class)->finalize (object);
-+}
-+
-+static void
-+_file_changed_cb (GFileMonitor *monitor,
-+ GFile *file,
-+ GFile *other_file,
-+ GFileMonitorEvent event_type,
-+ gpointer user_data)
-+{
-+ GsPluginOpensuseDistroUpgrade *self = GS_PLUGIN_OPENSUSE_DISTRO_UPGRADE (user_data);
-+
-+ g_debug ("cache file changed, so reloading upgrades list");
-+ gs_plugin_updates_changed (GS_PLUGIN (self));
-+
-+ self->is_valid = FALSE;
-+}
-+
-+static void
-+gs_plugin_opensuse_distro_upgrade_setup_async (GsPlugin *plugin,
-+ GCancellable *cancellable,
-+ GAsyncReadyCallback callback,
-+ gpointer user_data)
-+{
-+ GsPluginOpensuseDistroUpgrade *self = GS_PLUGIN_OPENSUSE_DISTRO_UPGRADE (plugin);
-+ g_autoptr(GFile) file = NULL;
-+ g_autoptr(GsOsRelease) os_release = NULL;
-+ g_autoptr(GTask) task = NULL;
-+ g_autoptr(GError) local_error = NULL;
-+
-+ task = g_task_new (plugin, cancellable, callback, user_data);
-+ g_task_set_source_tag (task, gs_plugin_opensuse_distro_upgrade_setup_async);
-+
-+ /* get the file to cache */
-+ self->cachefn = gs_utils_get_cache_filename ("opensuse-distro-upgrade",
-+ "distributions.json",
-+ GS_UTILS_CACHE_FLAG_WRITEABLE |
-+ GS_UTILS_CACHE_FLAG_CREATE_DIRECTORY,
-+ &local_error);
-+ if (self->cachefn == NULL) {
-+ g_task_return_error (task, g_steal_pointer (&local_error));
-+ return;
-+ }
-+
-+ /* watch this in case it is changed by the user */
-+ file = g_file_new_for_path (self->cachefn);
-+ self->cachefn_monitor = g_file_monitor (file,
-+ G_FILE_MONITOR_NONE,
-+ cancellable,
-+ &local_error);
-+ if (self->cachefn_monitor == NULL) {
-+ g_task_return_error (task, g_steal_pointer (&local_error));
-+ return;
-+ }
-+
-+ g_signal_connect (self->cachefn_monitor, "changed",
-+ G_CALLBACK (_file_changed_cb), plugin);
-+
-+ /* read os-release for the current versions */
-+ os_release = gs_os_release_new (&local_error);
-+ if (os_release == NULL) {
-+ g_task_return_error (task, g_steal_pointer (&local_error));
-+ return;
-+ }
-+
-+ self->os_name = g_strdup (gs_os_release_get_name (os_release));
-+ if (self->os_name == NULL) {
-+ g_task_return_new_error (task, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_INVALID_FORMAT,
-+ "OS release had no name");
-+ return;
-+ }
-+ self->os_version = g_strdup (gs_os_release_get_version_id (os_release));
-+ if (self->os_version == NULL) {
-+ g_task_return_new_error (task, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_INVALID_FORMAT,
-+ "OS release had no version ID");
-+ return;
-+ }
-+
-+ /* add source */
-+ self->cached_origin = gs_app_new (gs_plugin_get_name (plugin));
-+ gs_app_set_kind (self->cached_origin, AS_COMPONENT_KIND_REPOSITORY);
-+ gs_app_set_origin_hostname (self->cached_origin,
-+ OPENSUSE_DISTRO_UPGRADE_API_URI);
-+ gs_app_set_management_plugin (self->cached_origin, plugin);
-+
-+ /* add the source to the plugin cache which allows us to match the
-+ * unique ID to a GsApp when creating an event */
-+ gs_plugin_cache_add (plugin,
-+ gs_app_get_unique_id (self->cached_origin),
-+ self->cached_origin);
-+
-+ /* success */
-+ g_task_return_boolean (task, TRUE);
-+}
-+
-+static gboolean
-+gs_plugin_opensuse_distro_upgrade_setup_finish (GsPlugin *plugin,
-+ GAsyncResult *result,
-+ GError **error)
-+{
-+ return g_task_propagate_boolean (G_TASK (result), error);
-+}
-+
-+static void
-+gs_plugin_opensuse_distro_upgrade_refresh_metadata_async (GsPlugin *plugin,
-+ guint64 cache_age_secs,
-+ GsPluginRefreshMetadataFlags flags,
-+ GCancellable *cancellable,
-+ GAsyncReadyCallback callback,
-+ gpointer user_data)
-+{
-+ GsPluginOpensuseDistroUpgrade *self = GS_PLUGIN_OPENSUSE_DISTRO_UPGRADE (plugin);
-+ _refresh_cache_async (self, cache_age_secs, cancellable, callback, user_data);
-+}
-+
-+static gboolean
-+gs_plugin_opensuse_distro_upgrade_refresh_metadata_finish (GsPlugin *plugin,
-+ GAsyncResult *result,
-+ GError **error)
-+{
-+ return _refresh_cache_finish (GS_PLUGIN_OPENSUSE_DISTRO_UPGRADE (plugin),
-+ result,
-+ error);
-+}
-+
-+static void
-+gs_plugin_opensuse_distro_upgrade_init (GsPluginOpensuseDistroUpgrade *self)
-+{
-+ GsPlugin *plugin = GS_PLUGIN (self);
-+
-+ /* We don't need distribution upgrade banner for Tumbleweed. */
-+ if (gs_plugin_check_distro_id (plugin, "opensuse-tumbleweed")) {
-+ gs_plugin_set_enabled (plugin, FALSE);
-+ g_debug ("Disabeling '%s' as this is not needed in Tumbleweed.", gs_plugin_get_name (plugin));
-+ return;
-+ }
-+
-+ /* Check if we are running openSUSE Leap. */
-+ if (!gs_plugin_check_distro_id (plugin, "opensuse-leap")) {
-+ gs_plugin_set_enabled (plugin, FALSE);
-+ g_debug ("Disabling '%s' as it's only supported in openSUSE Leap", gs_plugin_get_name (plugin));
-+ return;
-+ }
-+
-+ self->distros = g_ptr_array_new_with_free_func ((GDestroyNotify) _distro_upgrade_item_destroy);
-+
-+ /* require the GnomeSoftware::CpeName metadata */
-+ gs_plugin_add_rule (plugin, GS_PLUGIN_RULE_RUN_AFTER, "os-release");
-+}
-+
-+static void
-+gs_plugin_opensuse_distro_upgrade_class_init (GsPluginOpensuseDistroUpgradeClass *klass)
-+{
-+ GObjectClass *object_class = G_OBJECT_CLASS (klass);
-+ GsPluginClass *plugin_class = GS_PLUGIN_CLASS (klass);
-+
-+ object_class->dispose = gs_plugin_opensuse_distro_upgrade_dispose;
-+ object_class->finalize = gs_plugin_opensuse_distro_upgrade_finalize;
-+
-+ plugin_class->setup_async = gs_plugin_opensuse_distro_upgrade_setup_async;
-+ plugin_class->setup_finish = gs_plugin_opensuse_distro_upgrade_setup_finish;
-+ plugin_class->refresh_metadata_async = gs_plugin_opensuse_distro_upgrade_refresh_metadata_async;
-+ plugin_class->refresh_metadata_finish = gs_plugin_opensuse_distro_upgrade_refresh_metadata_finish;
-+ plugin_class->list_distro_upgrades_async = gs_plugin_opensuse_distro_upgrade_list_distro_upgrades_async;
-+ plugin_class->list_distro_upgrades_finish = gs_plugin_opensuse_distro_upgrade_list_distro_upgrades_finish;
-+}
-+
-+GType
-+gs_plugin_query_type (void)
-+{
-+ return GS_TYPE_PLUGIN_OPENSUSE_DISTRO_UPGRADE;
-+}
-diff --git a/plugins/opensuse-distro-upgrade/gs-plugin-opensuse-distro-upgrade.h b/plugins/opensuse-distro-upgrade/gs-plugin-opensuse-distro-upgrade.h
-new file mode 100644
-index 000000000..5b1763c05
---- /dev/null
-+++ b/plugins/opensuse-distro-upgrade/gs-plugin-opensuse-distro-upgrade.h
-@@ -0,0 +1,19 @@
-+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
-+ *
-+ * Copyright (C) 2020 Jonathan Kang
-+ *
-+ * SPDX-License-Identifier: GPL-2.0+
-+ */
-+
-+#pragma once
-+
-+#include
-+#include
-+
-+G_BEGIN_DECLS
-+
-+#define GS_TYPE_PLUGIN_OPENSUSE_DISTRO_UPGRADE (gs_plugin_opensuse_distro_upgrade_get_type ())
-+
-+G_DECLARE_FINAL_TYPE (GsPluginOpensuseDistroUpgrade, gs_plugin_opensuse_distro_upgrade, GS, PLUGIN_OPENSUSE_DISTRO_UPGRADE, GsPlugin)
-+
-+G_END_DECLS
-diff --git a/plugins/opensuse-distro-upgrade/meson.build b/plugins/opensuse-distro-upgrade/meson.build
-new file mode 100644
-index 000000000..bc09af9b4
---- /dev/null
-+++ b/plugins/opensuse-distro-upgrade/meson.build
-@@ -0,0 +1,14 @@
-+cargs = ['-DG_LOG_DOMAIN="GsPluginOpensuseDistroUpgrade"']
-+
-+shared_module(
-+ 'gs_plugin_opensuse-distro-upgrade',
-+ sources : 'gs-plugin-opensuse-distro-upgrade.c',
-+ include_directories : [
-+ include_directories('../..'),
-+ include_directories('../../lib')
-+ ],
-+ install : true,
-+ install_dir : plugin_dir,
-+ c_args : cargs,
-+ dependencies : plugin_libs,
-+)
---
-2.37.3
-
diff --git a/gnome-software-support-appstream-1_0.patch b/gnome-software-support-appstream-1_0.patch
deleted file mode 100644
index 2aa36ab..0000000
--- a/gnome-software-support-appstream-1_0.patch
+++ /dev/null
@@ -1,511 +0,0 @@
-Support building with appstream 0.16 and 1.0
-Origin: https://gitlab.gnome.org/GNOME/gnome-software/-/merge_requests/1810
- https://gitlab.gnome.org/GNOME/gnome-software/-/merge_requests/1830
-
----
- lib/gs-app.c | 4 ++
- lib/gs-appstream.c | 63 +++++++++++++++++++-----
- lib/gs-utils.c | 8 +--
- meson.build | 22 +--------
- plugins/core/gs-plugin-appstream.c | 8 ---
- plugins/fwupd/gs-fwupd-app.c | 8 +++
- plugins/fwupd/gs-plugin-fwupd.c | 4 ++
- src/gs-hardware-support-context-dialog.c | 6 +++
- src/gs-repos-dialog.c | 4 ++
- src/gs-screenshot-carousel.c | 4 +-
- src/gs-screenshot-image.c | 41 +++++++++++----
- src/gs-screenshot-image.h | 7 +++
- subprojects/appstream.wrap | 2 +-
- 13 files changed, 122 insertions(+), 59 deletions(-)
-
-diff --git a/lib/gs-app.c b/lib/gs-app.c
-index 048a061..e269405 100644
---- a/lib/gs-app.c
-+++ b/lib/gs-app.c
-@@ -609,7 +609,11 @@ gs_app_to_string_append (GsApp *app, GString *str)
- AsScreenshot *ss = g_ptr_array_index (priv->screenshots, i);
- g_autofree gchar *key = NULL;
- tmp = as_screenshot_get_caption (ss);
-+#if AS_CHECK_VERSION(1, 0, 0)
-+ im = as_screenshot_get_image (ss, 0, 0, 1);
-+#else
- im = as_screenshot_get_image (ss, 0, 0);
-+#endif
- if (im == NULL)
- continue;
- key = g_strdup_printf ("screenshot-%02u", i);
-diff --git a/lib/gs-appstream.c b/lib/gs-appstream.c
-index deca176..4fd7f53 100644
---- a/lib/gs-appstream.c
-+++ b/lib/gs-appstream.c
-@@ -587,8 +587,6 @@ gs_appstream_refine_add_provides (GsApp *app, XbNode *component, GError **error)
- kind = AS_PROVIDED_KIND_FIRMWARE_RUNTIME;
- else if (g_strcmp0 (fw_type, "flashed") == 0)
- kind = AS_PROVIDED_KIND_FIRMWARE_FLASHED;
-- } else if (g_strcmp0 (element_name, "python2") == 0) {
-- kind = AS_PROVIDED_KIND_PYTHON_2;
- } else if (g_strcmp0 (element_name, "python3") == 0) {
- kind = AS_PROVIDED_KIND_PYTHON;
- } else if (g_strcmp0 (element_name, "dbus") == 0) {
-@@ -1011,8 +1009,11 @@ gs_appstream_refine_app_relation (GsApp *app,
- as_relation_set_item_kind (relation, AS_RELATION_ITEM_KIND_CONTROL);
- as_relation_set_value_control_kind (relation, as_control_kind_from_string (xb_node_get_text (child)));
- } else if (g_str_equal (item_kind, "display_length")) {
-- AsDisplayLengthKind display_length_kind;
- const gchar *compare;
-+ const gchar *side;
-+#if !AS_CHECK_VERSION(1, 0, 0)
-+ AsDisplayLengthKind display_length_kind;
-+#endif
-
- /* https://www.freedesktop.org/software/appstream/docs/chap-Metadata.html#tag-relations-display_length */
- as_relation_set_item_kind (relation, AS_RELATION_ITEM_KIND_DISPLAY_LENGTH);
-@@ -1020,15 +1021,21 @@ gs_appstream_refine_app_relation (GsApp *app,
- compare = xb_node_get_attr (child, "compare");
- as_relation_set_compare (relation, (compare != NULL) ? as_relation_compare_from_string (compare) : AS_RELATION_COMPARE_GE);
-
-+#if AS_CHECK_VERSION(1, 0, 0)
-+ side = xb_node_get_attr (child, "side");
-+ as_relation_set_display_side_kind (relation, (side != NULL) ? as_display_side_kind_from_string (side) : AS_DISPLAY_SIDE_KIND_SHORTEST);
-+ as_relation_set_value_px (relation, xb_node_get_text_as_uint (child));
-+#else
- display_length_kind = as_display_length_kind_from_string (xb_node_get_text (child));
- if (display_length_kind != AS_DISPLAY_LENGTH_KIND_UNKNOWN) {
- /* Ignore the `side` attribute */
- as_relation_set_value_display_length_kind (relation, display_length_kind);
- } else {
-- const gchar *side = xb_node_get_attr (child, "side");
-+ side = xb_node_get_attr (child, "side");
- as_relation_set_display_side_kind (relation, (side != NULL) ? as_display_side_kind_from_string (side) : AS_DISPLAY_SIDE_KIND_SHORTEST);
- as_relation_set_value_px (relation, xb_node_get_text_as_uint (child));
- }
-+#endif
- } else {
- g_debug ("Relation type ‘%s’ not currently supported for %s; ignoring",
- item_kind, gs_app_get_id (app));
-@@ -1472,7 +1479,7 @@ gs_appstream_refine_app (GsPlugin *plugin,
- }
-
- typedef struct {
-- AsSearchTokenMatch match_value;
-+ guint16 match_value;
- XbQuery *query;
- } GsAppstreamSearchHelper;
-
-@@ -1522,7 +1529,7 @@ gs_appstream_silo_search_component (GPtrArray *array, XbNode *component, const g
- }
-
- typedef struct {
-- AsSearchTokenMatch match_value;
-+ guint16 match_value;
- const gchar *xpath;
- } Query;
-
-@@ -1539,6 +1546,11 @@ gs_appstream_do_search (GsPlugin *plugin,
- g_autoptr(GPtrArray) array = g_ptr_array_new_with_free_func ((GDestroyNotify) gs_appstream_search_helper_free);
- g_autoptr(GPtrArray) components = NULL;
- g_autoptr(GTimer) timer = g_timer_new ();
-+#if AS_CHECK_VERSION(1, 0, 0)
-+ const guint16 component_id_weight = as_utils_get_tag_search_weight ("id");
-+#else
-+ const guint16 component_id_weight = AS_SEARCH_TOKEN_MATCH_ID;
-+#endif
-
- g_return_val_if_fail (GS_IS_PLUGIN (plugin), FALSE);
- g_return_val_if_fail (XB_IS_SILO (silo), FALSE);
-@@ -1585,7 +1597,7 @@ gs_appstream_do_search (GsPlugin *plugin,
- * Drop the ID token from it as it’s the highest
- * numeric value but isn’t visible to the user in the
- * UI, which leads to confusing results ordering. */
-- gs_app_set_match_value (app, match_value & (~AS_SEARCH_TOKEN_MATCH_ID));
-+ gs_app_set_match_value (app, match_value & (~component_id_weight));
- gs_app_list_add (list, app);
-
- if (gs_app_get_kind (app) == AS_COMPONENT_KIND_ADDON) {
-@@ -1624,18 +1636,32 @@ gs_appstream_search (GsPlugin *plugin,
- GCancellable *cancellable,
- GError **error)
- {
-+#if AS_CHECK_VERSION(1, 0, 0)
-+ guint16 pkgname_weight = as_utils_get_tag_search_weight ("pkgname");
-+ guint16 name_weight = as_utils_get_tag_search_weight ("name");
-+ guint16 id_weight = as_utils_get_tag_search_weight ("id");
- const Query queries[] = {
-- #ifdef HAVE_AS_SEARCH_TOKEN_MATCH_MEDIATYPE
-- { AS_SEARCH_TOKEN_MATCH_MEDIATYPE, "mimetypes/mimetype[text()~=stem(?)]" },
-- #else
-- { AS_SEARCH_TOKEN_MATCH_MIMETYPE, "mimetypes/mimetype[text()~=stem(?)]" },
-- #endif
-+ { as_utils_get_tag_search_weight ("mediatype"), "provides/mediatype[text()~=stem(?)]" },
- /* Search once with a tokenize-and-casefold operator (`~=`) to support casefolded
- * full-text search, then again using substring matching (`contains()`), to
- * support prefix matching. Only do the prefix matches on a few fields, and at a
- * lower priority, otherwise things will get confusing.
-- *
-+ *
- * See https://gitlab.gnome.org/GNOME/gnome-software/-/issues/2277 */
-+ { pkgname_weight, "pkgname[text()~=stem(?)]" },
-+ { pkgname_weight / 2, "pkgname[contains(text(),stem(?))]" },
-+ { as_utils_get_tag_search_weight ("summary"), "summary[text()~=stem(?)]" },
-+ { name_weight, "name[text()~=stem(?)]" },
-+ { name_weight / 2, "name[contains(text(),stem(?))]" },
-+ { as_utils_get_tag_search_weight ("keyword"), "keywords/keyword[text()~=stem(?)]" },
-+ { id_weight, "id[text()~=stem(?)]" },
-+ { id_weight, "launchable[text()~=stem(?)]" },
-+ { as_utils_get_tag_search_weight ("origin"), "../components[@origin~=stem(?)]" },
-+ { 0, NULL }
-+ };
-+#else
-+ const Query queries[] = {
-+ { AS_SEARCH_TOKEN_MATCH_MEDIATYPE, "mimetypes/mimetype[text()~=stem(?)]" },
- { AS_SEARCH_TOKEN_MATCH_PKGNAME, "pkgname[text()~=stem(?)]" },
- { AS_SEARCH_TOKEN_MATCH_PKGNAME / 2, "pkgname[contains(text(),stem(?))]" },
- { AS_SEARCH_TOKEN_MATCH_SUMMARY, "summary[text()~=stem(?)]" },
-@@ -1647,6 +1673,7 @@ gs_appstream_search (GsPlugin *plugin,
- { AS_SEARCH_TOKEN_MATCH_ORIGIN, "../components[@origin~=stem(?)]" },
- { AS_SEARCH_TOKEN_MATCH_NONE, NULL }
- };
-+#endif
-
- return gs_appstream_do_search (plugin, silo, values, queries, list, cancellable, error);
- }
-@@ -1659,11 +1686,21 @@ gs_appstream_search_developer_apps (GsPlugin *plugin,
- GCancellable *cancellable,
- GError **error)
- {
-+#if AS_CHECK_VERSION(1, 0, 0)
-+ const Query queries[] = {
-+ { as_utils_get_tag_search_weight ("pkgname"), "developer/name[text()~=stem(?)]" },
-+ { as_utils_get_tag_search_weight ("summary"), "project_group[text()~=stem(?)]" },
-+ /* for legacy support */
-+ { as_utils_get_tag_search_weight ("pkgname"), "developer_name[text()~=stem(?)]" },
-+ { 0, NULL }
-+ };
-+#else
- const Query queries[] = {
- { AS_SEARCH_TOKEN_MATCH_PKGNAME, "developer_name[text()~=stem(?)]" },
- { AS_SEARCH_TOKEN_MATCH_SUMMARY, "project_group[text()~=stem(?)]" },
- { AS_SEARCH_TOKEN_MATCH_NONE, NULL }
- };
-+#endif
-
- return gs_appstream_do_search (plugin, silo, values, queries, list, cancellable, error);
- }
-diff --git a/lib/gs-utils.c b/lib/gs-utils.c
-index cf90730..19e6ebd 100644
---- a/lib/gs-utils.c
-+++ b/lib/gs-utils.c
-@@ -1694,9 +1694,9 @@ gs_utils_gstring_replace (GString *str,
- const gchar *find,
- const gchar *replace)
- {
-- #ifdef HAVE_AS_GSTRING_REPLACE_WITH_FOUR_ARGS
-+#if AS_CHECK_VERSION(1, 0, 0)
- as_gstring_replace (str, find, replace, 0);
-- #else
-- as_gstring_replace (str, find, replace);
-- #endif
-+#else
-+ as_gstring_replace2 (str, find, replace, 0);
-+#endif
- }
-diff --git a/meson.build b/meson.build
-index da9e7ac..2cab9d6 100644
---- a/meson.build
-+++ b/meson.build
-@@ -113,7 +113,7 @@ add_project_arguments('-D_GNU_SOURCE', language : 'c')
- conf.set('HAVE_LINUX_UNISTD_H', cc.has_header('linux/unistd.h'))
-
- appstream = dependency('appstream',
-- version : '>= 0.14.0',
-+ version : '>= 0.16.4',
- fallback : ['appstream', 'appstream_dep'],
- default_options : [
- 'docs=false',
-@@ -121,26 +121,6 @@ appstream = dependency('appstream',
- 'install-docs=false'
- ]
- )
--if appstream.type_name() == 'internal'
--else
-- if meson.get_compiler('c').has_header_symbol('appstream.h', 'AS_SEARCH_TOKEN_MATCH_MEDIATYPE', dependencies: appstream)
-- conf.set('HAVE_AS_SEARCH_TOKEN_MATCH_MEDIATYPE', '1')
-- endif
-- if meson.get_compiler('c').has_header_symbol('appstream.h', 'AS_FORMAT_STYLE_CATALOG', dependencies: appstream)
-- conf.set('HAVE_AS_FORMAT_STYLE_CATALOG', '1')
-- endif
-- if meson.get_compiler('c').has_function('as_metadata_components_to_catalog', prefix: '#include ', dependencies: appstream)
-- conf.set('HAVE_AS_METADATA_COMPONENTS_TO_CATALOG', '1')
-- endif
-- if meson.get_compiler('c').links('''#include
-- int main (void)
-- {
-- as_gstring_replace (NULL, "a", "b", 0);
-- return 0;
-- }''', name: 'as_gstring_replace() has four arguments', dependencies: appstream)
-- conf.set('HAVE_AS_GSTRING_REPLACE_WITH_FOUR_ARGS', '1')
-- endif
--endif
-
- gdk_pixbuf = dependency('gdk-pixbuf-2.0', version : '>= 2.32.0')
- libxmlb = dependency('xmlb', version : '>= 0.1.7', fallback : ['libxmlb', 'libxmlb_dep'])
-diff --git a/plugins/core/gs-plugin-appstream.c b/plugins/core/gs-plugin-appstream.c
-index cf9f302..ef3226a 100644
---- a/plugins/core/gs-plugin-appstream.c
-+++ b/plugins/core/gs-plugin-appstream.c
-@@ -414,11 +414,7 @@ gs_plugin_appstream_load_dep11_cb (XbBuilderSource *self,
- if (bytes == NULL)
- return NULL;
-
-- #ifdef HAVE_AS_FORMAT_STYLE_CATALOG
- as_metadata_set_format_style (mdata, AS_FORMAT_STYLE_CATALOG);
-- #else
-- as_metadata_set_format_style (mdata, AS_FORMAT_STYLE_COLLECTION);
-- #endif
- as_metadata_parse_bytes (mdata,
- bytes,
- AS_FORMAT_KIND_YAML,
-@@ -428,11 +424,7 @@ gs_plugin_appstream_load_dep11_cb (XbBuilderSource *self,
- return NULL;
- }
-
-- #ifdef HAVE_AS_METADATA_COMPONENTS_TO_CATALOG
- xml = as_metadata_components_to_catalog (mdata, AS_FORMAT_KIND_XML, &tmp_error);
-- #else
-- xml = as_metadata_components_to_collection (mdata, AS_FORMAT_KIND_XML, &tmp_error);
-- #endif
- if (xml == NULL) {
- // This API currently returns NULL if there is nothing to serialize, so we
- // have to test if this is an error or not.
-diff --git a/plugins/fwupd/gs-fwupd-app.c b/plugins/fwupd/gs-fwupd-app.c
-index 6dcda6e..5d3254d 100644
---- a/plugins/fwupd/gs-fwupd-app.c
-+++ b/plugins/fwupd/gs-fwupd-app.c
-@@ -164,7 +164,11 @@ gs_fwupd_app_set_from_device (GsApp *app,
- gs_app_set_install_date (app, fwupd_device_get_created (dev));
- if (fwupd_device_get_description (dev) != NULL) {
- g_autofree gchar *tmp = NULL;
-+#if AS_CHECK_VERSION(1, 0, 0)
-+ tmp = as_markup_convert (fwupd_device_get_description (dev), AS_MARKUP_KIND_TEXT, NULL);
-+#else
- tmp = as_markup_convert_simple (fwupd_device_get_description (dev), NULL);
-+#endif
- if (tmp != NULL)
- gs_app_set_description (app, GS_APP_QUALITY_NORMAL, tmp);
- }
-@@ -402,7 +406,11 @@ gs_fwupd_app_set_from_release (GsApp *app, FwupdRelease *rel)
- }
- if (fwupd_release_get_description (rel) != NULL) {
- g_autofree gchar *tmp = NULL;
-+#if AS_CHECK_VERSION(1, 0, 0)
-+ tmp = as_markup_convert (fwupd_release_get_description (rel), AS_MARKUP_KIND_TEXT, NULL);
-+#else
- tmp = as_markup_convert_simple (fwupd_release_get_description (rel), NULL);
-+#endif
- if (tmp != NULL)
- gs_app_set_update_details_text (app, tmp);
- }
-diff --git a/plugins/fwupd/gs-plugin-fwupd.c b/plugins/fwupd/gs-plugin-fwupd.c
-index e931b2b..0747d6e 100644
---- a/plugins/fwupd/gs-plugin-fwupd.c
-+++ b/plugins/fwupd/gs-plugin-fwupd.c
-@@ -726,7 +726,11 @@ gs_plugin_add_updates (GsPlugin *plugin,
- g_autofree gchar *desc = NULL;
- if (fwupd_release_get_description (rel) == NULL)
- continue;
-+#if AS_CHECK_VERSION(1, 0, 0)
-+ desc = as_markup_convert (fwupd_release_get_description (rel), AS_MARKUP_KIND_TEXT, NULL);
-+#else
- desc = as_markup_convert_simple (fwupd_release_get_description (rel), NULL);
-+#endif
- if (desc == NULL)
- continue;
- g_string_append_printf (update_desc,
-diff --git a/src/gs-hardware-support-context-dialog.c b/src/gs-hardware-support-context-dialog.c
-index 0e48c8c..1465340 100644
---- a/src/gs-hardware-support-context-dialog.c
-+++ b/src/gs-hardware-support-context-dialog.c
-@@ -461,6 +461,7 @@ gs_hardware_support_context_dialog_get_display_support (GdkMonitor *monitor,
- AsRelationCompare comparator = as_relation_get_compare (relation);
- Range current_display_comparand, relation_comparand;
-
-+#if !AS_CHECK_VERSION(1, 0, 0)
- /* From https://www.freedesktop.org/software/appstream/docs/chap-Metadata.html#tag-requires-recommends-display_length */
- Range display_lengths[] = {
- [AS_DISPLAY_LENGTH_KIND_XSMALL] = { 0, 360 },
-@@ -469,6 +470,7 @@ gs_hardware_support_context_dialog_get_display_support (GdkMonitor *monitor,
- [AS_DISPLAY_LENGTH_KIND_LARGE] = { 1024, 3840 },
- [AS_DISPLAY_LENGTH_KIND_XLARGE] = { 3840, G_MAXUINT },
- };
-+#endif
-
- any_display_relations_set = TRUE;
-
-@@ -485,11 +487,14 @@ gs_hardware_support_context_dialog_get_display_support (GdkMonitor *monitor,
- case AS_DISPLAY_SIDE_KIND_LAST:
- default:
- current_display_comparand.min = current_display_comparand.max = MAX (current_screen_size.width, current_screen_size.height);
-+#if !AS_CHECK_VERSION(1, 0, 0)
- relation_comparand.min = display_lengths[as_relation_get_value_display_length_kind (relation)].min;
- relation_comparand.max = display_lengths[as_relation_get_value_display_length_kind (relation)].max;
-+#endif
- break;
- }
-
-+#if !AS_CHECK_VERSION(1, 0, 0)
- if (evaluate_display_comparison (display_lengths[AS_DISPLAY_LENGTH_KIND_SMALL], comparator, relation_comparand)) {
- *mobile_relation_kind_out = max_relation_kind (*mobile_relation_kind_out, as_relation_get_kind (relation));
- *mobile_match_out = TRUE;
-@@ -499,6 +504,7 @@ gs_hardware_support_context_dialog_get_display_support (GdkMonitor *monitor,
- *desktop_relation_kind_out = max_relation_kind (*desktop_relation_kind_out, as_relation_get_kind (relation));
- *desktop_match_out = TRUE;
- }
-+#endif
-
- if (evaluate_display_comparison (current_display_comparand, comparator, relation_comparand)) {
- *current_relation_kind_out = max_relation_kind (*current_relation_kind_out, as_relation_get_kind (relation));
-diff --git a/src/gs-repos-dialog.c b/src/gs-repos-dialog.c
-index c41c494..7dac041 100644
---- a/src/gs-repos-dialog.c
-+++ b/src/gs-repos-dialog.c
-@@ -154,7 +154,11 @@ enable_repo (GsReposDialog *dialog,
- g_autoptr(GError) error = NULL;
-
- /* convert from AppStream markup */
-+#if AS_CHECK_VERSION(1, 0, 0)
-+ message = as_markup_convert (gs_app_get_agreement (repo), AS_MARKUP_KIND_TEXT, &error);
-+#else
- message = as_markup_convert_simple (gs_app_get_agreement (repo), &error);
-+#endif
- if (message == NULL) {
- /* failed, so just try and show the original markup */
- message = g_strdup (gs_app_get_agreement (repo));
-diff --git a/src/gs-screenshot-carousel.c b/src/gs-screenshot-carousel.c
-index 04bbf86..d269af6 100644
---- a/src/gs-screenshot-carousel.c
-+++ b/src/gs-screenshot-carousel.c
-@@ -141,8 +141,8 @@ gs_screenshot_carousel_load_screenshots (GsScreenshotCarousel *self, GsApp *app,
- gtk_widget_set_can_focus (gtk_widget_get_first_child (ssimg), FALSE);
- gs_screenshot_image_set_screenshot (GS_SCREENSHOT_IMAGE (ssimg), ss);
- gs_screenshot_image_set_size (GS_SCREENSHOT_IMAGE (ssimg),
-- AS_IMAGE_NORMAL_WIDTH,
-- AS_IMAGE_NORMAL_HEIGHT);
-+ GS_IMAGE_NORMAL_WIDTH,
-+ GS_IMAGE_NORMAL_HEIGHT);
- gtk_widget_add_css_class (ssimg, "screenshot-image-main");
- gs_screenshot_image_load_async (GS_SCREENSHOT_IMAGE (ssimg), cancellable);
-
-diff --git a/src/gs-screenshot-image.c b/src/gs-screenshot-image.c
-index c313a25..b24083b 100644
---- a/src/gs-screenshot-image.c
-+++ b/src/gs-screenshot-image.c
-@@ -284,13 +284,13 @@ gs_screenshot_image_save_downloaded_img (GsScreenshotImage *ssimg,
- if (images->len > 1)
- return TRUE;
-
-- if (width == AS_IMAGE_THUMBNAIL_WIDTH &&
-- height == AS_IMAGE_THUMBNAIL_HEIGHT) {
-- width = AS_IMAGE_NORMAL_WIDTH;
-- height = AS_IMAGE_NORMAL_HEIGHT;
-+ if (width == GS_IMAGE_THUMBNAIL_WIDTH &&
-+ height == GS_IMAGE_THUMBNAIL_HEIGHT) {
-+ width = GS_IMAGE_NORMAL_WIDTH;
-+ height = GS_IMAGE_NORMAL_HEIGHT;
- } else {
-- width = AS_IMAGE_THUMBNAIL_WIDTH;
-- height = AS_IMAGE_THUMBNAIL_HEIGHT;
-+ width = GS_IMAGE_THUMBNAIL_WIDTH;
-+ height = GS_IMAGE_THUMBNAIL_HEIGHT;
- }
-
- width *= ssimg->scale;
-@@ -582,16 +582,30 @@ gs_screenshot_image_get_url (GsScreenshotImage *ssimg)
- } else if (as_screenshot_get_media_kind (ssimg->screenshot) == AS_SCREENSHOT_MEDIA_KIND_IMAGE) {
- AsImage *im;
-
-+#if AS_CHECK_VERSION(1, 0, 0)
-+ im = as_screenshot_get_image (ssimg->screenshot,
-+ ssimg->width,
-+ ssimg->height,
-+ ssimg->scale);
-+#else
- im = as_screenshot_get_image (ssimg->screenshot,
- ssimg->width * ssimg->scale,
- ssimg->height * ssimg->scale);
-+#endif
-
- /* if we've failed to load a HiDPI image, fallback to LoDPI */
- if (im == NULL && ssimg->scale > 1) {
- ssimg->scale = 1;
-+#if AS_CHECK_VERSION(1, 0, 0)
-+ im = as_screenshot_get_image (ssimg->screenshot,
-+ ssimg->width,
-+ ssimg->height,
-+ 1);
-+#else
- im = as_screenshot_get_image (ssimg->screenshot,
- ssimg->width,
- ssimg->height);
-+#endif
- }
-
- if (im)
-@@ -698,15 +712,22 @@ gs_screenshot_image_load_async (GsScreenshotImage *ssimg,
- * smaller version of it straight away */
- if (!ssimg->showing_image &&
- as_screenshot_get_media_kind (ssimg->screenshot) == AS_SCREENSHOT_MEDIA_KIND_IMAGE &&
-- ssimg->width > AS_IMAGE_THUMBNAIL_WIDTH &&
-- ssimg->height > AS_IMAGE_THUMBNAIL_HEIGHT) {
-+ ssimg->width > GS_IMAGE_THUMBNAIL_WIDTH &&
-+ ssimg->height > GS_IMAGE_THUMBNAIL_HEIGHT) {
- const gchar *url_thumb;
- g_autofree gchar *basename_thumb = NULL;
- g_autofree gchar *cache_kind_thumb = NULL;
- AsImage *im;
-+#if AS_CHECK_VERSION(1, 0, 0)
- im = as_screenshot_get_image (ssimg->screenshot,
-- AS_IMAGE_THUMBNAIL_WIDTH * ssimg->scale,
-- AS_IMAGE_THUMBNAIL_HEIGHT * ssimg->scale);
-+ GS_IMAGE_THUMBNAIL_WIDTH,
-+ GS_IMAGE_THUMBNAIL_HEIGHT,
-+ ssimg->scale);
-+#else
-+ im = as_screenshot_get_image (ssimg->screenshot,
-+ GS_IMAGE_THUMBNAIL_WIDTH * ssimg->scale,
-+ GS_IMAGE_THUMBNAIL_HEIGHT * ssimg->scale);
-+#endif
- url_thumb = as_image_get_url (im);
- basename_thumb = gs_screenshot_get_cachefn_for_url (url_thumb);
- cache_kind_thumb = g_build_filename ("screenshots", "112x63", NULL);
-diff --git a/src/gs-screenshot-image.h b/src/gs-screenshot-image.h
-index 1f6cf81..6e45f5d 100644
---- a/src/gs-screenshot-image.h
-+++ b/src/gs-screenshot-image.h
-@@ -21,6 +21,13 @@ G_BEGIN_DECLS
-
- G_DECLARE_FINAL_TYPE (GsScreenshotImage, gs_screenshot_image, GS, SCREENSHOT_IMAGE, GtkWidget)
-
-+#define GS_IMAGE_LARGE_HEIGHT 423
-+#define GS_IMAGE_LARGE_WIDTH 752
-+#define GS_IMAGE_NORMAL_HEIGHT 351
-+#define GS_IMAGE_NORMAL_WIDTH 624
-+#define GS_IMAGE_THUMBNAIL_HEIGHT 63
-+#define GS_IMAGE_THUMBNAIL_WIDTH 112
-+
- GtkWidget *gs_screenshot_image_new (SoupSession *session);
-
- AsScreenshot *gs_screenshot_image_get_screenshot (GsScreenshotImage *ssimg);
-diff --git a/subprojects/appstream.wrap b/subprojects/appstream.wrap
-index 6f0beb0..b9a9c7d 100644
---- a/subprojects/appstream.wrap
-+++ b/subprojects/appstream.wrap
-@@ -1,5 +1,5 @@
- [wrap-git]
- directory = appstream
- url = https://github.com/ximion/appstream.git
--revision = v0.14.1
-+revision = v0.16.4
- depth = 1
---
-2.43.0
-
diff --git a/gnome-software.changes b/gnome-software.changes
index 0c558b4..9ab35f5 100644
--- a/gnome-software.changes
+++ b/gnome-software.changes
@@ -1,3 +1,54 @@
+-------------------------------------------------------------------
+Fri Mar 15 20:58:09 UTC 2024 - Dominique Leuenberger
+
+- Update to version 46.0:
+ + Improvements for screen readers.
+ + Stop ‘loading updates’ in a loop on Debian.
+ + Updated translations.
+
+-------------------------------------------------------------------
+Fri Mar 1 14:09:54 UTC 2024 - Dominique Leuenberger
+
+- Update to version 46.rc:
+ + Various UI text improvements.
+ + Fix launch of some apps.
+ + Fix invalid app state after it's uninstalled.
+ + Fix read of app description text.
+ + Do not ask to reboot after failed firmware update.
+ + Updated translations.
+
+-------------------------------------------------------------------
+Mon Feb 12 15:10:04 UTC 2024 - Dominique Leuenberger
+
+- Update to version 46.beta:
+ + Show feedback for all conditions that pause automatic updates.
+ + Various UI improvements and move to new libadwaita widgets.
+ + Fix loading OS AppStream catalog data if it is available as
+ YAML.
+ + Add openSUSE Leap distro upgrade plugin.
+- Pass -D opensuse-distro-upgrade=true to meson: we are openSUSE,
+ so we want the plugin.
+- Drop gnome-software-plugin-opensuse-distro-upgrade.patch: fixed
+ upstream.
+
+-------------------------------------------------------------------
+Tue Jan 16 13:19:59 UTC 2024 - Dominique Leuenberger
+
+- Update to version 46.alpha:
+ + Recognize links in package update descriptions.
+ + Expose package names discreetly in the UI.
+ + Increase speed of load of the category pages.
+ + Improve search match with multiple words.
+ + Recognize verified apps by Flathub.
+ + Correct message when installing firmware updates.
+ + Improve application safety checks.
+ + Improve update preferences dialog.
+ + Fix deadlock when cancelling app update.
+ + Support user installation of local flatpak files.
+ * Fix apps appearing unsorted and without tiles in category page.
+- Convert to source service for easier updating.
+- Drop gnome-software-support-appstream-1_0.patch: fixed upstream.
+
-------------------------------------------------------------------
Thu Dec 28 02:27:35 UTC 2023 - Yifan Jiang
@@ -13,7 +64,7 @@ Fri Dec 15 09:33:16 UTC 2023 - Christophe Marin
Fri Dec 1 10:46:39 UTC 2023 - Dominique Leuenberger
- Update to version 45.2:
- + Updated translations.
+ + Updated translations.
-------------------------------------------------------------------
Fri Oct 27 05:40:09 UTC 2023 - Jonathan Kang
diff --git a/gnome-software.obsinfo b/gnome-software.obsinfo
new file mode 100644
index 0000000..c39a114
--- /dev/null
+++ b/gnome-software.obsinfo
@@ -0,0 +1,4 @@
+name: gnome-software
+version: 46.0
+mtime: 1710515704
+commit: 9dec134914268d135a6f5251ddd624fef2de3c10
diff --git a/gnome-software.spec b/gnome-software.spec
index ef0e956..230c89b 100644
--- a/gnome-software.spec
+++ b/gnome-software.spec
@@ -20,23 +20,19 @@
%bcond_with profiling
Name: gnome-software
-Version: 45.2
+Version: 46.0
Release: 0
Summary: GNOME Software Store
License: GPL-2.0-or-later
Group: System/GUI/GNOME
URL: https://wiki.gnome.org/Apps/Software
-Source0: https://download.gnome.org/sources/gnome-software/45/%{name}-%{version}.tar.xz
+Source0: %{name}-%{version}.tar.zst
%if 0%{?sle_version}
# PATCH-FIX-OPENSUSE gnome-software-launch-gpk-update-viewer-for-updates.patch bsc#1077332 boo#1090042 sckang@suse.com -- Don't launch gnome-software when clicking the updates notification. Launch gpk-update-viewer instead.
Patch0: gnome-software-launch-gpk-update-viewer-for-updates.patch
# PATCH-FIX-OPENSUSE gnome-software-disable-offline-update.patch bsc#944832 sckang@suse.com -- Disable offline update in SLE and openSUSE Leap
Patch1: gnome-software-disable-offline-update.patch
%endif
-# PATCH-FIX-UPSTREAM gnome-software-plugin-opensuse-distro-upgrade.patch glgo#GNOME/gnome-software!1557 sckang@suse.com -- plugins: add opensuse-distro-upgrade plugin
-Patch2: gnome-software-plugin-opensuse-distro-upgrade.patch
-# PATCH-FIX-UPSTREAM gnome-software-support-appstream-1_0.patch boo#1217047 -- Apply upstream changes to support appstream 1.0
-Patch3: gnome-software-support-appstream-1_0.patch
BuildRequires: gtk-doc
BuildRequires: meson >= 0.58.0
BuildRequires: pkgconfig
@@ -57,7 +53,7 @@ BuildRequires: pkgconfig(libadwaita-1)
BuildRequires: pkgconfig(libhandy-1) >= 1.2.0
BuildRequires: pkgconfig(libsecret-1)
BuildRequires: pkgconfig(libsoup-3.0)
-BuildRequires: pkgconfig(malcontent-0) >= 0.3.0
+BuildRequires: pkgconfig(malcontent-0) >= 0.5.0
BuildRequires: pkgconfig(ostree-1)
BuildRequires: pkgconfig(packagekit-glib2) >= 1.1.0
BuildRequires: pkgconfig(polkit-gobject-1)
@@ -110,6 +106,7 @@ the GNOME software store.
-D malcontent=true \
-D soup2=false \
-D sysprof=%{?with_profiling:enabled}%{!?with_profiling:disabled} \
+ -D opensuse-distro-upgrade=true \
%{nil}
%meson_build
@@ -142,6 +139,7 @@ FOE
%{_datadir}/applications/gnome-software-local-file-fwupd.desktop
%{_datadir}/applications/gnome-software-local-file-packagekit.desktop
%{_datadir}/applications/org.gnome.Software.desktop
+%{_datadir}/bash-completion/completions/gnome-software
%{_datadir}/dbus-1/services/org.gnome.Software.service
%{_datadir}/dbus-1/services/org.freedesktop.PackageKit.service
%{_datadir}/glib-2.0/schemas/org.gnome.software.gschema.xml