[gnome-software] flatpak: Create the temporary installation for each flatpakref file



commit 1bf68ec21cd9538ba016b056e1bcd72b1b38a3c5
Author: Richard Hughes <richard hughsie com>
Date:   Thu Jul 13 12:57:32 2017 +0100

    flatpak: Create the temporary installation for each flatpakref file
    
    This allows us to remove a lot of complexity from the plugin.

 plugins/flatpak/gs-flatpak.c        |   56 +++------------
 plugins/flatpak/gs-flatpak.h        |    4 +-
 plugins/flatpak/gs-plugin-flatpak.c |  131 +++++++++--------------------------
 3 files changed, 44 insertions(+), 147 deletions(-)
---
diff --git a/plugins/flatpak/gs-flatpak.c b/plugins/flatpak/gs-flatpak.c
index 7caa726..f807a06 100644
--- a/plugins/flatpak/gs-flatpak.c
+++ b/plugins/flatpak/gs-flatpak.c
@@ -103,7 +103,10 @@ gs_flatpak_set_metadata (GsFlatpak *self, GsApp *app, FlatpakRef *xref)
        gs_app_set_flatpak_arch (app, flatpak_ref_get_arch (xref));
        gs_app_set_flatpak_branch (app, flatpak_ref_get_branch (xref));
        gs_app_set_flatpak_commit (app, flatpak_ref_get_commit (xref));
-       gs_app_set_flatpak_object_id (app, gs_flatpak_get_id (self));
+
+       /* ony when we have a non-temp object */
+       if ((self->flags & GS_FLATPAK_FLAG_IS_TEMPORARY) == 0)
+               gs_app_set_flatpak_object_id (app, gs_flatpak_get_id (self));
 
        /* do this once for all objects */
        ref_display = flatpak_ref_format_ref (xref);
@@ -625,10 +628,6 @@ gs_flatpak_refresh_appstream (GsFlatpak *self, guint cache_age,
                                  gs_flatpak_get_id (self));
        g_assert (ptask != NULL);
 
