164 lines
5.9 KiB
Diff
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
|
|
|