[gnome-software: 1/2] flatpak: Cover addons on install/uninstall of the application




commit f761e61a226cbeef1b6e52740f5f777131ca7fe2
Author: Milan Crha <mcrha redhat com>
Date:   Tue Jan 26 11:29:29 2021 +0000

    flatpak: Cover addons on install/uninstall of the application
    
    When installing/uninstalling an application install/uninstall
    also its addons - those being checked for install on install,
    those being installed on uninstall.
    
    Closes https://gitlab.gnome.org/GNOME/gnome-software/-/issues/998

 plugins/flatpak/gs-flatpak.c        | 46 +++++++++++++++++++++++
 plugins/flatpak/gs-flatpak.h        |  5 +++
 plugins/flatpak/gs-plugin-flatpak.c | 74 +++++++++++++++++++++++++++++++++++++
 po/POTFILES.in                      |  1 +
 4 files changed, 126 insertions(+)
---
diff --git a/plugins/flatpak/gs-flatpak.c b/plugins/flatpak/gs-flatpak.c
index 3df3c740..9b3aa962 100644
--- a/plugins/flatpak/gs-flatpak.c
+++ b/plugins/flatpak/gs-flatpak.c
@@ -2734,6 +2734,52 @@ gs_flatpak_refine_app_unlocked (GsFlatpak *self,
        return TRUE;
 }
 
