File gnome-software-wip-commit.patch of Package gnome-software

From 91445b095b4d99cf274a408e11b5b3936426a655 Mon Sep 17 00:00:00 2001
From: Jonathan Kang <jonathankang@gnome.org>
Date: Tue, 11 Nov 2025 11:02:41 +0800
Subject: [PATCH] wip commit

---
 plugins/packagekit/gs-plugin-packagekit.c | 119 ++++++++++------------
 plugins/packagekit/packagekit-common.c    |   2 +-
 2 files changed, 54 insertions(+), 67 deletions(-)

diff --git a/plugins/packagekit/gs-plugin-packagekit.c b/plugins/packagekit/gs-plugin-packagekit.c
index df2221378..8879c315c 100644
--- a/plugins/packagekit/gs-plugin-packagekit.c
+++ b/plugins/packagekit/gs-plugin-packagekit.c
@@ -378,6 +378,35 @@ app_list_get_package_ids (GsAppList       *apps,
 	return g_steal_pointer (&list_package_ids);
 }
 
+static GPtrArray *
+app_list_get_real_package_ids (GsPluginPackagekit *self,
+			       GsAppList *apps)
+{
+	g_autoptr(GPtrArray) package_ids = g_ptr_array_new_with_free_func (NULL);
+
+	for (guint i = 0; i < gs_app_list_length (apps); i++) {
+		GsApp *app = gs_app_list_index (apps, i);
+		GsAppList *related = gs_app_get_related (app);
+
+		/* System Updates proxy app. */
+		if (gs_app_has_quirk (app, GS_APP_QUIRK_IS_PROXY)) {
+			for (guint j = 0; j < gs_app_list_length (related); j++) {
+				GsApp *app_tmp = gs_app_list_index (related, j);
+
+				if (gs_app_get_state (app_tmp) == GS_APP_STATE_UPDATABLE_LIVE &&
+				    gs_app_has_management_plugin (app_tmp, GS_PLUGIN (self)))
+					g_ptr_array_add (package_ids, gs_app_get_source_id_default (app_tmp));
+			}
+		} else {
+			if (gs_app_get_state (app) == GS_APP_STATE_UPDATABLE_LIVE &&
+			    gs_app_has_management_plugin (app, GS_PLUGIN (self)))
+				g_ptr_array_add (package_ids, gs_app_get_source_id_default (app));
+		}
+	}
+
+	return g_steal_pointer (&package_ids);
+}
+
 static GsApp *
 gs_plugin_packagekit_dup_app_origin_repo (GsPluginPackagekit  *self,
                                           GsApp               *app,
@@ -1261,7 +1290,7 @@ gs_plugin_packagekit_set_update_app_state (GsApp *app,
 		   pk_package_get_info (package) == PK_INFO_ENUM_INSTALLING) {
 		gs_app_set_state (app, GS_APP_STATE_AVAILABLE);
 	} else {
-		gs_app_set_state (app, GS_APP_STATE_UPDATABLE);
+		gs_app_set_state (app, GS_APP_STATE_UPDATABLE_LIVE);
 	}
 #else
 	if (pk_package_get_info (package) == PK_INFO_ENUM_REMOVING ||
@@ -1270,7 +1299,7 @@ gs_plugin_packagekit_set_update_app_state (GsApp *app,
 	} else if (pk_package_get_info (package) == PK_INFO_ENUM_INSTALLING) {
 		gs_app_set_state (app, GS_APP_STATE_AVAILABLE);
 	} else {
-		gs_app_set_state (app, GS_APP_STATE_UPDATABLE);
+		gs_app_set_state (app, GS_APP_STATE_UPDATABLE_LIVE);
 	}
 #endif
 }
@@ -5130,66 +5159,26 @@ update_apps_download_cb (GObject      *source_object,
 	}
 
 	if (!(data->flags & GS_PLUGIN_UPDATE_APPS_FLAGS_NO_APPLY)) {
-		gboolean trigger_update = FALSE;
-
-		/* Are any of these apps from PackageKit, and suitable for offline
-		 * updates? If any of them can be processed offline, trigger an offline
-		 * update. If all of them are updatable online, don’t. */
-		for (guint i = 0; i < gs_app_list_length (data->apps); i++) {
-			GsApp *app = gs_app_list_index (data->apps, i);
-			GsAppList *related = gs_app_get_related (app);
-
-			/* try to trigger this app */
-			if (!gs_app_has_quirk (app, GS_APP_QUIRK_IS_PROXY) &&
-			    gs_app_get_state (app) == GS_APP_STATE_UPDATABLE &&
-			    gs_app_has_management_plugin (app, GS_PLUGIN (self))) {
-				trigger_update = TRUE;
-				break;
-			}
-
-			/* try to trigger each related app */
-			for (guint j = 0; j < gs_app_list_length (related); j++) {
-				GsApp *app_tmp = gs_app_list_index (related, j);
-
-				if (gs_app_get_state (app_tmp) == GS_APP_STATE_UPDATABLE &&
-				    gs_app_has_management_plugin (app_tmp, GS_PLUGIN (self))) {
-					trigger_update = TRUE;
-					break;
-				}
-			}
-		}
+		g_autoptr(GPtrArray) package_ids = g_ptr_array_new_with_free_func (NULL);
+		g_autoptr(GsPackagekitHelper) helper = NULL;
+		g_autoptr(PkTask) task_update = NULL;
 
-		if (trigger_update && !self->is_triggered) {
-			GDBusConnection *connection;
+		helper = gs_packagekit_helper_new (GS_PLUGIN (source_object));
+		task_update = gs_packagekit_task_new (GS_PLUGIN (source_object));
+		gs_packagekit_task_take_helper (GS_PACKAGEKIT_TASK (task_update), helper);
 
-			/* trigger offline update if it’s not already been triggered */
+		package_ids = app_list_get_real_package_ids (self, data->apps);
+		if (package_ids->len > 0) {
+			/* NULL-terminate the array */
+			g_ptr_array_add (package_ids, NULL);
 
-			/* Assume we can use the singleton system bus connection
-			 * due to prior PackageKit calls having created it. This
-			 * avoids an async callback. */
-			connection = g_bus_get_sync (G_BUS_TYPE_SYSTEM,
-						     cancellable,
-						     &local_error);
-			if (connection == NULL) {
-				g_task_return_error (task, g_steal_pointer (&local_error));
-				return;
-			}
+			pk_task_update_packages_async (task_update,
+						       (gchar **) package_ids->pdata,
+						       cancellable,
+						       NULL, NULL,
+						       update_apps_trigger_cb,
+						       g_steal_pointer (&task));
 
-			/* FIXME: This can be simplified down to a call to
-			 * pk_offline_trigger_with_flags_async() when it exists.
-			 * See https://github.com/PackageKit/PackageKit/issues/605 */
-			g_dbus_connection_call (connection,
-						"org.freedesktop.PackageKit",
-						"/org/freedesktop/PackageKit",
-						"org.freedesktop.PackageKit.Offline",
-						"Trigger",
-						g_variant_new ("(s)", pk_offline_action_to_string (PK_OFFLINE_ACTION_REBOOT)),
-						NULL,
-						interactive ? G_DBUS_CALL_FLAGS_ALLOW_INTERACTIVE_AUTHORIZATION : G_DBUS_CALL_FLAGS_NONE,
-						-1,
-						cancellable,
-						update_apps_trigger_cb,
-						g_steal_pointer (&task));
 			return;
 		}
 	}
@@ -5202,21 +5191,19 @@ update_apps_trigger_cb (GObject      *source_object,
                         GAsyncResult *result,
                         gpointer      user_data)
 {
-	GDBusConnection *connection = G_DBUS_CONNECTION (source_object);
 	g_autoptr(GTask) task = g_steal_pointer (&user_data);
-	GsPluginPackagekit *self = g_task_get_source_object (task);
-	GCancellable *cancellable = g_task_get_cancellable (task);
+	g_autoptr(PkResults) results = NULL;
 	g_autoptr(GError) local_error = NULL;
+	GsPluginUpdateAppsData *data = g_task_get_task_data (task);
 
-	if (!g_dbus_connection_call_finish (connection, result, &local_error)) {
-		gs_plugin_packagekit_error_convert (&local_error, cancellable);
+	results = pk_task_generic_finish (PK_TASK (source_object), result, &local_error);
+
+	if (local_error != NULL || !gs_plugin_packagekit_results_valid (results, g_task_get_cancellable (task), &local_error)) {
+		gs_plugin_packagekit_error_convert (&local_error, g_task_get_cancellable (task));
 		g_task_return_error (task, g_steal_pointer (&local_error));
 		return;
 	}
 
-	/* don't rely on the file monitor */
-	gs_plugin_packagekit_refresh_is_triggered (self, cancellable);
-
 	g_task_return_boolean (task, TRUE);
 }
 
diff --git a/plugins/packagekit/packagekit-common.c b/plugins/packagekit/packagekit-common.c
index 443023ad7..5443cf6ed 100644
--- a/plugins/packagekit/packagekit-common.c
+++ b/plugins/packagekit/packagekit-common.c
@@ -386,7 +386,7 @@ gs_plugin_packagekit_resolve_packages_app (GsPlugin *plugin,
 	} else if (number_installed + number_available > sources->len) {
 		/* we have more packages returned than source packages */
 		gs_app_set_state (app, GS_APP_STATE_UNKNOWN);
-		gs_app_set_state (app, GS_APP_STATE_UPDATABLE);
+		gs_app_set_state (app, GS_APP_STATE_UPDATABLE_LIVE);
 	} else if (number_installed + number_available < sources->len) {
 		g_autofree gchar *tmp = NULL;
 		/* we have less packages returned than source packages */
-- 
2.51.1

openSUSE Build Service is sponsored by