[gnome-software: 12/14] flatpak: Store interactive state on transactions instead of plugin
- From: Philip Withnall <pwithnall src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-software: 12/14] flatpak: Store interactive state on transactions instead of plugin
- Date: Thu, 27 Jan 2022 20:27:49 +0000 (UTC)
commit 326a3043321a6ff16ca2ee8b7eaeb08bee73a5d0
Author: Philip Withnall <pwithnall endlessos org>
Date: Tue Jan 25 16:36:23 2022 +0000
flatpak: Store interactive state on transactions instead of plugin
As much as is possible at the moment, store the interactive state on
each transaction, rather than always querying the plugin to see if it’s
interactive.
This should reduce the chance that long-running flatpak operations which
start as non-interactive later become interactive as the flatpak plugin
as a whole has since become interactive (or vice-versa).
It’s one step towards eventually removing `GS_PLUGIN_FLAGS_INTERACTIVE`,
which promotes writing code which is subject to that kind of bug.
This commit uses the new `flatpak_transaction_get_no_interaction()` API,
added in flatpak 1.13.0. If that’s not available, it falls back to a
workaround using GObject data.
The `flatpak_transaction_set_no_interaction()` API has existed in
libflatpak for a while, which is why the conditional compilation for
the `{get,set}_no_interaction()` pair is a little complex and has to use
`#define`s rather than `static inline`s.
Signed-off-by: Philip Withnall <pwithnall endlessos org>
Helps: #1472
plugins/flatpak/gs-plugin-flatpak.c | 42 ++++++++++++++++++++++++++-----------
1 file changed, 30 insertions(+), 12 deletions(-)
---
diff --git a/plugins/flatpak/gs-plugin-flatpak.c b/plugins/flatpak/gs-plugin-flatpak.c
index 55789870f..99dae01b6 100644
--- a/plugins/flatpak/gs-plugin-flatpak.c
+++ b/plugins/flatpak/gs-plugin-flatpak.c
@@ -56,6 +56,20 @@ G_DEFINE_TYPE (GsPluginFlatpak, gs_plugin_flatpak, GS_TYPE_PLUGIN)
#define assert_in_worker(self) \
g_assert (gs_worker_thread_is_in_worker_context (self->worker))
+/* Work around flatpak_transaction_get_no_interaction() not existing before
+ * flatpak 1.13.0. */
+#if !FLATPAK_CHECK_VERSION(1,13,0)
+#define flatpak_transaction_get_no_interaction(transaction) \
+ GPOINTER_TO_INT (g_object_get_data (G_OBJECT (transaction), "flatpak-no-interaction"))
+#define flatpak_transaction_set_no_interaction(transaction, no_interaction) \
+ G_STMT_START { \
+ FlatpakTransaction *ftsni_transaction = (transaction); \
+ gboolean ftsni_no_interaction = (no_interaction); \
+ (flatpak_transaction_set_no_interaction) (ftsni_transaction, ftsni_no_interaction); \
+ g_object_set_data (G_OBJECT (ftsni_transaction), "flatpak-no-interaction", GINT_TO_POINTER
(ftsni_no_interaction)); \
+ } G_STMT_END
+#endif /* flatpak < 1.13.0 */
+
static void
gs_plugin_flatpak_dispose (GObject *object)
{
@@ -767,7 +781,7 @@ _basic_auth_start (FlatpakTransaction *transaction,
{
BasicAuthData *data;
- if (!gs_plugin_has_flags (plugin, GS_PLUGIN_FLAGS_INTERACTIVE))
+ if (flatpak_transaction_get_no_interaction (transaction))
return FALSE;
data = g_slice_new0 (BasicAuthData);
@@ -790,7 +804,7 @@ _webflow_start (FlatpakTransaction *transaction,
const char *browser;
g_autoptr(GError) error_local = NULL;
- if (!gs_plugin_has_flags (plugin, GS_PLUGIN_FLAGS_INTERACTIVE))
+ if (flatpak_transaction_get_no_interaction (transaction))
return FALSE;
g_debug ("Authentication required for remote '%s'", remote);
@@ -846,6 +860,7 @@ _webflow_done (FlatpakTransaction *transaction,
static FlatpakTransaction *
_build_transaction (GsPlugin *plugin, GsFlatpak *flatpak,
+ gboolean interactive,
GCancellable *cancellable, GError **error)
{
FlatpakInstallation *installation;
@@ -865,8 +880,7 @@ _build_transaction (GsPlugin *plugin, GsFlatpak *flatpak,
}
/* Let flatpak know if it is a background operation */
- flatpak_transaction_set_no_interaction (transaction,
- !gs_plugin_has_flags (plugin, GS_PLUGIN_FLAGS_INTERACTIVE));
+ flatpak_transaction_set_no_interaction (transaction, !interactive);
/* connect up signals */
g_signal_connect (transaction, "ref-to-app",
@@ -901,6 +915,7 @@ gs_plugin_download (GsPlugin *plugin, GsAppList *list,
g_autoptr(GHashTable) applist_by_flatpaks = NULL;
GHashTableIter iter;
gpointer key, value;
+ gboolean interactive = gs_plugin_has_flags (plugin, GS_PLUGIN_FLAGS_INTERACTIVE);
/* build and run transaction for each flatpak installation */
applist_by_flatpaks = _group_apps_by_installation (self, list);
@@ -915,7 +930,7 @@ gs_plugin_download (GsPlugin *plugin, GsAppList *list,
g_assert (list_tmp != NULL);
g_assert (gs_app_list_length (list_tmp) > 0);
- if (!gs_plugin_has_flags (plugin, GS_PLUGIN_FLAGS_INTERACTIVE)) {
+ if (!interactive) {
g_autoptr(GError) error_local = NULL;
if (!gs_metered_block_app_list_on_download_scheduler (list_tmp,
&schedule_entry_handle, cancellable, &error_local)) {
@@ -926,7 +941,7 @@ gs_plugin_download (GsPlugin *plugin, GsAppList *list,
}
/* build and run non-deployed transaction */
- transaction = _build_transaction (plugin, flatpak, cancellable, error);
+ transaction = _build_transaction (plugin, flatpak, interactive, cancellable, error);
if (transaction == NULL) {
gs_flatpak_error_convert (error);
return FALSE;
@@ -1064,7 +1079,7 @@ gs_plugin_app_remove (GsPlugin *plugin,
g_return_val_if_fail (gs_app_get_kind (app) != AS_COMPONENT_KIND_REPOSITORY, FALSE);
/* build and run transaction */
- transaction = _build_transaction (plugin, flatpak, cancellable, error);
+ transaction = _build_transaction (plugin, flatpak, gs_plugin_has_flags (plugin,
GS_PLUGIN_FLAGS_INTERACTIVE), cancellable, error);
if (transaction == NULL) {
gs_flatpak_error_convert (error);
return FALSE;
@@ -1158,6 +1173,7 @@ gs_plugin_app_install (GsPlugin *plugin,
g_autoptr(GError) error_local = NULL;
gpointer schedule_entry_handle = NULL;
gboolean already_installed = FALSE;
+ gboolean interactive = gs_plugin_has_flags (plugin, GS_PLUGIN_FLAGS_INTERACTIVE);
/* queue for install if installation needs the network */
if (!app_has_local_source (app) &&
@@ -1178,7 +1194,7 @@ gs_plugin_app_install (GsPlugin *plugin,
g_return_val_if_fail (gs_app_get_kind (app) != AS_COMPONENT_KIND_REPOSITORY, FALSE);
/* build */
- transaction = _build_transaction (plugin, flatpak, cancellable, error);
+ transaction = _build_transaction (plugin, flatpak, interactive, cancellable, error);
if (transaction == NULL) {
gs_flatpak_error_convert (error);
return FALSE;
@@ -1248,7 +1264,7 @@ gs_plugin_app_install (GsPlugin *plugin,
gs_flatpak_cover_addons_in_transaction (plugin, transaction, app, GS_APP_STATE_INSTALLING);
- if (!gs_plugin_has_flags (plugin, GS_PLUGIN_FLAGS_INTERACTIVE)) {
+ if (!interactive) {
/* FIXME: Add additional details here, especially the download
* size bounds (using `size-minimum` and `size-maximum`, both
* type `t`). */
@@ -1309,6 +1325,7 @@ static gboolean
gs_plugin_flatpak_update (GsPlugin *plugin,
GsFlatpak *flatpak,
GsAppList *list_tmp,
+ gboolean interactive,
GCancellable *cancellable,
GError **error)
{
@@ -1316,7 +1333,7 @@ gs_plugin_flatpak_update (GsPlugin *plugin,
gboolean is_update_downloaded = TRUE;
gpointer schedule_entry_handle = NULL;
- if (!gs_plugin_has_flags (plugin, GS_PLUGIN_FLAGS_INTERACTIVE)) {
+ if (!interactive) {
g_autoptr(GError) error_local = NULL;
if (!gs_metered_block_app_list_on_download_scheduler (list_tmp, &schedule_entry_handle,
cancellable, &error_local)) {
@@ -1327,7 +1344,7 @@ gs_plugin_flatpak_update (GsPlugin *plugin,
}
/* build and run transaction */
- transaction = _build_transaction (plugin, flatpak, cancellable, error);
+ transaction = _build_transaction (plugin, flatpak, interactive, cancellable, error);
if (transaction == NULL) {
gs_flatpak_error_convert (error);
return FALSE;
@@ -1434,6 +1451,7 @@ gs_plugin_update (GsPlugin *plugin,
g_autoptr(GHashTable) applist_by_flatpaks = NULL;
GHashTableIter iter;
gpointer key, value;
+ gboolean interactive = gs_plugin_has_flags (plugin, GS_PLUGIN_FLAGS_INTERACTIVE);
/* build and run transaction for each flatpak installation */
applist_by_flatpaks = _group_apps_by_installation (self, list);
@@ -1448,7 +1466,7 @@ gs_plugin_update (GsPlugin *plugin,
g_assert (gs_app_list_length (list_tmp) > 0);
gs_flatpak_set_busy (flatpak, TRUE);
- success = gs_plugin_flatpak_update (plugin, flatpak, list_tmp, cancellable, error);
+ success = gs_plugin_flatpak_update (plugin, flatpak, list_tmp, interactive, cancellable,
error);
gs_flatpak_set_busy (flatpak, FALSE);
if (!success)
return FALSE;
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]