[gnome-software] flatpak: Create the temporary installation for each flatpakref file
- From: Richard Hughes <rhughes src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-software] flatpak: Create the temporary installation for each flatpakref file
- Date: Mon, 17 Jul 2017 16:14:07 +0000 (UTC)
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]