-       /* do not care */
-       if (self->flags & GS_FLATPAK_FLAG_IS_TEMPORARY)
-               return TRUE;
-
        /* get remotes */
        xremotes = flatpak_installation_list_remotes (self->installation,
                                                      cancellable,
@@ -3051,34 +3050,6 @@ gs_flatpak_file_to_app_ref (GsFlatpak *self,
                return NULL;
        }
 
-       /* remove old version from the remote config */
-       if (self->flags & GS_FLATPAK_FLAG_IS_TEMPORARY) {
-               g_autofree gchar *remote_id_tmp = NULL;
-               g_autofree gchar *remote_name_tmp = NULL;
-               g_autoptr(FlatpakRemote) xremote_tmp = NULL;
-               remote_name_tmp = g_strdup_printf ("%s-origin", ref_name);
-               xremote_tmp = flatpak_installation_get_remote_by_name (self->installation,
-                                                                      remote_name_tmp,
-                                                                      cancellable,
-                                                                      NULL);
-               if (xremote_tmp != NULL) {
-                       g_debug ("removing previous remote %s", remote_name_tmp);
-                       if (!flatpak_installation_remove_remote (self->installation,
-                                                                remote_name_tmp,
-                                                                cancellable,
-                                                                error)) {
-                               gs_flatpak_error_convert (error);
-                               return NULL;
-                       }
-               } else {
-                       g_debug ("no previous %s remote to remove", remote_name_tmp);
-               }
-
-               /* remove from the store */
-               remote_id_tmp = g_strdup_printf ("%s.desktop", ref_name);
-               as_store_remove_app_by_id (self->store, remote_id_tmp);
-       }
-
        /* install the remote, but not the app */
        ref_file_data = g_bytes_new (contents, len);
        xref = flatpak_installation_install_ref_file (self->installation,
@@ -3163,6 +3134,10 @@ gs_flatpak_file_to_app_ref (GsFlatpak *self,
        if (!gs_flatpak_add_apps_from_xremote (self, xremote, cancellable, error))
                return NULL;
 
+       /* get extra AppStream data if available */
+       if (!gs_flatpak_refine_appstream (self, app, error))
+               return FALSE;
+
        /* success */
        return g_steal_pointer (&app);
 }
@@ -3269,18 +3244,6 @@ gs_flatpak_get_scope (GsFlatpak *self)
        return self->scope;
 }
 
-void
-gs_flatpak_set_flags (GsFlatpak *self, GsFlatpakFlags flags)
-{
-       self->flags = flags;
-}
-
-GsFlatpakFlags
-gs_flatpak_get_flags (GsFlatpak *self)
-{
-       return self->flags;
-}
-
 static void
 gs_flatpak_finalize (GObject *object)
 {
@@ -3333,7 +3296,7 @@ gs_flatpak_init (GsFlatpak *self)
 }
 
 GsFlatpak *
-gs_flatpak_new (GsPlugin *plugin, FlatpakInstallation *installation)
+gs_flatpak_new (GsPlugin *plugin, FlatpakInstallation *installation, GsFlatpakFlags flags)
 {
        GsFlatpak *self;
        self = g_object_new (GS_TYPE_FLATPAK, NULL);
@@ -3341,5 +3304,6 @@ gs_flatpak_new (GsPlugin *plugin, FlatpakInstallation *installation)
        self->scope = flatpak_installation_get_is_user (installation)
                                ? AS_APP_SCOPE_USER : AS_APP_SCOPE_SYSTEM;
        self->plugin = g_object_ref (plugin);
+       self->flags = flags;
        return GS_FLATPAK (self);
 }
diff --git a/plugins/flatpak/gs-flatpak.h b/plugins/flatpak/gs-flatpak.h
index aa07ed9..a68ba7a 100644
--- a/plugins/flatpak/gs-flatpak.h
+++ b/plugins/flatpak/gs-flatpak.h
@@ -40,10 +40,8 @@ typedef enum {
 } GsFlatpakFlags;
 
 GsFlatpak      *gs_flatpak_new                 (GsPlugin               *plugin,
-                                                FlatpakInstallation    *installation);
-void           gs_flatpak_set_flags            (GsFlatpak              *self,
+                                                FlatpakInstallation    *installation,
                                                 GsFlatpakFlags          flags);
-GsFlatpakFlags gs_flatpak_get_flags            (GsFlatpak              *self);
 AsAppScope     gs_flatpak_get_scope            (GsFlatpak              *self);
 const gchar    *gs_flatpak_get_id              (GsFlatpak              *self);
 gboolean       gs_flatpak_setup                (GsFlatpak              *self,
diff --git a/plugins/flatpak/gs-plugin-flatpak.c b/plugins/flatpak/gs-plugin-flatpak.c
index 77a0012..4b5ab9e 100644
--- a/plugins/flatpak/gs-plugin-flatpak.c
+++ b/plugins/flatpak/gs-plugin-flatpak.c
@@ -106,7 +106,6 @@ gs_plugin_adopt_app (GsPlugin *plugin, GsApp *app)
 static gboolean
 gs_plugin_flatpak_add_installation (GsPlugin *plugin,
                                    FlatpakInstallation *installation,
-                                   GsFlatpakFlags flags,
                                    GCancellable *cancellable,
                                    GError **error)
 {
@@ -119,8 +118,7 @@ gs_plugin_flatpak_add_installation (GsPlugin *plugin,
        g_assert (ptask != NULL);
 
        /* create and set up */
-       flatpak = gs_flatpak_new (plugin, installation);
-       gs_flatpak_set_flags (flatpak, flags);
+       flatpak = gs_flatpak_new (plugin, installation, GS_FLATPAK_FLAG_NONE);
        if (!gs_flatpak_setup (flatpak, cancellable, error))
                return FALSE;
        g_debug ("successfully set up %s", gs_flatpak_get_id (flatpak));
@@ -149,7 +147,6 @@ gs_plugin_setup (GsPlugin *plugin, GCancellable *cancellable, GError **error)
                for (guint i = 0; i < installations->len; i++) {
                        FlatpakInstallation *installation = g_ptr_array_index (installations, i);
                        if (!gs_plugin_flatpak_add_installation (plugin, installation,
-                                                                GS_FLATPAK_FLAG_NONE,
                                                                 cancellable, error)) {
                                return FALSE;
                        }
@@ -172,7 +169,6 @@ gs_plugin_setup (GsPlugin *plugin, GCancellable *cancellable, GError **error)
                        return FALSE;
                }
                if (!gs_plugin_flatpak_add_installation (plugin, installation,
-                                                        GS_FLATPAK_FLAG_NONE,
                                                         cancellable, error)) {
                        return FALSE;
                }
@@ -187,34 +183,6 @@ gs_plugin_setup (GsPlugin *plugin, GCancellable *cancellable, GError **error)
                        return FALSE;
                }
                if (!gs_plugin_flatpak_add_installation (plugin, installation,
-                                                        GS_FLATPAK_FLAG_NONE,
-                                                        cancellable, error)) {
-                       return FALSE;
-               }
-       }
-
-       /* add temporary installation for flatpakref files */
-       if (TRUE) {
-               g_autofree gchar *installation_path = NULL;
-               g_autoptr(FlatpakInstallation) installation = NULL;
-               g_autoptr(GFile) installation_file = NULL;
-               installation_path = gs_utils_get_cache_filename ("flatpak",
-                                                                "installation-tmp",
-                                                                GS_UTILS_CACHE_FLAG_WRITEABLE,
-                                                                error);
-               if (installation_path == NULL)
-                       return FALSE;
-               installation_file = g_file_new_for_path (installation_path);
-               installation = flatpak_installation_new_for_path (installation_file,
-                                                                 TRUE, /* user */
-                                                                 cancellable,
-                                                                 error);
-               if (installation == NULL) {
-                       gs_flatpak_error_convert (error);
-                       return FALSE;
-               }
-               if (!gs_plugin_flatpak_add_installation (plugin, installation,
-                                                        GS_FLATPAK_FLAG_IS_TEMPORARY,
                                                         cancellable, error)) {
                        return FALSE;
                }
@@ -232,8 +200,6 @@ gs_plugin_add_installed (GsPlugin *plugin,
        GsPluginData *priv = gs_plugin_get_data (plugin);
        for (guint i = 0; i < priv->flatpaks->len; i++) {
                GsFlatpak *flatpak = g_ptr_array_index (priv->flatpaks, i);
-               if (gs_flatpak_get_flags (flatpak) & GS_FLATPAK_FLAG_IS_TEMPORARY)
-                       continue;
                if (!gs_flatpak_add_installed (flatpak, list, cancellable, error))
                        return FALSE;
        }
@@ -249,8 +215,6 @@ gs_plugin_add_sources (GsPlugin *plugin,
        GsPluginData *priv = gs_plugin_get_data (plugin);
        for (guint i = 0; i < priv->flatpaks->len; i++) {
                GsFlatpak *flatpak = g_ptr_array_index (priv->flatpaks, i);
-               if (gs_flatpak_get_flags (flatpak) & GS_FLATPAK_FLAG_IS_TEMPORARY)
-                       continue;
                if (!gs_flatpak_add_sources (flatpak, list, cancellable, error))
                        return FALSE;
        }
@@ -266,8 +230,6 @@ gs_plugin_add_updates (GsPlugin *plugin,
        GsPluginData *priv = gs_plugin_get_data (plugin);
        for (guint i = 0; i < priv->flatpaks->len; i++) {
                GsFlatpak *flatpak = g_ptr_array_index (priv->flatpaks, i);
-               if (gs_flatpak_get_flags (flatpak) & GS_FLATPAK_FLAG_IS_TEMPORARY)
-                       continue;
                if (!gs_flatpak_add_updates (flatpak, list, cancellable, error))
                        return FALSE;
        }
@@ -283,8 +245,6 @@ gs_plugin_add_updates_pending (GsPlugin *plugin,
        GsPluginData *priv = gs_plugin_get_data (plugin);
        for (guint i = 0; i < priv->flatpaks->len; i++) {
                GsFlatpak *flatpak = g_ptr_array_index (priv->flatpaks, i);
-               if (gs_flatpak_get_flags (flatpak) & GS_FLATPAK_FLAG_IS_TEMPORARY)
-                       continue;
                if (!gs_flatpak_add_updates_pending (flatpak, list,
                                                     cancellable, error)) {
                        return FALSE;
@@ -303,8 +263,6 @@ gs_plugin_refresh (GsPlugin *plugin,
        GsPluginData *priv = gs_plugin_get_data (plugin);
        for (guint i = 0; i < priv->flatpaks->len; i++) {
                GsFlatpak *flatpak = g_ptr_array_index (priv->flatpaks, i);
-               if (gs_flatpak_get_flags (flatpak) & GS_FLATPAK_FLAG_IS_TEMPORARY)
-                       continue;
                if (!gs_flatpak_refresh (flatpak, cache_age, flags,
                                         cancellable, error)) {
                        return FALSE;
@@ -374,8 +332,6 @@ gs_plugin_refine_wildcard (GsPlugin *plugin,
        GsPluginData *priv = gs_plugin_get_data (plugin);
        for (guint i = 0; i < priv->flatpaks->len; i++) {
                GsFlatpak *flatpak = g_ptr_array_index (priv->flatpaks, i);
-               if (gs_flatpak_get_flags (flatpak) & GS_FLATPAK_FLAG_IS_TEMPORARY)
-                       continue;
                if (!gs_flatpak_refine_wildcard (flatpak, app, list, flags,
                                                 cancellable, error)) {
                        return FALSE;
@@ -415,18 +371,12 @@ gs_plugin_app_install (GsPlugin *plugin,
                       GError **error)
 {
        GsPluginData *priv = gs_plugin_get_data (plugin);
-       GsFlatpak *flatpak = gs_plugin_flatpak_get_handler (plugin, app);
-       if (flatpak == NULL)
-               return TRUE;
+       GsFlatpak *flatpak;
 
-       /* reset the temporary GsFlatpak object ID */
-       if (gs_flatpak_get_flags (flatpak) & GS_FLATPAK_FLAG_IS_TEMPORARY) {
+       /* set the app scope */
+       if (gs_app_get_scope (app) == AS_APP_SCOPE_UNKNOWN) {
                g_autoptr(GSettings) settings = g_settings_new ("org.gnome.software");
 
-               /* no longer valid */
-               g_debug ("resetting temporary object ID");
-               gs_app_set_flatpak_object_id (app, NULL);
-
                /* get the new GsFlatpak for handling of local files */
                gs_app_set_scope (app, g_settings_get_boolean (settings, "install-bundles-system-wide") ?
                                        AS_APP_SCOPE_SYSTEM : AS_APP_SCOPE_USER);
@@ -438,12 +388,12 @@ gs_plugin_app_install (GsPlugin *plugin,
                        g_debug ("in self tests, using user");
                        gs_app_set_scope (app, AS_APP_SCOPE_USER);
                }
-               flatpak = gs_plugin_flatpak_get_handler (plugin, app);
-               if (flatpak == NULL)
-                       return TRUE;
        }
 
        /* actually install */
+       flatpak = gs_plugin_flatpak_get_handler (plugin, app);
+       if (flatpak == NULL)
+               return TRUE;
        return gs_flatpak_app_install (flatpak, app, cancellable, error);
 }
 
@@ -479,8 +429,6 @@ gs_plugin_flatpak_file_to_app_repo (GsPlugin *plugin,
        list_tmp = gs_app_list_new ();
        for (guint i = 0; i < priv->flatpaks->len; i++) {
                GsFlatpak *flatpak = g_ptr_array_index (priv->flatpaks, i);
-               if (gs_flatpak_get_flags (flatpak) & GS_FLATPAK_FLAG_IS_TEMPORARY)
-                       continue;
                if (!gs_flatpak_find_source_by_url (flatpak,
                                                    gs_app_get_metadata_item (app_tmp, "flatpak::url"),
                                                    list_tmp, cancellable, error))
@@ -508,15 +456,30 @@ gs_plugin_flatpak_file_to_app_repo (GsPlugin *plugin,
 }
 
 static GsFlatpak *
-gs_plugin_flatpak_find_temporary (GsPlugin *plugin)
+gs_plugin_flatpak_create_temporary (GsPlugin *plugin, GCancellable *cancellable, GError **error)
 {
-       GsPluginData *priv = gs_plugin_get_data (plugin);
-       for (guint i = 0; i < priv->flatpaks->len; i++) {
-               GsFlatpak *flatpak = g_ptr_array_index (priv->flatpaks, i);
-               if (gs_flatpak_get_flags (flatpak) & GS_FLATPAK_FLAG_IS_TEMPORARY)
-                       return flatpak;
+       g_autofree gchar *installation_path = NULL;
+       g_autoptr(FlatpakInstallation) installation = NULL;
+       g_autoptr(GFile) installation_file = NULL;
+
+       /* create new per-user installation in a cache dir */
+       installation_path = gs_utils_get_cache_filename ("flatpak",
+                                                        "installation-tmp",
+                                                        GS_UTILS_CACHE_FLAG_WRITEABLE |
+                                                        GS_UTILS_CACHE_FLAG_ENSURE_EMPTY,
+                                                        error);
+       if (installation_path == NULL)
+               return NULL;
+       installation_file = g_file_new_for_path (installation_path);
+       installation = flatpak_installation_new_for_path (installation_file,
+                                                         TRUE, /* user */
+                                                         cancellable,
+                                                         error);
+       if (installation == NULL) {
+               gs_flatpak_error_convert (error);
+               return NULL;
        }
-       return NULL;
+       return gs_flatpak_new (plugin, installation, GS_FLATPAK_FLAG_IS_TEMPORARY);
 }
 
 static gboolean
@@ -532,14 +495,9 @@ gs_plugin_flatpak_file_to_app_bundle (GsPlugin *plugin,
        g_autoptr(GsAppList) list_tmp = NULL;
 
        /* only use the temporary GsFlatpak to avoid the auth dialog */
-       flatpak_tmp = gs_plugin_flatpak_find_temporary (plugin);
-       if (flatpak_tmp == NULL) {
-               g_set_error_literal (error,
-                                    GS_PLUGIN_ERROR,
-                                    GS_PLUGIN_ERROR_NOT_SUPPORTED,
-                                    "no temporary scope for bundle install");
+       flatpak_tmp = gs_plugin_flatpak_create_temporary (plugin, cancellable, error);
+       if (flatpak_tmp == NULL)
                return FALSE;
-       }
 
        /* add object */
        app_tmp = gs_flatpak_file_to_app_bundle (flatpak_tmp, file, cancellable, error);
@@ -550,8 +508,6 @@ gs_plugin_flatpak_file_to_app_bundle (GsPlugin *plugin,
        list_tmp = gs_app_list_new ();
        for (guint i = 0; i < priv->flatpaks->len; i++) {
                GsFlatpak *flatpak = g_ptr_array_index (priv->flatpaks, i);
-               if (gs_flatpak_get_flags (flatpak) & GS_FLATPAK_FLAG_IS_TEMPORARY)
-                       continue;
                if (!gs_flatpak_find_app_by_ref_display (flatpak,
                                                         gs_app_get_flatpak_ref_display (app_tmp),
                                                         list_tmp, cancellable, error))
@@ -591,14 +547,9 @@ gs_plugin_flatpak_file_to_app_ref (GsPlugin *plugin,
        g_autoptr(GsAppList) list_tmp = NULL;
 
        /* only use the temporary GsFlatpak to avoid the auth dialog */
-       flatpak_tmp = gs_plugin_flatpak_find_temporary (plugin);
-       if (flatpak_tmp == NULL) {
-               g_set_error_literal (error,
-                                    GS_PLUGIN_ERROR,
-                                    GS_PLUGIN_ERROR_NOT_SUPPORTED,
-                                    "no temporary scope for bundle install");
+       flatpak_tmp = gs_plugin_flatpak_create_temporary (plugin, cancellable, error);
+       if (flatpak_tmp == NULL)
                return FALSE;
-       }
 
        /* add object */
        app_tmp = gs_flatpak_file_to_app_ref (flatpak_tmp, file, cancellable, error);
@@ -609,8 +560,6 @@ gs_plugin_flatpak_file_to_app_ref (GsPlugin *plugin,
        list_tmp = gs_app_list_new ();
        for (guint i = 0; i < priv->flatpaks->len; i++) {
                GsFlatpak *flatpak = g_ptr_array_index (priv->flatpaks, i);
-               if (gs_flatpak_get_flags (flatpak) & GS_FLATPAK_FLAG_IS_TEMPORARY)
-                       continue;
                if (!gs_flatpak_find_app_by_ref_display (flatpak,
                                                         gs_app_get_flatpak_ref_display (app_tmp),
                                                         list_tmp, cancellable, error))
@@ -637,8 +586,6 @@ gs_plugin_flatpak_file_to_app_ref (GsPlugin *plugin,
                g_autoptr(GsAppList) list_system_runtimes = gs_app_list_new ();
                for (guint i = 0; i < priv->flatpaks->len; i++) {
                        GsFlatpak *flatpak = g_ptr_array_index (priv->flatpaks, i);
-                       if (gs_flatpak_get_flags (flatpak) & GS_FLATPAK_FLAG_IS_TEMPORARY)
-                               continue;
                        if (gs_flatpak_get_scope (flatpak) != AS_APP_SCOPE_SYSTEM)
                                continue;
                        if (!gs_flatpak_find_app_by_ref_display (flatpak,
@@ -721,8 +668,6 @@ gs_plugin_add_search (GsPlugin *plugin,
        GsPluginData *priv = gs_plugin_get_data (plugin);
        for (guint i = 0; i < priv->flatpaks->len; i++) {
                GsFlatpak *flatpak = g_ptr_array_index (priv->flatpaks, i);
-               if (gs_flatpak_get_flags (flatpak) & GS_FLATPAK_FLAG_IS_TEMPORARY)
-                       continue;
                if (!gs_flatpak_search (flatpak, values, list,
                                        cancellable, error)) {
                        return FALSE;
@@ -740,8 +685,6 @@ gs_plugin_add_categories (GsPlugin *plugin,
        GsPluginData *priv = gs_plugin_get_data (plugin);
        for (guint i = 0; i < priv->flatpaks->len; i++) {
                GsFlatpak *flatpak = g_ptr_array_index (priv->flatpaks, i);
-               if (gs_flatpak_get_flags (flatpak) & GS_FLATPAK_FLAG_IS_TEMPORARY)
-                       continue;
                if (!gs_flatpak_add_categories (flatpak, list, cancellable, error))
                        return FALSE;
        }
@@ -758,8 +701,6 @@ gs_plugin_add_category_apps (GsPlugin *plugin,
        GsPluginData *priv = gs_plugin_get_data (plugin);
        for (guint i = 0; i < priv->flatpaks->len; i++) {
                GsFlatpak *flatpak = g_ptr_array_index (priv->flatpaks, i);
-               if (gs_flatpak_get_flags (flatpak) & GS_FLATPAK_FLAG_IS_TEMPORARY)
-                       continue;
                if (!gs_flatpak_add_category_apps (flatpak,
                                                   category,
                                                   list,
@@ -780,8 +721,6 @@ gs_plugin_add_popular (GsPlugin *plugin,
        GsPluginData *priv = gs_plugin_get_data (plugin);
        for (guint i = 0; i < priv->flatpaks->len; i++) {
                GsFlatpak *flatpak = g_ptr_array_index (priv->flatpaks, i);
-               if (gs_flatpak_get_flags (flatpak) & GS_FLATPAK_FLAG_IS_TEMPORARY)
-                       continue;
                if (!gs_flatpak_add_popular (flatpak, list, cancellable, error))
                        return FALSE;
        }
@@ -797,8 +736,6 @@ gs_plugin_add_featured (GsPlugin *plugin,
        GsPluginData *priv = gs_plugin_get_data (plugin);
        for (guint i = 0; i < priv->flatpaks->len; i++) {
                GsFlatpak *flatpak = g_ptr_array_index (priv->flatpaks, i);
-               if (gs_flatpak_get_flags (flatpak) & GS_FLATPAK_FLAG_IS_TEMPORARY)
-                       continue;
                if (!gs_flatpak_add_featured (flatpak, list, cancellable, error))
                        return FALSE;
        }
@@ -815,8 +752,6 @@ gs_plugin_add_recent (GsPlugin *plugin,
        GsPluginData *priv = gs_plugin_get_data (plugin);
        for (guint i = 0; i < priv->flatpaks->len; i++) {
                GsFlatpak *flatpak = g_ptr_array_index (priv->flatpaks, i);
-               if (gs_flatpak_get_flags (flatpak) & GS_FLATPAK_FLAG_IS_TEMPORARY)
-                       continue;
                if (!gs_flatpak_add_recent (flatpak, list, age, cancellable, error))
                        return FALSE;
        }


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