gnome-software/0005-repos-dialog-can-show-...

164 lines
5.9 KiB
Diff

From 1338c8f47b7ebd0e3bd360499c7ab42a0da885e8 Mon Sep 17 00:00:00 2001
From: Milan Crha <mcrha@redhat.com>
Date: Tue, 5 Oct 2021 16:12:33 +0200
Subject: [PATCH 1/2] packagekit: Update GsApp state and kind only when created
the app instance
The gs_plugin_packagekit_add_results() can reuse GsApp instances from
the plugin cache, which can already have set property state and kind,
but this was not checked for, which could cause runtime warnings about
invalid state or kind change.
A reproducer is to open Repositories dialog, which lists available repositories
and the applications being installed in each of them (added as 'related').
These installed applications can have set state 'updatable' or have refined
their 'kind' already.
---
plugins/packagekit/packagekit-common.c | 15 +++++++++------
1 file changed, 9 insertions(+), 6 deletions(-)
diff --git a/plugins/packagekit/packagekit-common.c b/plugins/packagekit/packagekit-common.c
index 16b53727a..dc79c2f62 100644
--- a/plugins/packagekit/packagekit-common.c
+++ b/plugins/packagekit/packagekit-common.c
@@ -241,12 +241,14 @@ gs_plugin_packagekit_add_results (GsPlugin *plugin,
/* process packages */
for (i = 0; i < array_filtered->len; i++) {
g_autoptr(GsApp) app = NULL;
+ GsAppState state = GS_APP_STATE_UNKNOWN;
package = g_ptr_array_index (array_filtered, i);
app = gs_plugin_cache_lookup (plugin, pk_package_get_id (package));
if (app == NULL) {
app = gs_app_new (NULL);
gs_plugin_packagekit_set_packaging_format (plugin, app);
+ gs_app_set_management_plugin (app, "packagekit");
gs_app_add_source (app, pk_package_get_name (package));
gs_app_add_source_id (app, pk_package_get_id (package));
gs_plugin_cache_add (plugin, pk_package_get_id (package), app);
@@ -259,14 +261,13 @@ gs_plugin_packagekit_add_results (GsPlugin *plugin,
pk_package_get_summary (package));
gs_app_set_metadata (app, "GnomeSoftware::Creator",
gs_plugin_get_name (plugin));
- gs_app_set_management_plugin (app, "packagekit");
gs_app_set_version (app, pk_package_get_version (package));
switch (pk_package_get_info (package)) {
case PK_INFO_ENUM_INSTALLED:
- gs_app_set_state (app, GS_APP_STATE_INSTALLED);
+ state = GS_APP_STATE_INSTALLED;
break;
case PK_INFO_ENUM_AVAILABLE:
- gs_app_set_state (app, GS_APP_STATE_AVAILABLE);
+ state = GS_APP_STATE_AVAILABLE;
break;
case PK_INFO_ENUM_INSTALLING:
case PK_INFO_ENUM_UPDATING:
@@ -276,14 +277,16 @@ gs_plugin_packagekit_add_results (GsPlugin *plugin,
break;
case PK_INFO_ENUM_UNAVAILABLE:
case PK_INFO_ENUM_REMOVING:
- gs_app_set_state (app, GS_APP_STATE_UNAVAILABLE);
+ state = GS_APP_STATE_UNAVAILABLE;
break;
default:
- gs_app_set_state (app, GS_APP_STATE_UNKNOWN);
g_warning ("unknown info state of %s",
pk_info_enum_to_string (pk_package_get_info (package)));
}
- gs_app_set_kind (app, AS_COMPONENT_KIND_GENERIC);
+ if (state != GS_APP_STATE_UNKNOWN && gs_app_get_state (app) == GS_APP_STATE_UNKNOWN)
+ gs_app_set_state (app, state);
+ if (gs_app_get_kind (app) == AS_COMPONENT_KIND_UNKNOWN)
+ gs_app_set_kind (app, AS_COMPONENT_KIND_GENERIC);
gs_app_set_bundle_kind (app, AS_BUNDLE_KIND_PACKAGE);
gs_app_list_add (list, app);
}
--
GitLab
From 18a893fa83ebd10cea75831e9d9a7398a60c14ce Mon Sep 17 00:00:00 2001
From: Milan Crha <mcrha@redhat.com>
Date: Tue, 5 Oct 2021 16:18:22 +0200
Subject: [PATCH 2/2] gs-plugin-loader: Ensure correct list is used on the job
when refining wildcards
The plugin job is reused when refining the apps, including the wildcards,
but the gs_plugin_loader_run_refine_internal() can be called multiple times,
with different lists. Adding refined wildcards to the original list causes
invalid data being provided to the called.
Closes https://gitlab.gnome.org/GNOME/gnome-software/-/issues/1485
---
lib/gs-plugin-loader.c | 21 ++++++++++++++++++++-
1 file changed, 20 insertions(+), 1 deletion(-)
diff --git a/lib/gs-plugin-loader.c b/lib/gs-plugin-loader.c
index 4d5240c32..7f5859a05 100644
--- a/lib/gs-plugin-loader.c
+++ b/lib/gs-plugin-loader.c
@@ -937,14 +937,24 @@ gs_plugin_loader_run_refine_internal (GsPluginLoaderHelper *helper,
GCancellable *cancellable,
GError **error)
{
+ g_autoptr(GsAppList) previous_list = NULL;
+
+ if (list != gs_plugin_job_get_list (helper->plugin_job)) {
+ previous_list = g_object_ref (gs_plugin_job_get_list (helper->plugin_job));
+ gs_plugin_job_set_list (helper->plugin_job, list);
+ }
+
/* try to adopt each application with a plugin */
gs_plugin_loader_run_adopt (helper->plugin_loader, list);
/* run each plugin */
if (!gs_plugin_loader_run_refine_filter (helper, list,
GS_PLUGIN_REFINE_FLAGS_DEFAULT,
- cancellable, error))
+ cancellable, error)) {
+ if (previous_list != NULL)
+ gs_plugin_job_set_list (helper->plugin_job, previous_list);
return FALSE;
+ }
/* ensure these are sorted by score */
if (gs_plugin_job_has_refine_flags (helper->plugin_job,
@@ -983,6 +993,8 @@ gs_plugin_loader_run_refine_internal (GsPluginLoaderHelper *helper,
addons_list,
cancellable,
error)) {
+ if (previous_list != NULL)
+ gs_plugin_job_set_list (helper->plugin_job, previous_list);
return FALSE;
}
}
@@ -1004,6 +1016,8 @@ gs_plugin_loader_run_refine_internal (GsPluginLoaderHelper *helper,
list2,
cancellable,
error)) {
+ if (previous_list != NULL)
+ gs_plugin_job_set_list (helper->plugin_job, previous_list);
return FALSE;
}
}
@@ -1032,11 +1046,16 @@ gs_plugin_loader_run_refine_internal (GsPluginLoaderHelper *helper,
related_list,
cancellable,
error)) {
+ if (previous_list != NULL)
+ gs_plugin_job_set_list (helper->plugin_job, previous_list);
return FALSE;
}
}
}
+ if (previous_list != NULL)
+ gs_plugin_job_set_list (helper->plugin_job, previous_list);
+
/* success */
return TRUE;
}
--
GitLab