+void
+gs_flatpak_refine_addons (GsFlatpak *self,
+                         GsApp *parent_app,
+                         GsPluginRefineFlags flags,
+                         GsAppState state,
+                         GCancellable *cancellable)
+{
+       GsAppList *addons;
+       g_autoptr(GString) errors = NULL;
+       guint ii, sz;
+
+       addons = gs_app_get_addons (parent_app);
+       sz = addons ? gs_app_list_length (addons) : 0;
+
+       for (ii = 0; ii < sz; ii++) {
+               GsApp *addon = gs_app_list_index (addons, ii);
+               g_autoptr(GError) local_error = NULL;
+
+               if (state != gs_app_get_state (addon))
+                       continue;
+
+               /* To have refined also the state  */
+               gs_app_set_state (addon, GS_APP_STATE_UNKNOWN);
+
+               if (!gs_flatpak_refine_app_unlocked (self, addon, flags, cancellable, &local_error)) {
+                       if (errors)
+                               g_string_append_c (errors, '\n');
+                       else
+                               errors = g_string_new (NULL);
+                       g_string_append_printf (errors, _("Failed to refine addon ‘%s’: %s"),
+                               gs_app_get_name (addon), local_error->message);
+               }
+       }
+
+       if (errors) {
+               g_autoptr(GsPluginEvent) event = NULL;
+               g_autoptr(GError) error_local = g_error_new_literal (GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_FAILED,
+                       errors->str);
+
+               event = gs_plugin_event_new ();
+               gs_plugin_event_set_error (event, error_local);
+               gs_plugin_event_add_flag (event, GS_PLUGIN_EVENT_FLAG_WARNING);
+               gs_plugin_report_event (self->plugin, event);
+       }
+}
+
 gboolean
 gs_flatpak_refine_app (GsFlatpak *self,
                       GsApp *app,
diff --git a/plugins/flatpak/gs-flatpak.h b/plugins/flatpak/gs-flatpak.h
index e5af289e..15bdd0a0 100644
--- a/plugins/flatpak/gs-flatpak.h
+++ b/plugins/flatpak/gs-flatpak.h
@@ -58,6 +58,11 @@ gboolean     gs_flatpak_refine_app           (GsFlatpak              *self,
                                                 GsPluginRefineFlags    flags,
                                                 GCancellable           *cancellable,
                                                 GError                 **error);
+void           gs_flatpak_refine_addons        (GsFlatpak *self,
+                                                GsApp *parent_app,
+                                                GsPluginRefineFlags flags,
+                                                GsAppState state,
+                                                GCancellable *cancellable);
 gboolean       gs_flatpak_refine_app_state     (GsFlatpak              *self,
                                                 GsApp                  *app,
                                                 GCancellable           *cancellable,
diff --git a/plugins/flatpak/gs-plugin-flatpak.c b/plugins/flatpak/gs-plugin-flatpak.c
index 20ca8380..d6f0bccc 100644
--- a/plugins/flatpak/gs-plugin-flatpak.c
+++ b/plugins/flatpak/gs-plugin-flatpak.c
@@ -19,6 +19,7 @@
 
 #include <flatpak.h>
 #include <gnome-software.h>
+#include <glib/gi18n-lib.h>
 
 #include "gs-appstream.h"
 #include "gs-flatpak-app.h"
@@ -731,6 +732,69 @@ gs_plugin_download (GsPlugin *plugin, GsAppList *list,
        return TRUE;
 }
 
+static void
+gs_flatpak_cover_addons_in_transaction (GsPlugin *plugin,
+                                       FlatpakTransaction *transaction,
+                                       GsApp *parent_app,
+                                       GsAppState state)
+{
+       GsAppList *addons;
+       g_autoptr(GString) errors = NULL;
+       guint ii, sz;
+
+       g_return_if_fail (transaction != NULL);
+       g_return_if_fail (GS_IS_APP (parent_app));
+
+       addons = gs_app_get_addons (parent_app);
+       sz = addons ? gs_app_list_length (addons) : 0;
+
+       for (ii = 0; ii < sz; ii++) {
+               GsApp *addon = gs_app_list_index (addons, ii);
+               g_autoptr(GError) local_error = NULL;
+
+               if (state == GS_APP_STATE_INSTALLING && gs_app_get_to_be_installed (addon)) {
+                       g_autofree gchar *ref = NULL;
+
+                       ref = gs_flatpak_app_get_ref_display (addon);
+                       if (flatpak_transaction_add_install (transaction, gs_app_get_origin (addon), ref, 
NULL, &local_error)) {
+                               gs_app_set_state (addon, state);
+                       } else {
+                               if (errors)
+                                       g_string_append_c (errors, '\n');
+                               else
+                                       errors = g_string_new (NULL);
+                               g_string_append_printf (errors, _("Failed to add to install for addon ‘%s’: 
%s"),
+                                       gs_app_get_name (addon), local_error->message);
+                       }
+               } else if (state == GS_APP_STATE_REMOVING && gs_app_get_state (addon) == 
GS_APP_STATE_INSTALLED) {
+                       g_autofree gchar *ref = NULL;
+
+                       ref = gs_flatpak_app_get_ref_display (addon);
+                       if (flatpak_transaction_add_uninstall (transaction, ref, &local_error)) {
+                               gs_app_set_state (addon, state);
+                       } else {
+                               if (errors)
+                                       g_string_append_c (errors, '\n');
+                               else
+                                       errors = g_string_new (NULL);
+                               g_string_append_printf (errors, _("Failed to add to uninstall for addon ‘%s’: 
%s"),
+                                       gs_app_get_name (addon), local_error->message);
+                       }
+               }
+       }
+
+       if (errors) {
+               g_autoptr(GsPluginEvent) event = NULL;
+               g_autoptr(GError) error_local = g_error_new_literal (GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_FAILED,
+                       errors->str);
+
+               event = gs_plugin_event_new ();
+               gs_plugin_event_set_error (event, error_local);
+               gs_plugin_event_add_flag (event, GS_PLUGIN_EVENT_FLAG_WARNING);
+               gs_plugin_report_event (plugin, event);
+       }
+}
+
 gboolean
 gs_plugin_app_remove (GsPlugin *plugin,
                      GsApp *app,
@@ -767,6 +831,8 @@ gs_plugin_app_remove (GsPlugin *plugin,
                return FALSE;
        }
 
+       gs_flatpak_cover_addons_in_transaction (plugin, transaction, app, GS_APP_STATE_REMOVING);
+
        /* run transaction */
        gs_app_set_state (app, GS_APP_STATE_REMOVING);
        if (!gs_flatpak_transaction_run (transaction, cancellable, error)) {
@@ -787,6 +853,9 @@ gs_plugin_app_remove (GsPlugin *plugin,
                gs_flatpak_error_convert (error);
                return FALSE;
        }
+
+       gs_flatpak_refine_addons (flatpak, app, GS_PLUGIN_REFINE_FLAGS_DEFAULT, GS_APP_STATE_REMOVING, 
cancellable);
+
        return TRUE;
 }
 
@@ -920,6 +989,8 @@ 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)) {
                /* FIXME: Add additional details here, especially the download
                 * size bounds (using `size-minimum` and `size-maximum`, both
@@ -971,6 +1042,9 @@ gs_plugin_app_install (GsPlugin *plugin,
                gs_flatpak_error_convert (error);
                return FALSE;
        }
+
+       gs_flatpak_refine_addons (flatpak, app, GS_PLUGIN_REFINE_FLAGS_DEFAULT, GS_APP_STATE_INSTALLING, 
cancellable);
+
        return TRUE;
 }
 
diff --git a/po/POTFILES.in b/po/POTFILES.in
index da508666..5074fc63 100644
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -84,6 +84,7 @@ plugins/external-appstream/gs-plugin-external-appstream.c
 plugins/fedora-pkgdb-collections/gs-plugin-fedora-pkgdb-collections.c
 plugins/flatpak/org.gnome.Software.Plugin.Flatpak.metainfo.xml.in
 plugins/flatpak/gs-flatpak.c
+plugins/flatpak/gs-plugin-flatpak.c
 plugins/fwupd/gs-fwupd-app.c
 plugins/fwupd/gs-plugin-fwupd.c
 plugins/fwupd/org.gnome.Software.Plugin.Fwupd.metainfo.xml.in


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]