[gnome-software: 1/2] flatpak: Cover addons on install/uninstall of the application
- From: Philip Withnall <pwithnall src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-software: 1/2] flatpak: Cover addons on install/uninstall of the application
- Date: Tue, 26 Jan 2021 11:29:30 +0000 (UTC)
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]