Blob Blame History Raw
diff -up gnome-software-3.36.1/plugins/flatpak/gs-flatpak.c.10 gnome-software-3.36.1/plugins/flatpak/gs-flatpak.c
--- gnome-software-3.36.1/plugins/flatpak/gs-flatpak.c.10	2020-05-22 16:51:19.868380300 +0200
+++ gnome-software-3.36.1/plugins/flatpak/gs-flatpak.c	2021-06-21 21:24:00.233689928 +0200
@@ -1844,12 +1844,13 @@ gs_flatpak_refine_app_state (GsFlatpak *
 }
 
 static GsApp *
-gs_flatpak_create_runtime (GsFlatpak *self, GsApp *parent, const gchar *runtime)
+gs_flatpak_create_runtime (GsFlatpak *self, GsApp *parent, const gchar *runtime, GCancellable *cancellable)
 {
 	g_autofree gchar *source = NULL;
 	g_auto(GStrv) split = NULL;
 	g_autoptr(GsApp) app_cache = NULL;
 	g_autoptr(GsApp) app = NULL;
+	const gchar *origin;
 
 	/* get the name/arch/branch */
 	split = g_strsplit (runtime, "/", -1);
@@ -1864,6 +1865,24 @@ gs_flatpak_create_runtime (GsFlatpak *se
 	gs_app_set_kind (app, AS_APP_KIND_RUNTIME);
 	gs_app_set_branch (app, split[2]);
 
+	origin = gs_app_get_origin (parent);
+	if (origin != NULL) {
+		g_autoptr(FlatpakRemoteRef) xref = NULL;
+
+		xref = flatpak_installation_fetch_remote_ref_sync (self->installation,
+								   origin,
+								   FLATPAK_REF_KIND_RUNTIME,
+								   gs_app_get_id (app),
+								   gs_flatpak_app_get_ref_arch (parent),
+								   gs_app_get_branch (app),
+								   cancellable,
+								   NULL);
+
+		/* Prefer runtime from the same origin as the parent application */
+		if (xref)
+			gs_app_set_origin (app, origin);
+	}
+
 	/* search in the cache */
 	app_cache = gs_plugin_cache_lookup (self->plugin, gs_app_get_unique_id (app));
 	if (app_cache != NULL) {
@@ -1898,6 +1917,7 @@ gs_flatpak_set_app_metadata (GsFlatpak *
 			     GsApp *app,
 			     const gchar *data,
 			     gsize length,
+			     GCancellable *cancellable,
 			     GError **error)
 {
 	gboolean secure = TRUE;
@@ -1951,7 +1971,7 @@ gs_flatpak_set_app_metadata (GsFlatpak *
 		gs_app_add_kudo (app, GS_APP_KUDO_SANDBOXED_SECURE);
 
 	/* create runtime */
-	app_runtime = gs_flatpak_create_runtime (self, app, runtime);
+	app_runtime = gs_flatpak_create_runtime (self, app, runtime, cancellable);
 	if (app_runtime != NULL) {
 		gs_plugin_refine_item_scope (self, app_runtime);
 		gs_app_set_runtime (app, app_runtime);
@@ -2046,7 +2066,7 @@ gs_plugin_refine_item_metadata (GsFlatpa
 	}
 
 	/* parse key file */
-	if (!gs_flatpak_set_app_metadata (self, app, str, len, error))
+	if (!gs_flatpak_set_app_metadata (self, app, str, len, cancellable, error))
 		return FALSE;
 	return TRUE;
 }
@@ -2506,6 +2526,7 @@ gs_flatpak_file_to_app_bundle (GsFlatpak
 	if (!gs_flatpak_set_app_metadata (self, app,
 					  g_bytes_get_data (metadata, NULL),
 					  g_bytes_get_size (metadata),
+					  cancellable,
 					  error))
 		return NULL;
 
diff -up gnome-software-3.36.1/plugins/flatpak/gs-plugin-flatpak.c.10 gnome-software-3.36.1/plugins/flatpak/gs-plugin-flatpak.c
--- gnome-software-3.36.1/plugins/flatpak/gs-plugin-flatpak.c.10	2021-06-21 20:38:42.585590510 +0200
+++ gnome-software-3.36.1/plugins/flatpak/gs-plugin-flatpak.c	2021-06-21 21:23:00.977665979 +0200
@@ -852,6 +852,36 @@ gs_plugin_app_install (GsPlugin *plugin,
 						      ref, NULL, error)) {
 			gs_flatpak_error_convert (error);
 			return FALSE;
+		} else {
+			GsApp *runtime;
+
+			runtime = gs_app_get_runtime (app);
+			if (runtime != NULL && gs_app_get_origin (runtime) != NULL) {
+				g_autoptr(FlatpakInstalledRef) runtime_ref = NULL;
+
+				runtime_ref = flatpak_installation_get_installed_ref (gs_flatpak_get_installation (flatpak),
+						gs_flatpak_app_get_ref_kind (runtime),
+						gs_flatpak_app_get_ref_name (runtime),
+						gs_flatpak_app_get_ref_arch (runtime),
+						gs_app_get_branch (runtime),
+						cancellable,
+						NULL);
+				if (runtime_ref == NULL) {
+					g_autoptr(GError) error_local = NULL;
+
+					g_clear_pointer (&ref, g_free);
+					ref = gs_flatpak_app_get_ref_display (runtime);
+					if (!flatpak_transaction_add_install (transaction, gs_app_get_origin (runtime), ref, NULL, &error_local)) {
+						if (g_error_matches (error_local, FLATPAK_ERROR, FLATPAK_ERROR_ALREADY_INSTALLED)) {
+							g_clear_error (&error_local);
+						} else {
+							g_propagate_error (error, g_steal_pointer (&error_local));
+							gs_flatpak_error_convert (error);
+							return FALSE;
+						}
+					}
+				}
+			}
 		}
 	}