[gnome-software: 12/14] flatpak: Store interactive state on transactions instead of plugin




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]