Compare commits
12 commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
5da59d6a0c | ||
|
|
913b096912 | ||
|
|
e7fdb4825e | ||
|
|
e63a38c6ed | ||
|
|
7fbfd18862 | ||
|
|
ca8a2031f3 | ||
|
|
603bf65c71 | ||
|
|
fb5d7b9b27 | ||
|
|
c96db32054 | ||
|
|
281507f461 | ||
|
|
9c4bc38864 | ||
|
|
ac80077fe7 |
12 changed files with 1586 additions and 7738 deletions
104
.gitignore
vendored
104
.gitignore
vendored
|
|
@ -1,2 +1,102 @@
|
|||
/gnome-software-*.tar.xz
|
||||
/gnome-software-*-build
|
||||
/gnome-software-0.1.tar.xz
|
||||
/gnome-software-3.9.1.tar.xz
|
||||
/gnome-software-3.9.2.tar.xz
|
||||
/gnome-software-3.9.3.tar.xz
|
||||
/fedora-20.xml.gz
|
||||
/fedora-20-icons.tar.gz
|
||||
/gnome-software-3.10.0.tar.xz
|
||||
/gnome-software-3.11.1.tar.xz
|
||||
/fedora-20-codecs.xml
|
||||
/web-apps.xml
|
||||
/gnome-software-3.11.2.tar.xz
|
||||
/gnome-software-3.11.3.tar.xz
|
||||
/gnome-software-3.11.4.tar.xz
|
||||
/fedora-rawhide-icons.tar.gz
|
||||
/fedora-rawhide.xml.gz
|
||||
/gnome-software-3.11.5.tar.xz
|
||||
/gnome-software-3.11.90.tar.xz
|
||||
/gnome-software-3.11.91.tar.xz
|
||||
/gnome-software-3.11.92.tar.xz
|
||||
/gnome-software-3.12.0.tar.xz
|
||||
/gnome-software-3.12.1.tar.xz
|
||||
/gnome-software-3.13.1.tar.xz
|
||||
/fedora-21-icons.tar.gz
|
||||
/fedora-21.xml.gz
|
||||
/gnome-software-3.13.2.tar.xz
|
||||
/gnome-software-3.13.3-7491627.tar.xz
|
||||
/gnome-software-3.13.3.tar.xz
|
||||
/gnome-software-3.13.4.tar.xz
|
||||
/gnome-software-3.13.5-5c89189.tar.xz
|
||||
/gnome-software-3.13.90.tar.xz
|
||||
/gnome-software-3.13.91.tar.xz
|
||||
/gnome-software-3.13.92.tar.xz
|
||||
/gnome-software-3.14.0.tar.xz
|
||||
/gnome-software-3.14.1.tar.xz
|
||||
/gnome-software-3.14.2.tar.xz
|
||||
/gnome-software-3.15.2.tar.xz
|
||||
/gnome-software-3.15.4.tar.xz
|
||||
/gnome-software-3.15.90.tar.xz
|
||||
/gnome-software-3.15.91.tar.xz
|
||||
/gnome-software-3.15.92.tar.xz
|
||||
/gnome-software-3.16.0.tar.xz
|
||||
/gnome-software-3.16.1.tar.xz
|
||||
/gnome-software-3.16.2.tar.xz
|
||||
/gnome-software-3.17.1.tar.xz
|
||||
/gnome-software-3.17.2.tar.xz
|
||||
/gnome-software-3.17.3.tar.xz
|
||||
/gnome-software-3.17.90.tar.xz
|
||||
/gnome-software-3.17.91.tar.xz
|
||||
/gnome-software-3.17.92.tar.xz
|
||||
/gnome-software-3.18.0.tar.xz
|
||||
/gnome-software-3.18.1.tar.xz
|
||||
/gnome-software-3.18.2.tar.xz
|
||||
/gnome-software-3.18.3.tar.xz
|
||||
/gnome-software-3.19.4.tar.xz
|
||||
/gnome-software-3.19.90.tar.xz
|
||||
/gnome-software-3.19.91.tar.xz
|
||||
/gnome-software-3.19.92.tar.xz
|
||||
/gnome-software-3.20.0.tar.xz
|
||||
/gnome-software-3.20.1.tar.xz
|
||||
/gnome-software-3.20.2.tar.xz
|
||||
/gnome-software-3.21.1.tar.xz
|
||||
/gnome-software-3.21.2.tar.xz
|
||||
/gnome-software-3.21.4.tar.xz
|
||||
/gnome-software-3.21.90.tar.xz
|
||||
/gnome-software-3.21.91.tar.xz
|
||||
/gnome-software-3.21.92.tar.xz
|
||||
/gnome-software-3.22.0.tar.xz
|
||||
/gnome-software-3.22.1.tar.xz
|
||||
/gnome-software-3.22.2.tar.xz
|
||||
/gnome-software-3.23.2.tar.xz
|
||||
/gnome-software-3.23.3.tar.xz
|
||||
/gnome-software-3.23.90.tar.xz
|
||||
/gnome-software-3.23.91.tar.xz
|
||||
/gnome-software-3.23.92.tar.xz
|
||||
/gnome-software-3.24.0.tar.xz
|
||||
/gnome-software-3.24.1.tar.xz
|
||||
/gnome-software-3.24.2.tar.xz
|
||||
/gnome-software-3.24.3.tar.xz
|
||||
/gnome-software-3.25.3.tar.xz
|
||||
/gnome-software-3.25.4.tar.xz
|
||||
/gnome-software-3.25.90.tar.xz
|
||||
/gnome-software-3.25.91.tar.xz
|
||||
/gnome-software-3.26.0.tar.xz
|
||||
/gnome-software-3.26.1.tar.xz
|
||||
/gnome-software-3.26.2.tar.xz
|
||||
/gnome-software-3.27.2.tar.xz
|
||||
/gnome-software-3.27.3.tar.xz
|
||||
/gnome-software-3.27.4.tar.xz
|
||||
/gnome-software-3.27.90.tar.xz
|
||||
/gnome-software-3.27.92.tar.xz
|
||||
/gnome-software-3.28.0.tar.xz
|
||||
/gnome-software-3.28.1.tar.xz
|
||||
/gnome-software-3.29.1.tar.xz
|
||||
/gnome-software-3.29.92.tar.xz
|
||||
/gnome-software-3.30.0.tar.xz
|
||||
/gnome-software-3.30.1.tar.xz
|
||||
/gnome-software-3.30.2.tar.xz
|
||||
/gnome-software-3.30.3.tar.xz
|
||||
/gnome-software-3.30.5.tar.xz
|
||||
/gnome-software-3.30.6.tar.xz
|
||||
/f30.png
|
||||
/f31.png
|
||||
|
|
|
|||
145
0001-Lower-AsStore-new-API-version-checks-for-Fedora.patch
Normal file
145
0001-Lower-AsStore-new-API-version-checks-for-Fedora.patch
Normal file
|
|
@ -0,0 +1,145 @@
|
|||
From f91c54a70860ed12270bbafa121acae36f29badb Mon Sep 17 00:00:00 2001
|
||||
From: Kalev Lember <klember@redhat.com>
|
||||
Date: Tue, 18 Dec 2018 02:44:31 +0100
|
||||
Subject: [PATCH] Lower AsStore new API version checks for Fedora
|
||||
|
||||
We have new the AsStore thread safety patches along with new thread safe
|
||||
API backported to libappstream-glib-0.7.14-3.fc29.
|
||||
---
|
||||
plugins/core/gs-appstream.c | 12 ++++++------
|
||||
plugins/core/gs-plugin-appstream.c | 12 ++++++------
|
||||
plugins/flatpak/gs-flatpak.c | 2 +-
|
||||
3 files changed, 13 insertions(+), 13 deletions(-)
|
||||
|
||||
diff --git a/plugins/core/gs-appstream.c b/plugins/core/gs-appstream.c
|
||||
index b7bccd19a..7b606fe0d 100644
|
||||
--- a/plugins/core/gs-appstream.c
|
||||
+++ b/plugins/core/gs-appstream.c
|
||||
@@ -860,7 +860,7 @@ gs_appstream_store_search (GsPlugin *plugin,
|
||||
gboolean ret = TRUE;
|
||||
g_autoptr(GPtrArray) array = NULL;
|
||||
|
||||
-#if AS_CHECK_VERSION(0,7,15)
|
||||
+#if AS_CHECK_VERSION(0,7,14)
|
||||
array = as_store_dup_apps (store);
|
||||
#else
|
||||
array = g_ptr_array_ref (as_store_get_apps (store));
|
||||
@@ -937,7 +937,7 @@ gs_appstream_store_add_category_apps (GsPlugin *plugin,
|
||||
g_autoptr(GPtrArray) array = NULL;
|
||||
|
||||
/* just look at each app in turn */
|
||||
-#if AS_CHECK_VERSION(0,7,15)
|
||||
+#if AS_CHECK_VERSION(0,7,14)
|
||||
array = as_store_dup_apps (store);
|
||||
#else
|
||||
array = g_ptr_array_ref (as_store_get_apps (store));
|
||||
@@ -985,7 +985,7 @@ gs_appstream_store_add_categories (GsPlugin *plugin,
|
||||
g_autoptr(GPtrArray) array = NULL;
|
||||
|
||||
/* find out how many packages are in each category */
|
||||
-#if AS_CHECK_VERSION(0,7,15)
|
||||
+#if AS_CHECK_VERSION(0,7,14)
|
||||
array = as_store_dup_apps (store);
|
||||
#else
|
||||
array = g_ptr_array_ref (as_store_get_apps (store));
|
||||
@@ -1013,7 +1013,7 @@ gs_appstream_add_popular (GsPlugin *plugin,
|
||||
{
|
||||
g_autoptr(GPtrArray) array = NULL;
|
||||
|
||||
-#if AS_CHECK_VERSION(0,7,15)
|
||||
+#if AS_CHECK_VERSION(0,7,14)
|
||||
array = as_store_dup_apps (store);
|
||||
#else
|
||||
array = g_ptr_array_ref (as_store_get_apps (store));
|
||||
@@ -1059,7 +1059,7 @@ gs_appstream_add_recent (GsPlugin *plugin,
|
||||
{
|
||||
g_autoptr(GPtrArray) array = NULL;
|
||||
|
||||
-#if AS_CHECK_VERSION(0,7,15)
|
||||
+#if AS_CHECK_VERSION(0,7,14)
|
||||
array = as_store_dup_apps (store);
|
||||
#else
|
||||
array = g_ptr_array_ref (as_store_get_apps (store));
|
||||
@@ -1088,7 +1088,7 @@ gs_appstream_add_featured (GsPlugin *plugin,
|
||||
{
|
||||
g_autoptr(GPtrArray) array = NULL;
|
||||
|
||||
-#if AS_CHECK_VERSION(0,7,15)
|
||||
+#if AS_CHECK_VERSION(0,7,14)
|
||||
array = as_store_dup_apps (store);
|
||||
#else
|
||||
array = g_ptr_array_ref (as_store_get_apps (store));
|
||||
diff --git a/plugins/core/gs-plugin-appstream.c b/plugins/core/gs-plugin-appstream.c
|
||||
index 77d004162..ce0ca9bda 100644
|
||||
--- a/plugins/core/gs-plugin-appstream.c
|
||||
+++ b/plugins/core/gs-plugin-appstream.c
|
||||
@@ -56,7 +56,7 @@ gs_plugin_appstream_create_app_hash (AsStore *store)
|
||||
|
||||
hash = g_hash_table_new_full (g_str_hash, g_str_equal,
|
||||
g_free, (GDestroyNotify) g_object_unref);
|
||||
-#if AS_CHECK_VERSION(0,7,15)
|
||||
+#if AS_CHECK_VERSION(0,7,14)
|
||||
apps = as_store_dup_apps (store);
|
||||
#else
|
||||
apps = g_ptr_array_ref (as_store_get_apps (store));
|
||||
@@ -290,7 +290,7 @@ gs_plugin_setup (GsPlugin *plugin, GCancellable *cancellable, GError **error)
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
-#if AS_CHECK_VERSION(0,7,15)
|
||||
+#if AS_CHECK_VERSION(0,7,14)
|
||||
items = as_store_dup_apps (priv->store);
|
||||
#else
|
||||
items = g_ptr_array_ref (as_store_get_apps (priv->store));
|
||||
@@ -391,7 +391,7 @@ gs_plugin_refine_from_id (GsPlugin *plugin,
|
||||
g_autoptr(GPtrArray) apps_merge = NULL;
|
||||
|
||||
g_debug ("no app with ID %s found in system appstream", unique_id);
|
||||
-#if AS_CHECK_VERSION(0,7,15)
|
||||
+#if AS_CHECK_VERSION(0,7,14)
|
||||
apps = as_store_dup_apps (priv->store);
|
||||
#else
|
||||
apps = g_ptr_array_ref (as_store_get_apps (priv->store));
|
||||
@@ -405,7 +405,7 @@ gs_plugin_refine_from_id (GsPlugin *plugin,
|
||||
}
|
||||
|
||||
/* fall back to trying to get a merge app */
|
||||
-#if AS_CHECK_VERSION(0,7,15)
|
||||
+#if AS_CHECK_VERSION(0,7,14)
|
||||
apps_merge = as_store_dup_apps_by_id_merge (priv->store, gs_app_get_id (app));
|
||||
for (guint i = 0; i < apps_merge->len; i++) {
|
||||
item = g_ptr_array_index (apps_merge, i);
|
||||
@@ -472,7 +472,7 @@ gs_plugin_add_distro_upgrades (GsPlugin *plugin,
|
||||
g_autoptr(GPtrArray) array = NULL;
|
||||
|
||||
/* find any upgrades */
|
||||
-#if AS_CHECK_VERSION(0,7,15)
|
||||
+#if AS_CHECK_VERSION(0,7,14)
|
||||
array = as_store_dup_apps (priv->store);
|
||||
#else
|
||||
array = g_ptr_array_ref (as_store_get_apps (priv->store));
|
||||
@@ -620,7 +620,7 @@ gs_plugin_add_installed (GsPlugin *plugin,
|
||||
g_autoptr(GPtrArray) array = NULL;
|
||||
|
||||
/* search categories for the search term */
|
||||
-#if AS_CHECK_VERSION(0,7,15)
|
||||
+#if AS_CHECK_VERSION(0,7,14)
|
||||
array = as_store_dup_apps (priv->store);
|
||||
#else
|
||||
array = g_ptr_array_ref (as_store_get_apps (priv->store));
|
||||
diff --git a/plugins/flatpak/gs-flatpak.c b/plugins/flatpak/gs-flatpak.c
|
||||
index b835d843c..921fd12e9 100644
|
||||
--- a/plugins/flatpak/gs-flatpak.c
|
||||
+++ b/plugins/flatpak/gs-flatpak.c
|
||||
@@ -328,7 +328,7 @@ gs_flatpak_add_apps_from_xremote (GsFlatpak *self,
|
||||
}
|
||||
|
||||
/* override the *AppStream* origin */
|
||||
-#if AS_CHECK_VERSION(0,7,15)
|
||||
+#if AS_CHECK_VERSION(0,7,14)
|
||||
apps = as_store_dup_apps (store);
|
||||
#else
|
||||
apps = g_ptr_array_ref (as_store_get_apps (store));
|
||||
--
|
||||
2.19.1
|
||||
|
||||
|
|
@ -0,0 +1,50 @@
|
|||
From 96f516a4e01b00094919c6c365d804a109b5875f Mon Sep 17 00:00:00 2001
|
||||
From: Kalev Lember <klember@redhat.com>
|
||||
Date: Wed, 24 Oct 2018 15:00:59 +0200
|
||||
Subject: [PATCH] Lower as_utils_vercmp_full version check for Fedora
|
||||
|
||||
We have new as_utils_vercmp_full API backported to
|
||||
libappstream-glib-0.7.14-2.fc29.
|
||||
---
|
||||
lib/gs-plugin-loader.c | 2 +-
|
||||
src/gs-update-dialog.c | 4 ++--
|
||||
2 files changed, 3 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/lib/gs-plugin-loader.c b/lib/gs-plugin-loader.c
|
||||
index 93e394906..b84a0ba65 100644
|
||||
--- a/lib/gs-plugin-loader.c
|
||||
+++ b/lib/gs-plugin-loader.c
|
||||
@@ -1423,7 +1423,7 @@ gs_plugin_loader_app_sort_match_value_cb (GsApp *app1, GsApp *app2, gpointer use
|
||||
static gint
|
||||
gs_plugin_loader_app_sort_version_cb (GsApp *app1, GsApp *app2, gpointer user_data)
|
||||
{
|
||||
-#if AS_CHECK_VERSION(0,7,15)
|
||||
+#if AS_CHECK_VERSION(0,7,14)
|
||||
return as_utils_vercmp_full (gs_app_get_version (app1),
|
||||
gs_app_get_version (app2),
|
||||
AS_VERSION_COMPARE_FLAG_NONE);
|
||||
diff --git a/src/gs-update-dialog.c b/src/gs-update-dialog.c
|
||||
index b4c1b1187..e92cd5b87 100644
|
||||
--- a/src/gs-update-dialog.c
|
||||
+++ b/src/gs-update-dialog.c
|
||||
@@ -374,7 +374,7 @@ is_downgrade (const gchar *evr1,
|
||||
* part of the semantic version */
|
||||
|
||||
/* check version */
|
||||
-#if AS_CHECK_VERSION(0,7,15)
|
||||
+#if AS_CHECK_VERSION(0,7,14)
|
||||
rc = as_utils_vercmp_full (version1, version2,
|
||||
AS_VERSION_COMPARE_FLAG_NONE);
|
||||
#else
|
||||
@@ -384,7 +384,7 @@ is_downgrade (const gchar *evr1,
|
||||
return rc > 0;
|
||||
|
||||
/* check release */
|
||||
-#if AS_CHECK_VERSION(0,7,15)
|
||||
+#if AS_CHECK_VERSION(0,7,14)
|
||||
rc = as_utils_vercmp_full (version1, version2,
|
||||
AS_VERSION_COMPARE_FLAG_NONE);
|
||||
#else
|
||||
--
|
||||
2.19.1
|
||||
|
||||
File diff suppressed because it is too large
Load diff
123
0001-packagekit-Fix-progress-marshalling-for-upgrade_down.patch
Normal file
123
0001-packagekit-Fix-progress-marshalling-for-upgrade_down.patch
Normal file
|
|
@ -0,0 +1,123 @@
|
|||
From ece9a68becd6441d238f23acd2a1b156243fa7b6 Mon Sep 17 00:00:00 2001
|
||||
From: Kalev Lember <klember@redhat.com>
|
||||
Date: Tue, 7 May 2019 08:22:53 +0200
|
||||
Subject: [PATCH] packagekit: Fix progress marshalling for upgrade_download and
|
||||
refresh
|
||||
|
||||
The new GsPackageKitHelper class introduced in mega-commit 37103e6 only
|
||||
handled progress marshalling when downloading a list of packages, but
|
||||
not when the PK transaction is one big monolithic operation that only
|
||||
has a single GsApp associated, such as when downloading all of the
|
||||
distro upgrades, or when refreshing the cache.
|
||||
|
||||
This commit adds a way to explicitly add a GsApp to GsPackageKitHelper
|
||||
to use for marshalling progress in these cases.
|
||||
---
|
||||
plugins/packagekit/gs-packagekit-helper.c | 13 ++++++++++++-
|
||||
plugins/packagekit/gs-packagekit-helper.h | 3 +++
|
||||
plugins/packagekit/gs-plugin-packagekit-refresh.c | 2 +-
|
||||
plugins/packagekit/gs-plugin-packagekit-upgrade.c | 2 +-
|
||||
4 files changed, 17 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/plugins/packagekit/gs-packagekit-helper.c b/plugins/packagekit/gs-packagekit-helper.c
|
||||
index a292e0068..39c026c3e 100644
|
||||
--- a/plugins/packagekit/gs-packagekit-helper.c
|
||||
+++ b/plugins/packagekit/gs-packagekit-helper.c
|
||||
@@ -1,6 +1,7 @@
|
||||
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
|
||||
*
|
||||
* Copyright (C) 2016-2018 Richard Hughes <richard@hughsie.com>
|
||||
+ * Copyright (C) 2019 Kalev Lember <klember@redhat.com>
|
||||
*
|
||||
* Licensed under the GNU General Public License Version 2
|
||||
*
|
||||
@@ -29,6 +30,7 @@
|
||||
struct _GsPackagekitHelper {
|
||||
GObject parent_instance;
|
||||
GHashTable *apps;
|
||||
+ GsApp *progress_app;
|
||||
GsPlugin *plugin;
|
||||
};
|
||||
|
||||
@@ -43,7 +45,9 @@ gs_packagekit_helper_cb (PkProgress *progress, PkProgressType type, gpointer use
|
||||
GsApp *app = NULL;
|
||||
|
||||
/* optional */
|
||||
- if (package_id != NULL)
|
||||
+ if (self->progress_app != NULL)
|
||||
+ app = self->progress_app;
|
||||
+ else if (package_id != NULL)
|
||||
app = gs_packagekit_helper_get_app_by_id (self, package_id);
|
||||
|
||||
if (type == PK_PROGRESS_TYPE_STATUS) {
|
||||
@@ -79,6 +83,12 @@ gs_packagekit_helper_add_app (GsPackagekitHelper *self, GsApp *app)
|
||||
}
|
||||
}
|
||||
|
||||
+void
|
||||
+gs_packagekit_helper_set_progress_app (GsPackagekitHelper *self, GsApp *progress_app)
|
||||
+{
|
||||
+ g_set_object (&self->progress_app, progress_app);
|
||||
+}
|
||||
+
|
||||
GsPlugin *
|
||||
gs_packagekit_helper_get_plugin (GsPackagekitHelper *self)
|
||||
{
|
||||
@@ -104,6 +114,7 @@ gs_packagekit_helper_finalize (GObject *object)
|
||||
self = GS_PACKAGEKIT_HELPER (object);
|
||||
|
||||
g_object_unref (self->plugin);
|
||||
+ g_clear_object (&self->progress_app);
|
||||
g_hash_table_unref (self->apps);
|
||||
|
||||
G_OBJECT_CLASS (gs_packagekit_helper_parent_class)->finalize (object);
|
||||
diff --git a/plugins/packagekit/gs-packagekit-helper.h b/plugins/packagekit/gs-packagekit-helper.h
|
||||
index 3b5263c0a..b18b8229b 100644
|
||||
--- a/plugins/packagekit/gs-packagekit-helper.h
|
||||
+++ b/plugins/packagekit/gs-packagekit-helper.h
|
||||
@@ -1,6 +1,7 @@
|
||||
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
|
||||
*
|
||||
* Copyright (C) 2016-2018 Richard Hughes <richard@hughsie.com>
|
||||
+ * Copyright (C) 2019 Kalev Lember <klember@redhat.com>
|
||||
*
|
||||
* Licensed under the GNU General Public License Version 2
|
||||
*
|
||||
@@ -36,6 +37,8 @@ GsPackagekitHelper *gs_packagekit_helper_new (GsPlugin *plugin);
|
||||
GsPlugin *gs_packagekit_helper_get_plugin (GsPackagekitHelper *self);
|
||||
void gs_packagekit_helper_add_app (GsPackagekitHelper *self,
|
||||
GsApp *app);
|
||||
+void gs_packagekit_helper_set_progress_app (GsPackagekitHelper *self,
|
||||
+ GsApp *progress_app);
|
||||
GsApp *gs_packagekit_helper_get_app_by_id (GsPackagekitHelper *progress,
|
||||
const gchar *package_id);
|
||||
void gs_packagekit_helper_cb (PkProgress *progress,
|
||||
diff --git a/plugins/packagekit/gs-plugin-packagekit-refresh.c b/plugins/packagekit/gs-plugin-packagekit-refresh.c
|
||||
index ff893daaf..a8093de2c 100644
|
||||
--- a/plugins/packagekit/gs-plugin-packagekit-refresh.c
|
||||
+++ b/plugins/packagekit/gs-plugin-packagekit-refresh.c
|
||||
@@ -156,7 +156,7 @@ gs_plugin_refresh (GsPlugin *plugin,
|
||||
|
||||
/* refresh the metadata */
|
||||
gs_plugin_status_update (plugin, NULL, GS_PLUGIN_STATUS_WAITING);
|
||||
- gs_packagekit_helper_add_app (helper, app_dl);
|
||||
+ gs_packagekit_helper_set_progress_app (helper, app_dl);
|
||||
results = pk_client_refresh_cache (PK_CLIENT (priv->task),
|
||||
FALSE /* force */,
|
||||
cancellable,
|
||||
diff --git a/plugins/packagekit/gs-plugin-packagekit-upgrade.c b/plugins/packagekit/gs-plugin-packagekit-upgrade.c
|
||||
index 63175bec3..38de93d55 100644
|
||||
--- a/plugins/packagekit/gs-plugin-packagekit-upgrade.c
|
||||
+++ b/plugins/packagekit/gs-plugin-packagekit-upgrade.c
|
||||
@@ -77,7 +77,7 @@ gs_plugin_app_upgrade_download (GsPlugin *plugin,
|
||||
|
||||
/* ask PK to download enough packages to upgrade the system */
|
||||
gs_app_set_state (app, AS_APP_STATE_INSTALLING);
|
||||
- gs_packagekit_helper_add_app (helper, app);
|
||||
+ gs_packagekit_helper_set_progress_app (helper, app);
|
||||
results = pk_task_upgrade_system_sync (priv->task,
|
||||
gs_app_get_version (app),
|
||||
PK_UPGRADE_KIND_ENUM_COMPLETE,
|
||||
--
|
||||
2.21.0
|
||||
|
||||
|
|
@ -1,686 +0,0 @@
|
|||
From 0c79d9fb08a348a45a18f15427c945a63b44982e Mon Sep 17 00:00:00 2001
|
||||
Date: Mon, 24 Nov 2025 16:06:51 +0100
|
||||
Subject: [PATCH 1/3] flatpak: Fix XbSilo lifetime in
|
||||
gs_flatpak_refine_wildcard()
|
||||
|
||||
The function uses pre-cached data in the hash tables, consisting of XbNode-s
|
||||
from an XbSilo. The nodes are referenced, but the silos the node belongs to
|
||||
is not referenced (by the XbNode).
|
||||
|
||||
This change keeps the XbSilo alive as long as it's needed for the nodes
|
||||
in the pre-cached data. It also does not call gs_flatpak_ref_silo() multiple
|
||||
times for the same GsFlatpak instance, which could invalidate the XbNode-s
|
||||
in the pre-cached data when a change in the silo or in the installation
|
||||
had been received while the function was still processing the apps.
|
||||
|
||||
Related downstream bug https://bugzilla.redhat.com/show_bug.cgi?id=2416542
|
||||
Closes https://gitlab.gnome.org/GNOME/gnome-software/-/issues/2900
|
||||
---
|
||||
plugins/flatpak/gs-flatpak.c | 18 ++++++++---
|
||||
plugins/flatpak/gs-flatpak.h | 4 +++
|
||||
plugins/flatpak/gs-plugin-flatpak.c | 49 ++++++++++++++++++++---------
|
||||
3 files changed, 51 insertions(+), 20 deletions(-)
|
||||
|
||||
diff --git a/plugins/flatpak/gs-flatpak.c b/plugins/flatpak/gs-flatpak.c
|
||||
index b409475c7..a40ab54fb 100644
|
||||
--- a/plugins/flatpak/gs-flatpak.c
|
||||
+++ b/plugins/flatpak/gs-flatpak.c
|
||||
@@ -3748,16 +3748,19 @@ gboolean
|
||||
gs_flatpak_refine_wildcard (GsFlatpak *self, GsApp *app,
|
||||
GsAppList *list, GsPluginRefineRequireFlags require_flags,
|
||||
gboolean interactive,
|
||||
+ XbSilo **inout_silo,
|
||||
+ gchar **inout_silo_filename,
|
||||
+ GHashTable **inout_installed_by_desktopid,
|
||||
GHashTable **inout_components_by_id,
|
||||
GHashTable **inout_components_by_bundle,
|
||||
GCancellable *cancellable, GError **error)
|
||||
{
|
||||
const gchar *id;
|
||||
GPtrArray* components = NULL;
|
||||
+ XbSilo *silo;
|
||||
+ GHashTable *silo_installed_by_desktopid;
|
||||
+ const gchar *silo_filename;
|
||||
g_autoptr(GError) error_local = NULL;
|
||||
- g_autoptr(XbSilo) silo = NULL;
|
||||
- g_autoptr(GHashTable) silo_installed_by_desktopid = NULL;
|
||||
- g_autofree gchar *silo_filename = NULL;
|
||||
|
||||
GS_PROFILER_BEGIN_SCOPED (FlatpakRefineWildcard, "Flatpak (refine wildcard)", NULL);
|
||||
|
||||
@@ -3766,10 +3769,15 @@ gs_flatpak_refine_wildcard (GsFlatpak *self, GsApp *app,
|
||||
if (id == NULL)
|
||||
return TRUE;
|
||||
|
||||
- silo = gs_flatpak_ref_silo (self, interactive, &silo_filename, &silo_installed_by_desktopid, cancellable, error);
|
||||
- if (silo == NULL)
|
||||
+ if (*inout_silo == NULL)
|
||||
+ *inout_silo = gs_flatpak_ref_silo (self, interactive, inout_silo_filename, inout_installed_by_desktopid, cancellable, error);
|
||||
+ if (*inout_silo == NULL)
|
||||
return FALSE;
|
||||
|
||||
+ silo = *inout_silo;
|
||||
+ silo_filename = *inout_silo_filename;
|
||||
+ silo_installed_by_desktopid = *inout_installed_by_desktopid;
|
||||
+
|
||||
GS_PROFILER_BEGIN_SCOPED (FlatpakRefineWildcardQuerySilo, "Flatpak (query silo)", NULL);
|
||||
|
||||
if (*inout_components_by_id != NULL) {
|
||||
diff --git a/plugins/flatpak/gs-flatpak.h b/plugins/flatpak/gs-flatpak.h
|
||||
index 66ff59967..34e1416b5 100644
|
||||
--- a/plugins/flatpak/gs-flatpak.h
|
||||
+++ b/plugins/flatpak/gs-flatpak.h
|
||||
@@ -11,6 +11,7 @@
|
||||
|
||||
#include <gnome-software.h>
|
||||
#include <flatpak.h>
|
||||
+#include <xmlb.h>
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
@@ -108,6 +109,9 @@ gboolean gs_flatpak_refine_wildcard (GsFlatpak *self,
|
||||
GsAppList *list,
|
||||
GsPluginRefineRequireFlags require_flags,
|
||||
gboolean interactive,
|
||||
+ XbSilo **inout_silo,
|
||||
+ gchar **inout_silo_filename,
|
||||
+ GHashTable **inout_installed_by_desktopid,
|
||||
GHashTable **inout_components_by_id,
|
||||
GHashTable **inout_components_by_bundle,
|
||||
GCancellable *cancellable,
|
||||
diff --git a/plugins/flatpak/gs-plugin-flatpak.c b/plugins/flatpak/gs-plugin-flatpak.c
|
||||
index 3d0503d46..f5d4a1d67 100644
|
||||
--- a/plugins/flatpak/gs-plugin-flatpak.c
|
||||
+++ b/plugins/flatpak/gs-plugin-flatpak.c
|
||||
@@ -667,12 +667,29 @@ gs_plugin_flatpak_refine_app (GsPluginFlatpak *self,
|
||||
return gs_flatpak_refine_app (flatpak, app, require_flags, interactive, FALSE, event_callback, event_user_data, cancellable, error);
|
||||
}
|
||||
|
||||
+typedef struct {
|
||||
+ XbSilo *silo;
|
||||
+ gchar *silo_filename;
|
||||
+ GHashTable *installed_by_desktopid;
|
||||
+ GHashTable *components_by_id;
|
||||
+ GHashTable *components_by_bundle;
|
||||
+} RefineInstallationData;
|
||||
+
|
||||
static void
|
||||
-unref_nonnull_hash_table (gpointer ptr)
|
||||
+refine_installation_data_free (gpointer ptr)
|
||||
{
|
||||
- GHashTable *hash_table = ptr;
|
||||
- if (hash_table != NULL)
|
||||
- g_hash_table_unref (hash_table);
|
||||
+ RefineInstallationData *data = ptr;
|
||||
+
|
||||
+ if (data == NULL)
|
||||
+ return;
|
||||
+
|
||||
+ g_clear_pointer (&data->silo_filename, g_free);
|
||||
+ g_clear_pointer (&data->installed_by_desktopid, g_hash_table_unref);
|
||||
+ g_clear_pointer (&data->components_by_id, g_hash_table_unref);
|
||||
+ g_clear_pointer (&data->components_by_bundle, g_hash_table_unref);
|
||||
+ /* free the silo as the last, just in case, because the data from it is in the above hash tables */
|
||||
+ g_clear_object (&data->silo);
|
||||
+ g_free (data);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
@@ -761,8 +778,7 @@ refine_thread_cb (GTask *task,
|
||||
gboolean interactive = (data->job_flags & GS_PLUGIN_REFINE_FLAGS_INTERACTIVE) != 0;
|
||||
GsPluginEventCallback event_callback = data->event_callback;
|
||||
void *event_user_data = data->event_user_data;
|
||||
- g_autoptr(GPtrArray) array_components_by_id = NULL; /* (element-type GHashTable) */
|
||||
- g_autoptr(GPtrArray) array_components_by_bundle = NULL; /* (element-type GHashTable) */
|
||||
+ g_autoptr(GPtrArray) installation_data = NULL; /* (element-type RefineInstallationData) */
|
||||
g_autoptr(GsAppList) app_list = NULL;
|
||||
g_autoptr(GError) local_error = NULL;
|
||||
|
||||
@@ -783,10 +799,9 @@ refine_thread_cb (GTask *task,
|
||||
* (e.g. inserting an app in the list on every call results in
|
||||
* an infinite loop) */
|
||||
app_list = gs_app_list_copy (list);
|
||||
- array_components_by_id = g_ptr_array_new_full (self->installations->len, unref_nonnull_hash_table);
|
||||
- g_ptr_array_set_size (array_components_by_id, self->installations->len);
|
||||
- array_components_by_bundle = g_ptr_array_new_full (self->installations->len, unref_nonnull_hash_table);
|
||||
- g_ptr_array_set_size (array_components_by_bundle, self->installations->len);
|
||||
+
|
||||
+ installation_data = g_ptr_array_new_full (self->installations->len, refine_installation_data_free);
|
||||
+ g_ptr_array_set_size (installation_data, self->installations->len);
|
||||
|
||||
for (guint j = 0; j < gs_app_list_length (app_list); j++) {
|
||||
GsApp *app = gs_app_list_index (app_list, j);
|
||||
@@ -796,16 +811,20 @@ refine_thread_cb (GTask *task,
|
||||
|
||||
for (guint i = 0; i < self->installations->len; i++) {
|
||||
GsFlatpak *flatpak = g_ptr_array_index (self->installations, i);
|
||||
- GHashTable *components_by_id = array_components_by_id->pdata[i];
|
||||
- GHashTable *components_by_bundle = array_components_by_bundle->pdata[i];
|
||||
+ RefineInstallationData *inst_data = g_ptr_array_index (installation_data, i);
|
||||
+
|
||||
+ if (inst_data == NULL) {
|
||||
+ inst_data = g_new0 (RefineInstallationData, 1);
|
||||
+ installation_data->pdata[i] = inst_data;
|
||||
+ }
|
||||
|
||||
- if (!gs_flatpak_refine_wildcard (flatpak, app, list, require_flags, interactive, &components_by_id, &components_by_bundle,
|
||||
+ if (!gs_flatpak_refine_wildcard (flatpak, app, list, require_flags, interactive, &inst_data->silo,
|
||||
+ &inst_data->silo_filename, &inst_data->installed_by_desktopid,
|
||||
+ &inst_data->components_by_id, &inst_data->components_by_bundle,
|
||||
cancellable, &local_error)) {
|
||||
g_task_return_error (task, g_steal_pointer (&local_error));
|
||||
return;
|
||||
}
|
||||
- array_components_by_id->pdata[i] = components_by_id;
|
||||
- array_components_by_bundle->pdata[i] = components_by_bundle;
|
||||
}
|
||||
}
|
||||
|
||||
--
|
||||
GitLab
|
||||
|
||||
|
||||
From 546c6ee17b5959d2a696a6cb346a1f8b94aba303 Mon Sep 17 00:00:00 2001
|
||||
Date: Wed, 7 Jan 2026 18:37:52 +0100
|
||||
Subject: [PATCH 2/3] flatpak: Simplify wildcard app lookup function
|
||||
|
||||
By flipping the order of traversing app and installation the code
|
||||
can be simplified to not have too many in/out arguments.
|
||||
|
||||
Suggested by Philip Withnall
|
||||
---
|
||||
plugins/flatpak/gs-flatpak.c | 251 ++++++++++++++--------------
|
||||
plugins/flatpak/gs-flatpak.h | 9 +-
|
||||
plugins/flatpak/gs-plugin-flatpak.c | 61 +------
|
||||
3 files changed, 130 insertions(+), 191 deletions(-)
|
||||
|
||||
diff --git a/plugins/flatpak/gs-flatpak.c b/plugins/flatpak/gs-flatpak.c
|
||||
index a40ab54fb..782b0bb48 100644
|
||||
--- a/plugins/flatpak/gs-flatpak.c
|
||||
+++ b/plugins/flatpak/gs-flatpak.c
|
||||
@@ -3745,167 +3745,158 @@ gs_flatpak_refine_app (GsFlatpak *self,
|
||||
}
|
||||
|
||||
gboolean
|
||||
-gs_flatpak_refine_wildcard (GsFlatpak *self, GsApp *app,
|
||||
- GsAppList *list, GsPluginRefineRequireFlags require_flags,
|
||||
- gboolean interactive,
|
||||
- XbSilo **inout_silo,
|
||||
- gchar **inout_silo_filename,
|
||||
- GHashTable **inout_installed_by_desktopid,
|
||||
- GHashTable **inout_components_by_id,
|
||||
- GHashTable **inout_components_by_bundle,
|
||||
- GCancellable *cancellable, GError **error)
|
||||
+gs_flatpak_refine_wildcards (GsFlatpak *self,
|
||||
+ GPtrArray *wildcard_apps,
|
||||
+ GsAppList *list,
|
||||
+ GsPluginRefineRequireFlags require_flags,
|
||||
+ gboolean interactive,
|
||||
+ GCancellable *cancellable,
|
||||
+ GError **error)
|
||||
{
|
||||
- const gchar *id;
|
||||
- GPtrArray* components = NULL;
|
||||
- XbSilo *silo;
|
||||
- GHashTable *silo_installed_by_desktopid;
|
||||
- const gchar *silo_filename;
|
||||
g_autoptr(GError) error_local = NULL;
|
||||
+ g_autoptr(XbSilo) silo = NULL;
|
||||
+ g_autoptr(GHashTable) silo_installed_by_desktopid = NULL;
|
||||
+ g_autoptr(GHashTable) components_by_id = NULL;
|
||||
+ g_autoptr(GHashTable) components_by_bundle = NULL;
|
||||
+ g_autoptr(GPtrArray) components_with_id = NULL;
|
||||
+ g_autoptr(GPtrArray) bundles = NULL;
|
||||
+ g_autofree gchar *silo_filename = NULL;
|
||||
|
||||
GS_PROFILER_BEGIN_SCOPED (FlatpakRefineWildcard, "Flatpak (refine wildcard)", NULL);
|
||||
|
||||
- /* not enough info to find */
|
||||
- id = gs_app_get_id (app);
|
||||
- if (id == NULL)
|
||||
- return TRUE;
|
||||
-
|
||||
- if (*inout_silo == NULL)
|
||||
- *inout_silo = gs_flatpak_ref_silo (self, interactive, inout_silo_filename, inout_installed_by_desktopid, cancellable, error);
|
||||
- if (*inout_silo == NULL)
|
||||
+ silo = gs_flatpak_ref_silo (self, interactive, &silo_filename, &silo_installed_by_desktopid, cancellable, error);
|
||||
+ if (silo == NULL)
|
||||
return FALSE;
|
||||
|
||||
- silo = *inout_silo;
|
||||
- silo_filename = *inout_silo_filename;
|
||||
- silo_installed_by_desktopid = *inout_installed_by_desktopid;
|
||||
-
|
||||
GS_PROFILER_BEGIN_SCOPED (FlatpakRefineWildcardQuerySilo, "Flatpak (query silo)", NULL);
|
||||
|
||||
- if (*inout_components_by_id != NULL) {
|
||||
- components = g_hash_table_lookup (*inout_components_by_id, gs_app_get_id (app));
|
||||
- } else {
|
||||
- g_autoptr(GPtrArray) components_with_id = NULL;
|
||||
- *inout_components_by_id = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, (GDestroyNotify) g_ptr_array_unref);
|
||||
- components_with_id = xb_silo_query (silo, "components/component/id", 0, &error_local);
|
||||
- if (components_with_id == NULL) {
|
||||
- if (g_error_matches (error_local, G_IO_ERROR, G_IO_ERROR_NOT_FOUND))
|
||||
- return TRUE;
|
||||
- g_propagate_error (error, g_steal_pointer (&error_local));
|
||||
- return FALSE;
|
||||
+ components_by_id = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, (GDestroyNotify) g_ptr_array_unref);
|
||||
+ components_with_id = xb_silo_query (silo, "components/component/id", 0, &error_local);
|
||||
+ if (components_with_id == NULL) {
|
||||
+ if (g_error_matches (error_local, G_IO_ERROR, G_IO_ERROR_NOT_FOUND))
|
||||
+ return TRUE;
|
||||
+ g_propagate_error (error, g_steal_pointer (&error_local));
|
||||
+ return FALSE;
|
||||
+ }
|
||||
+
|
||||
+ for (guint i = 0; i < components_with_id->len; i++) {
|
||||
+ XbNode *node = g_ptr_array_index (components_with_id, i);
|
||||
+ XbNode *comp_node = xb_node_get_parent (node);
|
||||
+ const gchar *comp_id = xb_node_get_text (node);
|
||||
+ GPtrArray *comps = g_hash_table_lookup (components_by_id, comp_id);
|
||||
+ if (comps == NULL) {
|
||||
+ comps = g_ptr_array_new_with_free_func (g_object_unref);
|
||||
+ g_hash_table_insert (components_by_id, g_strdup (comp_id), comps);
|
||||
}
|
||||
- for (guint i = 0; i < components_with_id->len; i++) {
|
||||
- XbNode *node = g_ptr_array_index (components_with_id, i);
|
||||
- XbNode *comp_node = xb_node_get_parent (node);
|
||||
- const gchar *comp_id = xb_node_get_text (node);
|
||||
- GPtrArray *comps = g_hash_table_lookup (*inout_components_by_id, comp_id);
|
||||
- if (comps == NULL) {
|
||||
- comps = g_ptr_array_new_with_free_func (g_object_unref);
|
||||
- g_hash_table_insert (*inout_components_by_id, g_strdup (comp_id), comps);
|
||||
+ g_ptr_array_add (comps, comp_node);
|
||||
+ }
|
||||
+
|
||||
+ components_by_bundle = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_object_unref);
|
||||
+ bundles = xb_silo_query (silo, "/components/component/bundle[@type='flatpak']", 0, NULL);
|
||||
+ for (guint b = 0; bundles != NULL && b < bundles->len; b++) {
|
||||
+ XbNode *bundle_node = g_ptr_array_index (bundles, b);
|
||||
+ g_autoptr(XbNode) component_node = xb_node_get_parent (bundle_node);
|
||||
+ g_autoptr(XbNode) components_node = xb_node_get_parent (component_node);
|
||||
+ const gchar *origin = xb_node_get_attr (components_node, "origin");
|
||||
+ if (origin != NULL) {
|
||||
+ const gchar *bundle = xb_node_get_text (bundle_node);
|
||||
+ if (bundle != NULL) {
|
||||
+ g_autofree gchar *key = g_strconcat (origin, "\n", bundle, NULL);
|
||||
+ g_hash_table_insert (components_by_bundle, g_steal_pointer (&key), g_steal_pointer (&component_node));
|
||||
}
|
||||
- g_ptr_array_add (comps, comp_node);
|
||||
- if (components == NULL && g_strcmp0 (id, comp_id) == 0)
|
||||
- components = comps;
|
||||
}
|
||||
}
|
||||
|
||||
GS_PROFILER_END_SCOPED (FlatpakRefineWildcardQuerySilo);
|
||||
|
||||
- if (components == NULL)
|
||||
- return TRUE;
|
||||
-
|
||||
gs_flatpak_ensure_remote_title (self, interactive, cancellable);
|
||||
|
||||
- if (*inout_components_by_bundle == NULL) {
|
||||
- g_autoptr(GPtrArray) bundles = NULL;
|
||||
-
|
||||
- *inout_components_by_bundle = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_object_unref);
|
||||
- bundles = xb_silo_query (silo, "/components/component/bundle[@type='flatpak']", 0, NULL);
|
||||
- for (guint b = 0; bundles != NULL && b < bundles->len; b++) {
|
||||
- XbNode *bundle_node = g_ptr_array_index (bundles, b);
|
||||
- g_autoptr(XbNode) component_node = xb_node_get_parent (bundle_node);
|
||||
- g_autoptr(XbNode) components_node = xb_node_get_parent (component_node);
|
||||
- const gchar *origin = xb_node_get_attr (components_node, "origin");
|
||||
- if (origin != NULL) {
|
||||
- const gchar *bundle = xb_node_get_text (bundle_node);
|
||||
- if (bundle != NULL) {
|
||||
- g_autofree gchar *key = g_strconcat (origin, "\n", bundle, NULL);
|
||||
- g_hash_table_insert (*inout_components_by_bundle, g_steal_pointer (&key), g_steal_pointer (&component_node));
|
||||
- }
|
||||
- }
|
||||
- }
|
||||
- }
|
||||
+ for (guint j = 0; j < wildcard_apps->len; j++) {
|
||||
+ GsApp *app = g_ptr_array_index (wildcard_apps, j);
|
||||
+ GPtrArray *components = NULL;
|
||||
+ const gchar *id;
|
||||
|
||||
+ /* not enough info to find */
|
||||
+ id = gs_app_get_id (app);
|
||||
+ if (id == NULL)
|
||||
+ continue;
|
||||
|
||||
- GS_PROFILER_BEGIN_SCOPED (FlatpakRefineWildcardGenerateApps, "Flatpak (create app)", NULL);
|
||||
- for (guint i = 0; i < components->len; i++) {
|
||||
- XbNode *component = g_ptr_array_index (components, i);
|
||||
- g_autoptr(GsApp) new = NULL;
|
||||
+ components = g_hash_table_lookup (components_by_id, id);
|
||||
+ if (components == NULL)
|
||||
+ continue;
|
||||
|
||||
- GS_PROFILER_BEGIN_SCOPED (FlatpakRefineWildcardCreateAppstreamApp, "Flatpak (create Appstream app)", NULL);
|
||||
- new = gs_appstream_create_app (self->plugin, silo, component, silo_filename ? silo_filename : "",
|
||||
- self->scope, error);
|
||||
- GS_PROFILER_END_SCOPED (FlatpakRefineWildcardCreateAppstreamApp);
|
||||
+ GS_PROFILER_BEGIN_SCOPED (FlatpakRefineWildcardGenerateApps, "Flatpak (create app)", NULL);
|
||||
+ for (guint i = 0; i < components->len; i++) {
|
||||
+ XbNode *component = g_ptr_array_index (components, i);
|
||||
+ g_autoptr(GsApp) new = NULL;
|
||||
|
||||
- if (new == NULL)
|
||||
- return FALSE;
|
||||
+ GS_PROFILER_BEGIN_SCOPED (FlatpakRefineWildcardCreateAppstreamApp, "Flatpak (create Appstream app)", NULL);
|
||||
+ new = gs_appstream_create_app (self->plugin, silo, component, silo_filename ? silo_filename : "",
|
||||
+ self->scope, error);
|
||||
+ GS_PROFILER_END_SCOPED (FlatpakRefineWildcardCreateAppstreamApp);
|
||||
|
||||
- gs_flatpak_claim_app (self, new);
|
||||
-
|
||||
- /* The appstream plugin did not find the component in the plugin's cache,
|
||||
- thus read the required info from the 'bundle' element. */
|
||||
- if (gs_flatpak_app_get_ref_name (new) == NULL ||
|
||||
- gs_flatpak_app_get_ref_arch (new) == NULL) {
|
||||
- const gchar *xref_str = NULL;
|
||||
- g_autoptr(XbNode) child = NULL;
|
||||
- g_autoptr(XbNode) next = NULL;
|
||||
- for (child = xb_node_get_child (component); child != NULL && xref_str == NULL;
|
||||
- g_object_unref (child), child = g_steal_pointer (&next)) {
|
||||
- next = xb_node_get_next (child);
|
||||
- if (g_strcmp0 (xb_node_get_element (child), "bundle") == 0 &&
|
||||
- g_strcmp0 (xb_node_get_attr (child, "type"), "flatpak") == 0) {
|
||||
- xref_str = xb_node_get_text (child);
|
||||
- break;
|
||||
+ if (new == NULL)
|
||||
+ return FALSE;
|
||||
+
|
||||
+ gs_flatpak_claim_app (self, new);
|
||||
+
|
||||
+ /* The appstream plugin did not find the component in the plugin's cache,
|
||||
+ thus read the required info from the 'bundle' element. */
|
||||
+ if (gs_flatpak_app_get_ref_name (new) == NULL ||
|
||||
+ gs_flatpak_app_get_ref_arch (new) == NULL) {
|
||||
+ const gchar *xref_str = NULL;
|
||||
+ g_autoptr(XbNode) child = NULL;
|
||||
+ g_autoptr(XbNode) next = NULL;
|
||||
+ for (child = xb_node_get_child (component); child != NULL && xref_str == NULL;
|
||||
+ g_object_unref (child), child = g_steal_pointer (&next)) {
|
||||
+ next = xb_node_get_next (child);
|
||||
+ if (g_strcmp0 (xb_node_get_element (child), "bundle") == 0 &&
|
||||
+ g_strcmp0 (xb_node_get_attr (child, "type"), "flatpak") == 0) {
|
||||
+ xref_str = xb_node_get_text (child);
|
||||
+ break;
|
||||
+ }
|
||||
}
|
||||
- }
|
||||
- if (xref_str != NULL) {
|
||||
- g_auto(GStrv) split = NULL;
|
||||
-
|
||||
- /* get the kind/name/arch/branch */
|
||||
- split = g_strsplit (xref_str, "/", -1);
|
||||
- if (g_strv_length (split) == 4) {
|
||||
- const gchar *comp_type = xb_node_get_attr (component, "type");
|
||||
- AsComponentKind kind = as_component_kind_from_string (comp_type);
|
||||
- if (kind != AS_COMPONENT_KIND_UNKNOWN)
|
||||
- gs_app_set_kind (new, kind);
|
||||
- else if (g_ascii_strcasecmp (split[0], "app") == 0)
|
||||
- gs_app_set_kind (new, AS_COMPONENT_KIND_DESKTOP_APP);
|
||||
- else if (g_ascii_strcasecmp (split[0], "runtime") == 0)
|
||||
- gs_flatpak_set_runtime_kind_from_id (new);
|
||||
- gs_flatpak_app_set_ref_name (new, split[1]);
|
||||
- gs_flatpak_app_set_ref_arch (new, split[2]);
|
||||
- gs_app_set_branch (new, split[3]);
|
||||
- gs_app_set_metadata (new, "GnomeSoftware::packagename-value", xref_str);
|
||||
+ if (xref_str != NULL) {
|
||||
+ g_auto(GStrv) split = NULL;
|
||||
+
|
||||
+ /* get the kind/name/arch/branch */
|
||||
+ split = g_strsplit (xref_str, "/", -1);
|
||||
+ if (g_strv_length (split) == 4) {
|
||||
+ const gchar *comp_type = xb_node_get_attr (component, "type");
|
||||
+ AsComponentKind kind = as_component_kind_from_string (comp_type);
|
||||
+ if (kind != AS_COMPONENT_KIND_UNKNOWN)
|
||||
+ gs_app_set_kind (new, kind);
|
||||
+ else if (g_ascii_strcasecmp (split[0], "app") == 0)
|
||||
+ gs_app_set_kind (new, AS_COMPONENT_KIND_DESKTOP_APP);
|
||||
+ else if (g_ascii_strcasecmp (split[0], "runtime") == 0)
|
||||
+ gs_flatpak_set_runtime_kind_from_id (new);
|
||||
+ gs_flatpak_app_set_ref_name (new, split[1]);
|
||||
+ gs_flatpak_app_set_ref_arch (new, split[2]);
|
||||
+ gs_app_set_branch (new, split[3]);
|
||||
+ gs_app_set_metadata (new, "GnomeSoftware::packagename-value", xref_str);
|
||||
+ }
|
||||
}
|
||||
}
|
||||
- }
|
||||
|
||||
- if (gs_flatpak_app_get_ref_name (new) == NULL ||
|
||||
- gs_flatpak_app_get_ref_arch (new) == NULL) {
|
||||
- g_debug ("Failed to get ref info for '%s' from wildcard '%s', skipping it...", gs_app_get_id (new), id);
|
||||
- } else {
|
||||
- GS_PROFILER_BEGIN_SCOPED (FlatpakRefineWildcardRefineNewApp, "Flatpak (refine new app)", NULL);
|
||||
- if (!gs_flatpak_refine_app_internal (self, new, require_flags, interactive, FALSE, *inout_components_by_bundle,
|
||||
- silo, silo_filename, silo_installed_by_desktopid, cancellable, error))
|
||||
- return FALSE;
|
||||
- GS_PROFILER_END_SCOPED (FlatpakRefineWildcardRefineNewApp);
|
||||
+ if (gs_flatpak_app_get_ref_name (new) == NULL ||
|
||||
+ gs_flatpak_app_get_ref_arch (new) == NULL) {
|
||||
+ g_debug ("Failed to get ref info for '%s' from wildcard '%s', skipping it...", gs_app_get_id (new), id);
|
||||
+ } else {
|
||||
+ GS_PROFILER_BEGIN_SCOPED (FlatpakRefineWildcardRefineNewApp, "Flatpak (refine new app)", NULL);
|
||||
+ if (!gs_flatpak_refine_app_internal (self, new, require_flags, interactive, FALSE, components_by_bundle,
|
||||
+ silo, silo_filename, silo_installed_by_desktopid, cancellable, error))
|
||||
+ return FALSE;
|
||||
+ GS_PROFILER_END_SCOPED (FlatpakRefineWildcardRefineNewApp);
|
||||
|
||||
- GS_PROFILER_BEGIN_SCOPED (FlatpakRefineWildcardSubsumeMetadata, "Flatpak (subsume metadata)", NULL);
|
||||
- gs_app_subsume_metadata (new, app);
|
||||
- GS_PROFILER_END_SCOPED (FlatpakRefineWildcardSubsumeMetadata);
|
||||
+ GS_PROFILER_BEGIN_SCOPED (FlatpakRefineWildcardSubsumeMetadata, "Flatpak (subsume metadata)", NULL);
|
||||
+ gs_app_subsume_metadata (new, app);
|
||||
+ GS_PROFILER_END_SCOPED (FlatpakRefineWildcardSubsumeMetadata);
|
||||
|
||||
- gs_app_list_add (list, new);
|
||||
+ gs_app_list_add (list, new);
|
||||
+ }
|
||||
}
|
||||
+ GS_PROFILER_END_SCOPED (FlatpakRefineWildcardGenerateApps);
|
||||
}
|
||||
- GS_PROFILER_END_SCOPED (FlatpakRefineWildcardGenerateApps);
|
||||
|
||||
GS_PROFILER_END_SCOPED (FlatpakRefineWildcard);
|
||||
|
||||
diff --git a/plugins/flatpak/gs-flatpak.h b/plugins/flatpak/gs-flatpak.h
|
||||
index 34e1416b5..1f7d35a8f 100644
|
||||
--- a/plugins/flatpak/gs-flatpak.h
|
||||
+++ b/plugins/flatpak/gs-flatpak.h
|
||||
@@ -104,16 +104,11 @@ gboolean gs_flatpak_refine_app_state (GsFlatpak *self,
|
||||
void *event_user_data,
|
||||
GCancellable *cancellable,
|
||||
GError **error);
|
||||
-gboolean gs_flatpak_refine_wildcard (GsFlatpak *self,
|
||||
- GsApp *app,
|
||||
+gboolean gs_flatpak_refine_wildcards (GsFlatpak *self,
|
||||
+ GPtrArray *wildcard_apps,
|
||||
GsAppList *list,
|
||||
GsPluginRefineRequireFlags require_flags,
|
||||
gboolean interactive,
|
||||
- XbSilo **inout_silo,
|
||||
- gchar **inout_silo_filename,
|
||||
- GHashTable **inout_installed_by_desktopid,
|
||||
- GHashTable **inout_components_by_id,
|
||||
- GHashTable **inout_components_by_bundle,
|
||||
GCancellable *cancellable,
|
||||
GError **error);
|
||||
gboolean gs_flatpak_launch (GsFlatpak *self,
|
||||
diff --git a/plugins/flatpak/gs-plugin-flatpak.c b/plugins/flatpak/gs-plugin-flatpak.c
|
||||
index f5d4a1d67..c06b1fb5f 100644
|
||||
--- a/plugins/flatpak/gs-plugin-flatpak.c
|
||||
+++ b/plugins/flatpak/gs-plugin-flatpak.c
|
||||
@@ -667,31 +667,6 @@ gs_plugin_flatpak_refine_app (GsPluginFlatpak *self,
|
||||
return gs_flatpak_refine_app (flatpak, app, require_flags, interactive, FALSE, event_callback, event_user_data, cancellable, error);
|
||||
}
|
||||
|
||||
-typedef struct {
|
||||
- XbSilo *silo;
|
||||
- gchar *silo_filename;
|
||||
- GHashTable *installed_by_desktopid;
|
||||
- GHashTable *components_by_id;
|
||||
- GHashTable *components_by_bundle;
|
||||
-} RefineInstallationData;
|
||||
-
|
||||
-static void
|
||||
-refine_installation_data_free (gpointer ptr)
|
||||
-{
|
||||
- RefineInstallationData *data = ptr;
|
||||
-
|
||||
- if (data == NULL)
|
||||
- return;
|
||||
-
|
||||
- g_clear_pointer (&data->silo_filename, g_free);
|
||||
- g_clear_pointer (&data->installed_by_desktopid, g_hash_table_unref);
|
||||
- g_clear_pointer (&data->components_by_id, g_hash_table_unref);
|
||||
- g_clear_pointer (&data->components_by_bundle, g_hash_table_unref);
|
||||
- /* free the silo as the last, just in case, because the data from it is in the above hash tables */
|
||||
- g_clear_object (&data->silo);
|
||||
- g_free (data);
|
||||
-}
|
||||
-
|
||||
static gboolean
|
||||
refine_app (GsPluginFlatpak *self,
|
||||
GsApp *app,
|
||||
@@ -778,8 +753,7 @@ refine_thread_cb (GTask *task,
|
||||
gboolean interactive = (data->job_flags & GS_PLUGIN_REFINE_FLAGS_INTERACTIVE) != 0;
|
||||
GsPluginEventCallback event_callback = data->event_callback;
|
||||
void *event_user_data = data->event_user_data;
|
||||
- g_autoptr(GPtrArray) installation_data = NULL; /* (element-type RefineInstallationData) */
|
||||
- g_autoptr(GsAppList) app_list = NULL;
|
||||
+ g_autoptr(GPtrArray) wildcard_apps = g_ptr_array_new_with_free_func (g_object_unref); /* (element-type GsApp) (owned) */
|
||||
g_autoptr(GError) local_error = NULL;
|
||||
|
||||
assert_in_worker (self);
|
||||
@@ -790,38 +764,17 @@ refine_thread_cb (GTask *task,
|
||||
g_task_return_error (task, g_steal_pointer (&local_error));
|
||||
return;
|
||||
}
|
||||
- }
|
||||
-
|
||||
- /* Refine wildcards.
|
||||
- *
|
||||
- * Use a copy of the list for the loop because a function called
|
||||
- * on the plugin may affect the list which can lead to problems
|
||||
- * (e.g. inserting an app in the list on every call results in
|
||||
- * an infinite loop) */
|
||||
- app_list = gs_app_list_copy (list);
|
||||
-
|
||||
- installation_data = g_ptr_array_new_full (self->installations->len, refine_installation_data_free);
|
||||
- g_ptr_array_set_size (installation_data, self->installations->len);
|
||||
-
|
||||
- for (guint j = 0; j < gs_app_list_length (app_list); j++) {
|
||||
- GsApp *app = gs_app_list_index (app_list, j);
|
||||
|
||||
- if (!gs_app_has_quirk (app, GS_APP_QUIRK_IS_WILDCARD))
|
||||
- continue;
|
||||
+ if (gs_app_has_quirk (app, GS_APP_QUIRK_IS_WILDCARD) && gs_app_get_id (app) != NULL)
|
||||
+ g_ptr_array_add (wildcard_apps, g_object_ref (app));
|
||||
+ }
|
||||
|
||||
+ /* Refine wildcards. */
|
||||
+ if (wildcard_apps->len > 0) {
|
||||
for (guint i = 0; i < self->installations->len; i++) {
|
||||
GsFlatpak *flatpak = g_ptr_array_index (self->installations, i);
|
||||
- RefineInstallationData *inst_data = g_ptr_array_index (installation_data, i);
|
||||
-
|
||||
- if (inst_data == NULL) {
|
||||
- inst_data = g_new0 (RefineInstallationData, 1);
|
||||
- installation_data->pdata[i] = inst_data;
|
||||
- }
|
||||
|
||||
- if (!gs_flatpak_refine_wildcard (flatpak, app, list, require_flags, interactive, &inst_data->silo,
|
||||
- &inst_data->silo_filename, &inst_data->installed_by_desktopid,
|
||||
- &inst_data->components_by_id, &inst_data->components_by_bundle,
|
||||
- cancellable, &local_error)) {
|
||||
+ if (!gs_flatpak_refine_wildcards (flatpak, wildcard_apps, list, require_flags, interactive, cancellable, &local_error)) {
|
||||
g_task_return_error (task, g_steal_pointer (&local_error));
|
||||
return;
|
||||
}
|
||||
--
|
||||
GitLab
|
||||
|
||||
|
||||
From 8472d717356a801e6c0171156738ea48480fa695 Mon Sep 17 00:00:00 2001
|
||||
Date: Wed, 7 Jan 2026 18:45:47 +0100
|
||||
Subject: [PATCH 3/3] flatpak: Hold silo lock when refining wildcard apps
|
||||
|
||||
The refine can take a long time, thus hold the silo lock to not have
|
||||
it invalidated from another thread. Object reference is not enough
|
||||
for the XbSilo, it breaks as soon as the underlying file changes.
|
||||
---
|
||||
plugins/flatpak/gs-flatpak.c | 16 +++++++++++-----
|
||||
1 file changed, 11 insertions(+), 5 deletions(-)
|
||||
|
||||
diff --git a/plugins/flatpak/gs-flatpak.c b/plugins/flatpak/gs-flatpak.c
|
||||
index 782b0bb48..c5437125d 100644
|
||||
--- a/plugins/flatpak/gs-flatpak.c
|
||||
+++ b/plugins/flatpak/gs-flatpak.c
|
||||
@@ -59,7 +59,7 @@ struct _GsFlatpak {
|
||||
AsComponentScope scope;
|
||||
GsPlugin *plugin;
|
||||
XbSilo *silo;
|
||||
- GMutex silo_lock;
|
||||
+ GRecMutex silo_lock;
|
||||
gchar *silo_filename;
|
||||
GHashTable *silo_installed_by_desktopid;
|
||||
gint silo_change_stamp;
|
||||
@@ -1187,11 +1187,11 @@ gs_flatpak_ref_silo (GsFlatpak *self,
|
||||
g_autoptr(GFile) file = NULL;
|
||||
g_autoptr(GPtrArray) xremotes = NULL;
|
||||
g_autoptr(GPtrArray) desktop_paths = NULL;
|
||||
- g_autoptr(GMutexLocker) locker = NULL;
|
||||
+ g_autoptr(GRecMutexLocker) locker = NULL;
|
||||
g_autoptr(XbBuilder) builder = NULL;
|
||||
g_autoptr(GMainContext) old_thread_default = NULL;
|
||||
|
||||
- locker = g_mutex_locker_new (&self->silo_lock);
|
||||
+ locker = g_rec_mutex_locker_new (&self->silo_lock);
|
||||
/* everything is okay */
|
||||
if (self->silo != NULL && xb_silo_is_valid (self->silo) &&
|
||||
g_atomic_int_get (&self->silo_change_stamp_current) == g_atomic_int_get (&self->silo_change_stamp)) {
|
||||
@@ -3754,6 +3754,7 @@ gs_flatpak_refine_wildcards (GsFlatpak *self,
|
||||
GError **error)
|
||||
{
|
||||
g_autoptr(GError) error_local = NULL;
|
||||
+ g_autoptr(GRecMutexLocker) silo_locker = NULL;
|
||||
g_autoptr(XbSilo) silo = NULL;
|
||||
g_autoptr(GHashTable) silo_installed_by_desktopid = NULL;
|
||||
g_autoptr(GHashTable) components_by_id = NULL;
|
||||
@@ -3764,6 +3765,11 @@ gs_flatpak_refine_wildcards (GsFlatpak *self,
|
||||
|
||||
GS_PROFILER_BEGIN_SCOPED (FlatpakRefineWildcard, "Flatpak (refine wildcard)", NULL);
|
||||
|
||||
+ /* the refine can take a long time, thus hold the silo lock to not have
|
||||
+ it invalidated from another thread; object reference is not enough
|
||||
+ for the XbSilo, it breaks as soon as the underlying file changes */
|
||||
+ silo_locker = g_rec_mutex_locker_new (&self->silo_lock);
|
||||
+
|
||||
silo = gs_flatpak_ref_silo (self, interactive, &silo_filename, &silo_installed_by_desktopid, cancellable, error);
|
||||
if (silo == NULL)
|
||||
return FALSE;
|
||||
@@ -4810,7 +4816,7 @@ gs_flatpak_finalize (GObject *object)
|
||||
g_object_unref (self->plugin);
|
||||
g_hash_table_unref (self->broken_remotes);
|
||||
g_mutex_clear (&self->broken_remotes_mutex);
|
||||
- g_mutex_clear (&self->silo_lock);
|
||||
+ g_rec_mutex_clear (&self->silo_lock);
|
||||
g_hash_table_unref (self->app_silos);
|
||||
g_mutex_clear (&self->app_silos_mutex);
|
||||
g_clear_pointer (&self->remote_title, g_hash_table_unref);
|
||||
@@ -4831,7 +4837,7 @@ gs_flatpak_init (GsFlatpak *self)
|
||||
{
|
||||
/* XbSilo needs external locking as we destroy the silo and build a new
|
||||
* one when something changes */
|
||||
- g_mutex_init (&self->silo_lock);
|
||||
+ g_rec_mutex_init (&self->silo_lock);
|
||||
|
||||
g_mutex_init (&self->installed_refs_mutex);
|
||||
self->installed_refs = NULL;
|
||||
--
|
||||
GitLab
|
||||
|
||||
1
dnf5-plugin/.gitignore
vendored
1
dnf5-plugin/.gitignore
vendored
|
|
@ -1 +0,0 @@
|
|||
checkout-gs-dnf5
|
||||
|
|
@ -1,35 +0,0 @@
|
|||
#!/bin/bash
|
||||
|
||||
if [ ! -d checkout-gs-dnf5 ]; then
|
||||
git clone --branch main https://gitlab.gnome.org/mcrha/gnome-software.git checkout-gs-dnf5 && \
|
||||
cd checkout-gs-dnf5 && \
|
||||
git checkout -b wip/dnf5daemon origin/wip/dnf5daemon && \
|
||||
cd - >/dev/null
|
||||
|
||||
if [ "$?" != "0" ]; then
|
||||
echo "Failed to clone dnf5-plugin repository" 1>&2
|
||||
exit 1;
|
||||
fi
|
||||
fi
|
||||
|
||||
PATCH_PATH=../0001-dnf5-plugin.patch
|
||||
|
||||
cd checkout-gs-dnf5 && \
|
||||
echo "Updating gs-dnf5 git 'main' repository" && \
|
||||
git checkout main && \
|
||||
git pull --rebase && \
|
||||
echo "Updating gs-dnf5 git 'dnf5-pugin' repository" && \
|
||||
git checkout wip/dnf5daemon && \
|
||||
git pull --rebase && \
|
||||
echo -n "at " >../${PATCH_PATH} && \
|
||||
git log HEAD | head -n 5 | grep -E "commit|Date" >>../${PATCH_PATH} && \
|
||||
echo "" >>../${PATCH_PATH} && \
|
||||
git diff main >>../${PATCH_PATH} && \
|
||||
cd - >/dev/null
|
||||
|
||||
if [ "$?" = "0" ]; then
|
||||
echo "Patch '${PATCH_PATH}' updated"
|
||||
else
|
||||
echo "Failed to update patch '${PATCH_PATH}'" 1>&2
|
||||
exit 1
|
||||
fi
|
||||
473
gnome-software-3-30-error-message-fixes.patch
Normal file
473
gnome-software-3-30-error-message-fixes.patch
Normal file
|
|
@ -0,0 +1,473 @@
|
|||
From 0a1e76d866379ce6115aacd2cdee75db15bebab0 Mon Sep 17 00:00:00 2001
|
||||
From: Kalev Lember <klember@redhat.com>
|
||||
Date: Tue, 15 Jan 2019 23:48:33 +0100
|
||||
Subject: [PATCH 1/3] shell: Improve the error message when whole update
|
||||
operation fails
|
||||
|
||||
In case the whole updates operation fails and we don't have the data
|
||||
which app failed, show 'Unable to install updates' error instead of
|
||||
'Unable to update "(null)"'.
|
||||
|
||||
Fixes: https://gitlab.gnome.org/GNOME/gnome-software/issues/480
|
||||
---
|
||||
src/gs-shell.c | 120 +++++++++++++++++++++++++++++++++++--------------
|
||||
1 file changed, 87 insertions(+), 33 deletions(-)
|
||||
|
||||
diff --git a/src/gs-shell.c b/src/gs-shell.c
|
||||
index 6f1cda816..7c2f86d81 100644
|
||||
--- a/src/gs-shell.c
|
||||
+++ b/src/gs-shell.c
|
||||
@@ -1355,23 +1355,34 @@ gs_shell_show_event_update (GsShell *shell, GsPluginEvent *event)
|
||||
g_autofree gchar *str_origin = NULL;
|
||||
g_autoptr(GString) str = g_string_new (NULL);
|
||||
|
||||
- str_app = gs_shell_get_title_from_app (app);
|
||||
switch (error->code) {
|
||||
case GS_PLUGIN_ERROR_DOWNLOAD_FAILED:
|
||||
- if (origin != NULL) {
|
||||
+ if (app != NULL && origin != NULL) {
|
||||
+ str_app = gs_shell_get_title_from_app (app);
|
||||
str_origin = gs_shell_get_title_from_origin (origin);
|
||||
/* TRANSLATORS: failure text for the in-app notification,
|
||||
* where the first %s is the app name (e.g. "GIMP") and
|
||||
* the second %s is the origin, e.g. "Fedora" or
|
||||
* "Fedora Project [fedoraproject.org]" */
|
||||
- g_string_append_printf (str, _("Unable to update %s from %s"),
|
||||
+ g_string_append_printf (str, _("Unable to update %s from %s as download failed"),
|
||||
str_app, str_origin);
|
||||
buttons = TRUE;
|
||||
- } else {
|
||||
+ } else if (app != NULL) {
|
||||
+ str_app = gs_shell_get_title_from_app (app);
|
||||
/* TRANSLATORS: failure text for the in-app notification,
|
||||
* where the %s is the application name (e.g. "GIMP") */
|
||||
g_string_append_printf (str, _("Unable to update %s as download failed"),
|
||||
str_app);
|
||||
+ } else if (origin != NULL) {
|
||||
+ str_origin = gs_shell_get_title_from_origin (origin);
|
||||
+ /* TRANSLATORS: failure text for the in-app notification,
|
||||
+ * where the %s is the origin, e.g. "Fedora" or
|
||||
+ * "Fedora Project [fedoraproject.org]" */
|
||||
+ g_string_append_printf (str, _("Unable to install updates from %s as download failed"),
|
||||
+ str_origin);
|
||||
+ } else {
|
||||
+ /* TRANSLATORS: failure text for the in-app notification */
|
||||
+ g_string_append_printf (str, _("Unable to install updates as download failed"));
|
||||
}
|
||||
break;
|
||||
case GS_PLUGIN_ERROR_NO_NETWORK:
|
||||
@@ -1382,49 +1393,92 @@ gs_shell_show_event_update (GsShell *shell, GsPluginEvent *event)
|
||||
buttons |= GS_SHELL_EVENT_BUTTON_NETWORK_SETTINGS;
|
||||
break;
|
||||
case GS_PLUGIN_ERROR_NO_SPACE:
|
||||
- /* TRANSLATORS: failure text for the in-app notification,
|
||||
- * where the %s is the application name (e.g. "GIMP") */
|
||||
- g_string_append_printf (str, _("Unable to update %s: "
|
||||
- "not enough disk space"),
|
||||
- str_app);
|
||||
+ if (app != NULL) {
|
||||
+ str_app = gs_shell_get_title_from_app (app);
|
||||
+ /* TRANSLATORS: failure text for the in-app notification,
|
||||
+ * where the %s is the application name (e.g. "GIMP") */
|
||||
+ g_string_append_printf (str, _("Unable to update %s: "
|
||||
+ "not enough disk space"),
|
||||
+ str_app);
|
||||
+ } else {
|
||||
+ /* TRANSLATORS: failure text for the in-app notification */
|
||||
+ g_string_append_printf (str, _("Unable to install updates: "
|
||||
+ "not enough disk space"));
|
||||
+ }
|
||||
buttons |= GS_SHELL_EVENT_BUTTON_NO_SPACE;
|
||||
break;
|
||||
case GS_PLUGIN_ERROR_AUTH_REQUIRED:
|
||||
case GS_PLUGIN_ERROR_PIN_REQUIRED:
|
||||
- /* TRANSLATORS: failure text for the in-app notification,
|
||||
- * where the %s is the application name (e.g. "GIMP") */
|
||||
- g_string_append_printf (str, _("Unable to update %s: "
|
||||
- "authentication was required"),
|
||||
- str_app);
|
||||
+ if (app != NULL) {
|
||||
+ str_app = gs_shell_get_title_from_app (app);
|
||||
+ /* TRANSLATORS: failure text for the in-app notification,
|
||||
+ * where the %s is the application name (e.g. "GIMP") */
|
||||
+ g_string_append_printf (str, _("Unable to update %s: "
|
||||
+ "authentication was required"),
|
||||
+ str_app);
|
||||
+ } else {
|
||||
+ /* TRANSLATORS: failure text for the in-app notification */
|
||||
+ g_string_append_printf (str, _("Unable to install updates: "
|
||||
+ "authentication was required"));
|
||||
+ }
|
||||
break;
|
||||
case GS_PLUGIN_ERROR_AUTH_INVALID:
|
||||
- /* TRANSLATORS: failure text for the in-app notification,
|
||||
- * where the %s is the application name (e.g. "GIMP") */
|
||||
- g_string_append_printf (str, _("Unable to update %s: "
|
||||
- "authentication was invalid"),
|
||||
- str_app);
|
||||
+ if (app != NULL) {
|
||||
+ str_app = gs_shell_get_title_from_app (app);
|
||||
+ /* TRANSLATORS: failure text for the in-app notification,
|
||||
+ * where the %s is the application name (e.g. "GIMP") */
|
||||
+ g_string_append_printf (str, _("Unable to update %s: "
|
||||
+ "authentication was invalid"),
|
||||
+ str_app);
|
||||
+ } else {
|
||||
+ /* TRANSLATORS: failure text for the in-app notification */
|
||||
+ g_string_append_printf (str, _("Unable to install updates: "
|
||||
+ "authentication was invalid"));
|
||||
+ }
|
||||
break;
|
||||
case GS_PLUGIN_ERROR_NO_SECURITY:
|
||||
- /* TRANSLATORS: failure text for the in-app notification,
|
||||
- * where the %s is the application name (e.g. "GIMP") */
|
||||
- g_string_append_printf (str, _("Unable to update %s: "
|
||||
- "you do not have permission to "
|
||||
- "update software"),
|
||||
- str_app);
|
||||
+ if (app != NULL) {
|
||||
+ str_app = gs_shell_get_title_from_app (app);
|
||||
+ /* TRANSLATORS: failure text for the in-app notification,
|
||||
+ * where the %s is the application name (e.g. "GIMP") */
|
||||
+ g_string_append_printf (str, _("Unable to update %s: "
|
||||
+ "you do not have permission to "
|
||||
+ "update software"),
|
||||
+ str_app);
|
||||
+ } else {
|
||||
+ /* TRANSLATORS: failure text for the in-app notification */
|
||||
+ g_string_append_printf (str, _("Unable to install updates: "
|
||||
+ "you do not have permission to "
|
||||
+ "update software"));
|
||||
+ }
|
||||
break;
|
||||
case GS_PLUGIN_ERROR_AC_POWER_REQUIRED:
|
||||
- /* TRANSLATORS: failure text for the in-app notification,
|
||||
- * where the %s is the application name (e.g. "Dell XPS 13") */
|
||||
- g_string_append_printf (str, _("Unable to update %s: "
|
||||
- "AC power is required"),
|
||||
- str_app);
|
||||
+ if (app != NULL) {
|
||||
+ str_app = gs_shell_get_title_from_app (app);
|
||||
+ /* TRANSLATORS: failure text for the in-app notification,
|
||||
+ * where the %s is the application name (e.g. "Dell XPS 13") */
|
||||
+ g_string_append_printf (str, _("Unable to update %s: "
|
||||
+ "AC power is required"),
|
||||
+ str_app);
|
||||
+ } else {
|
||||
+ /* TRANSLATORS: failure text for the in-app notification,
|
||||
+ * where the %s is the application name (e.g. "Dell XPS 13") */
|
||||
+ g_string_append_printf (str, _("Unable to install updates: "
|
||||
+ "AC power is required"));
|
||||
+ }
|
||||
break;
|
||||
case GS_PLUGIN_ERROR_CANCELLED:
|
||||
break;
|
||||
default:
|
||||
- /* TRANSLATORS: failure text for the in-app notification,
|
||||
- * where the %s is the application name (e.g. "GIMP") */
|
||||
- g_string_append_printf (str, _("Unable to update %s"), str_app);
|
||||
+ if (app != NULL) {
|
||||
+ str_app = gs_shell_get_title_from_app (app);
|
||||
+ /* TRANSLATORS: failure text for the in-app notification,
|
||||
+ * where the %s is the application name (e.g. "GIMP") */
|
||||
+ g_string_append_printf (str, _("Unable to update %s"), str_app);
|
||||
+ } else {
|
||||
+ /* TRANSLATORS: failure text for the in-app notification */
|
||||
+ g_string_append_printf (str, _("Unable to install updates"));
|
||||
+ }
|
||||
break;
|
||||
}
|
||||
if (str->len == 0)
|
||||
--
|
||||
2.21.0
|
||||
|
||||
|
||||
From af764483533ac1afc42a5c0f1c6b76c43be1d24d Mon Sep 17 00:00:00 2001
|
||||
From: Kalev Lember <klember@redhat.com>
|
||||
Date: Tue, 15 Jan 2019 23:49:50 +0100
|
||||
Subject: [PATCH 2/3] shell: Add details for a system upgrade error
|
||||
|
||||
Make the "internet access was required" error look the same as the rest
|
||||
of the system upgrade errors, showing which distro version we were
|
||||
trying to upgrade to.
|
||||
---
|
||||
src/gs-shell.c | 10 ++++++----
|
||||
1 file changed, 6 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/src/gs-shell.c b/src/gs-shell.c
|
||||
index 7c2f86d81..7c97740fa 100644
|
||||
--- a/src/gs-shell.c
|
||||
+++ b/src/gs-shell.c
|
||||
@@ -1534,10 +1534,12 @@ gs_shell_show_event_upgrade (GsShell *shell, GsPluginEvent *event)
|
||||
}
|
||||
break;
|
||||
case GS_PLUGIN_ERROR_NO_NETWORK:
|
||||
- /* TRANSLATORS: failure text for the in-app notification */
|
||||
- g_string_append (str, _("Unable to upgrade: "
|
||||
- "internet access was required but "
|
||||
- "wasn’t available"));
|
||||
+ /* TRANSLATORS: failure text for the in-app notification,
|
||||
+ * where the %s is the distro name (e.g. "Fedora 25") */
|
||||
+ g_string_append_printf (str, _("Unable to upgrade to %s: "
|
||||
+ "internet access was required but "
|
||||
+ "wasn’t available"),
|
||||
+ str_app);
|
||||
buttons |= GS_SHELL_EVENT_BUTTON_NETWORK_SETTINGS;
|
||||
break;
|
||||
case GS_PLUGIN_ERROR_NO_SPACE:
|
||||
--
|
||||
2.21.0
|
||||
|
||||
|
||||
From 0d3c47f69e7f6452412a0a3e6704106eefc0c658 Mon Sep 17 00:00:00 2001
|
||||
From: Kalev Lember <klember@redhat.com>
|
||||
Date: Tue, 15 Jan 2019 23:55:22 +0100
|
||||
Subject: [PATCH 3/3] shell: Improve the logic when to show detailed error
|
||||
messages
|
||||
|
||||
Make sure we never have "Sorry, something went wrong" without actual
|
||||
details what went wrong.
|
||||
---
|
||||
src/gs-shell.c | 64 +++++++++++---------------------------------------
|
||||
1 file changed, 14 insertions(+), 50 deletions(-)
|
||||
|
||||
diff --git a/src/gs-shell.c b/src/gs-shell.c
|
||||
index 7c97740fa..3eea95028 100644
|
||||
--- a/src/gs-shell.c
|
||||
+++ b/src/gs-shell.c
|
||||
@@ -990,16 +990,6 @@ gs_shell_get_title_from_app (GsApp *app)
|
||||
return g_strdup_printf (_("“%s”"), gs_app_get_id (app));
|
||||
}
|
||||
|
||||
-static gboolean
|
||||
-gs_shell_show_detailed_error (GsShell *shell, const GError *error)
|
||||
-{
|
||||
- if (error->code == GS_PLUGIN_ERROR_FAILED)
|
||||
- return TRUE;
|
||||
- if (error->code == GS_PLUGIN_ERROR_DOWNLOAD_FAILED)
|
||||
- return TRUE;
|
||||
- return FALSE;
|
||||
-}
|
||||
-
|
||||
static gchar *
|
||||
get_first_line (const gchar *str)
|
||||
{
|
||||
@@ -1055,6 +1045,7 @@ gs_shell_show_event_refresh (GsShell *shell, GsPluginEvent *event)
|
||||
/* TRANSLATORS: failure text for the in-app notification */
|
||||
g_string_append (str, _("Unable to download updates"));
|
||||
}
|
||||
+ gs_shell_append_detailed_error (shell, str, error);
|
||||
break;
|
||||
case GS_PLUGIN_ERROR_NO_NETWORK:
|
||||
/* TRANSLATORS: failure text for the in-app notification */
|
||||
@@ -1106,6 +1097,7 @@ gs_shell_show_event_refresh (GsShell *shell, GsPluginEvent *event)
|
||||
/* TRANSLATORS: failure text for the in-app notification */
|
||||
g_string_append (str, _("Unable to get list of updates"));
|
||||
}
|
||||
+ gs_shell_append_detailed_error (shell, str, error);
|
||||
break;
|
||||
}
|
||||
if (str->len == 0)
|
||||
@@ -1121,10 +1113,6 @@ gs_shell_show_event_refresh (GsShell *shell, GsPluginEvent *event)
|
||||
}
|
||||
}
|
||||
|
||||
- /* add extra debugging for debug builds */
|
||||
- if (gs_shell_show_detailed_error (shell, error))
|
||||
- gs_shell_append_detailed_error (shell, str, error);
|
||||
-
|
||||
/* show in-app notification */
|
||||
gs_shell_show_event_app_notify (shell, str->str, buttons);
|
||||
return TRUE;
|
||||
@@ -1173,15 +1161,12 @@ gs_shell_show_event_purchase (GsShell *shell, GsPluginEvent *event)
|
||||
/* TRANSLATORS: failure text for the in-app notification,
|
||||
* where the %s is the application name (e.g. "GIMP") */
|
||||
g_string_append_printf (str, _("Unable to purchase %s"), str_app);
|
||||
+ gs_shell_append_detailed_error (shell, str, error);
|
||||
break;
|
||||
}
|
||||
if (str->len == 0)
|
||||
return FALSE;
|
||||
|
||||
- /* add extra debugging for debug builds */
|
||||
- if (gs_shell_show_detailed_error (shell, error))
|
||||
- gs_shell_append_detailed_error (shell, str, error);
|
||||
-
|
||||
/* show in-app notification */
|
||||
gs_shell_show_event_app_notify (shell, str->str, GS_SHELL_EVENT_BUTTON_NONE);
|
||||
return TRUE;
|
||||
@@ -1218,6 +1203,7 @@ gs_shell_show_event_install (GsShell *shell, GsPluginEvent *event)
|
||||
"as download failed"),
|
||||
str_app);
|
||||
}
|
||||
+ gs_shell_append_detailed_error (shell, str, error);
|
||||
break;
|
||||
case GS_PLUGIN_ERROR_NOT_SUPPORTED:
|
||||
if (origin != NULL) {
|
||||
@@ -1319,6 +1305,7 @@ gs_shell_show_event_install (GsShell *shell, GsPluginEvent *event)
|
||||
/* TRANSLATORS: failure text for the in-app notification,
|
||||
* where the %s is the application name (e.g. "GIMP") */
|
||||
g_string_append_printf (str, _("Unable to install %s"), str_app);
|
||||
+ gs_shell_append_detailed_error (shell, str, error);
|
||||
break;
|
||||
}
|
||||
if (str->len == 0)
|
||||
@@ -1334,10 +1321,6 @@ gs_shell_show_event_install (GsShell *shell, GsPluginEvent *event)
|
||||
}
|
||||
}
|
||||
|
||||
- /* add extra debugging for debug builds */
|
||||
- if (gs_shell_show_detailed_error (shell, error))
|
||||
- gs_shell_append_detailed_error (shell, str, error);
|
||||
-
|
||||
/* show in-app notification */
|
||||
gs_shell_show_event_app_notify (shell, str->str, buttons);
|
||||
return TRUE;
|
||||
@@ -1384,6 +1367,7 @@ gs_shell_show_event_update (GsShell *shell, GsPluginEvent *event)
|
||||
/* TRANSLATORS: failure text for the in-app notification */
|
||||
g_string_append_printf (str, _("Unable to install updates as download failed"));
|
||||
}
|
||||
+ gs_shell_append_detailed_error (shell, str, error);
|
||||
break;
|
||||
case GS_PLUGIN_ERROR_NO_NETWORK:
|
||||
/* TRANSLATORS: failure text for the in-app notification */
|
||||
@@ -1479,6 +1463,7 @@ gs_shell_show_event_update (GsShell *shell, GsPluginEvent *event)
|
||||
/* TRANSLATORS: failure text for the in-app notification */
|
||||
g_string_append_printf (str, _("Unable to install updates"));
|
||||
}
|
||||
+ gs_shell_append_detailed_error (shell, str, error);
|
||||
break;
|
||||
}
|
||||
if (str->len == 0)
|
||||
@@ -1494,10 +1479,6 @@ gs_shell_show_event_update (GsShell *shell, GsPluginEvent *event)
|
||||
}
|
||||
}
|
||||
|
||||
- /* add extra debugging for debug builds */
|
||||
- if (gs_shell_show_detailed_error (shell, error))
|
||||
- gs_shell_append_detailed_error (shell, str, error);
|
||||
-
|
||||
/* show in-app notification */
|
||||
gs_shell_show_event_app_notify (shell, str->str, buttons);
|
||||
return TRUE;
|
||||
@@ -1532,6 +1513,7 @@ gs_shell_show_event_upgrade (GsShell *shell, GsPluginEvent *event)
|
||||
"as download failed"),
|
||||
str_app);
|
||||
}
|
||||
+ gs_shell_append_detailed_error (shell, str, error);
|
||||
break;
|
||||
case GS_PLUGIN_ERROR_NO_NETWORK:
|
||||
/* TRANSLATORS: failure text for the in-app notification,
|
||||
@@ -1585,6 +1567,7 @@ gs_shell_show_event_upgrade (GsShell *shell, GsPluginEvent *event)
|
||||
/* TRANSLATORS: failure text for the in-app notification,
|
||||
* where the %s is the distro name (e.g. "Fedora 25") */
|
||||
g_string_append_printf (str, _("Unable to upgrade to %s"), str_app);
|
||||
+ gs_shell_append_detailed_error (shell, str, error);
|
||||
break;
|
||||
}
|
||||
if (str->len == 0)
|
||||
@@ -1600,10 +1583,6 @@ gs_shell_show_event_upgrade (GsShell *shell, GsPluginEvent *event)
|
||||
}
|
||||
}
|
||||
|
||||
- /* add extra debugging for debug builds */
|
||||
- if (gs_shell_show_detailed_error (shell, error))
|
||||
- gs_shell_append_detailed_error (shell, str, error);
|
||||
-
|
||||
/* show in-app notification */
|
||||
gs_shell_show_event_app_notify (shell, str->str, buttons);
|
||||
return TRUE;
|
||||
@@ -1658,6 +1637,7 @@ gs_shell_show_event_remove (GsShell *shell, GsPluginEvent *event)
|
||||
/* TRANSLATORS: failure text for the in-app notification,
|
||||
* where the %s is the application name (e.g. "GIMP") */
|
||||
g_string_append_printf (str, _("Unable to remove %s"), str_app);
|
||||
+ gs_shell_append_detailed_error (shell, str, error);
|
||||
break;
|
||||
}
|
||||
if (str->len == 0)
|
||||
@@ -1673,10 +1653,6 @@ gs_shell_show_event_remove (GsShell *shell, GsPluginEvent *event)
|
||||
}
|
||||
}
|
||||
|
||||
- /* add extra debugging for debug builds */
|
||||
- if (gs_shell_show_detailed_error (shell, error))
|
||||
- gs_shell_append_detailed_error (shell, str, error);
|
||||
-
|
||||
/* show in-app notification */
|
||||
gs_shell_show_event_app_notify (shell, str->str, buttons);
|
||||
return TRUE;
|
||||
@@ -1722,6 +1698,7 @@ gs_shell_show_event_launch (GsShell *shell, GsPluginEvent *event)
|
||||
return FALSE;
|
||||
/* TRANSLATORS: we failed to get a proper error code */
|
||||
g_string_append (str, _("Sorry, something went wrong"));
|
||||
+ gs_shell_append_detailed_error (shell, str, error);
|
||||
break;
|
||||
}
|
||||
if (str->len == 0)
|
||||
@@ -1737,10 +1714,6 @@ gs_shell_show_event_launch (GsShell *shell, GsPluginEvent *event)
|
||||
}
|
||||
}
|
||||
|
||||
- /* add extra debugging for debug builds */
|
||||
- if (gs_shell_show_detailed_error (shell, error))
|
||||
- gs_shell_append_detailed_error (shell, str, error);
|
||||
-
|
||||
/* show in-app notification */
|
||||
gs_shell_show_event_app_notify (shell, str->str, buttons);
|
||||
return TRUE;
|
||||
@@ -1776,15 +1749,12 @@ gs_shell_show_event_file_to_app (GsShell *shell, GsPluginEvent *event)
|
||||
return FALSE;
|
||||
/* TRANSLATORS: we failed to get a proper error code */
|
||||
g_string_append (str, _("Sorry, something went wrong"));
|
||||
+ gs_shell_append_detailed_error (shell, str, error);
|
||||
break;
|
||||
}
|
||||
if (str->len == 0)
|
||||
return FALSE;
|
||||
|
||||
- /* add extra debugging for debug builds */
|
||||
- if (gs_shell_show_detailed_error (shell, error))
|
||||
- gs_shell_append_detailed_error (shell, str, error);
|
||||
-
|
||||
/* show in-app notification */
|
||||
gs_shell_show_event_app_notify (shell, str->str, buttons);
|
||||
return TRUE;
|
||||
@@ -1820,15 +1790,12 @@ gs_shell_show_event_url_to_app (GsShell *shell, GsPluginEvent *event)
|
||||
return FALSE;
|
||||
/* TRANSLATORS: we failed to get a proper error code */
|
||||
g_string_append (str, _("Sorry, something went wrong"));
|
||||
+ gs_shell_append_detailed_error (shell, str, error);
|
||||
break;
|
||||
}
|
||||
if (str->len == 0)
|
||||
return FALSE;
|
||||
|
||||
- /* add extra debugging for debug builds */
|
||||
- if (gs_shell_show_detailed_error (shell, error))
|
||||
- g_string_append_printf (str, "\n%s", error->message);
|
||||
-
|
||||
/* show in-app notification */
|
||||
gs_shell_show_event_app_notify (shell, str->str, buttons);
|
||||
return TRUE;
|
||||
@@ -1890,6 +1857,7 @@ gs_shell_show_event_fallback (GsShell *shell, GsPluginEvent *event)
|
||||
return FALSE;
|
||||
/* TRANSLATORS: we failed to get a proper error code */
|
||||
g_string_append (str, _("Sorry, something went wrong"));
|
||||
+ gs_shell_append_detailed_error (shell, str, error);
|
||||
break;
|
||||
}
|
||||
if (str->len == 0)
|
||||
@@ -1905,10 +1873,6 @@ gs_shell_show_event_fallback (GsShell *shell, GsPluginEvent *event)
|
||||
}
|
||||
}
|
||||
|
||||
- /* add extra debugging for debug builds */
|
||||
- if (gs_shell_show_detailed_error (shell, error))
|
||||
- gs_shell_append_detailed_error (shell, str, error);
|
||||
-
|
||||
/* show in-app notification */
|
||||
gs_shell_show_event_app_notify (shell, str->str, buttons);
|
||||
return TRUE;
|
||||
--
|
||||
2.21.0
|
||||
|
||||
File diff suppressed because it is too large
Load diff
|
|
@ -1,7 +0,0 @@
|
|||
---
|
||||
runpath:
|
||||
allowed_paths:
|
||||
- /usr/lib/gnome-software
|
||||
- /usr/lib/rpm-ostree
|
||||
- /usr/lib64/gnome-software
|
||||
- /usr/lib64/rpm-ostree
|
||||
4
sources
4
sources
|
|
@ -1 +1,3 @@
|
|||
SHA512 (gnome-software-49.3.tar.xz) = 0414ea55ad3b83bcd50514985e3d2026207801c040934805bb26d162e88f0619a9d70aa6ba324a29acfab02573490b928c83594b54f57ec2a8ad00e6c127f657
|
||||
SHA512 (gnome-software-3.30.6.tar.xz) = dd98e9e61469fc5566ab569f09bdc06ccb5812a236e305185b911c70364e2983f257e939aed0bb61778163084fb5628d63ff6bd5f056d4a7626a2e771ad6426a
|
||||
SHA512 (f30.png) = 0e90083bda910c13ca9c08b8cde09ffdc8cf9176d84406539235ed3da71ca8bdf5342bf0dfbbd74f6052dffc8c8035e03c6f7ed4d578fa0e84af43e6993df32f
|
||||
SHA512 (f31.png) = 69e6c8291d93640d4d6f5d71c3a9e08f65a90c19c38b6036423c236063e68be03b68c2668aae6d8b0a03c7a24bf8ae8e108dfb2a9cd85b7bb232751b3e05bb0f
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue