[gnome-builder] flatpak: resolve branch for SDK extensions



commit 5638f4b8c1d7bad7fe333619f8cf1eb81c67d717
Author: Christian Hergert <chergert redhat com>
Date:   Tue Mar 2 15:40:53 2021 -0800

    flatpak: resolve branch for SDK extensions
    
    In case we don't get a branch for the SDK extension (which is incredibly
    common these days), we need to resolve it painstakingly.
    
    This should improve work flows such as cloning a Rust-based GNOME project
    and getting the Runtime installation dialog.
    
    Fixes #1300

 src/plugins/flatpak/gbp-flatpak-runtime-provider.c | 38 ++++++++++++++++++++++
 1 file changed, 38 insertions(+)
---
diff --git a/src/plugins/flatpak/gbp-flatpak-runtime-provider.c 
b/src/plugins/flatpak/gbp-flatpak-runtime-provider.c
index 1fa5c17e7..9b96a9fe8 100644
--- a/src/plugins/flatpak/gbp-flatpak-runtime-provider.c
+++ b/src/plugins/flatpak/gbp-flatpak-runtime-provider.c
@@ -643,6 +643,30 @@ gbp_flatpak_runtime_provider_bootstrap_install_cb (GObject      *object,
     gbp_flatpak_runtime_provider_bootstrap_complete (task);
 }
 
+static gchar *
+resolve_extension_branch (GbpFlatpakRuntimeProvider *self,
+                          const gchar               *sdk,
+                          const gchar               *extension)
+{
+  GbpFlatpakApplicationAddin *addin;
+  g_autofree gchar *resolved = NULL;
+  g_autofree gchar *branch = NULL;
+
+  g_assert (GBP_IS_FLATPAK_RUNTIME_PROVIDER (self));
+  g_assert (extension != NULL);
+
+  if (extension == NULL)
+    return NULL;
+
+  addin = gbp_flatpak_application_addin_get_default ();
+  resolved = gbp_flatpak_application_addin_resolve_extension (addin, sdk, extension);
+
+  if (resolved == NULL || !gbp_flatpak_split_id (resolved, NULL, NULL, &branch))
+    return NULL;
+
+  return g_steal_pointer (&branch);
+}
+
 static void
 gbp_flatpak_runtime_provider_bootstrap_cb (GObject      *object,
                                            GAsyncResult *result,
@@ -655,6 +679,7 @@ gbp_flatpak_runtime_provider_bootstrap_cb (GObject      *object,
   g_auto(GStrv) runtimes = NULL;
   IdeTransferManager *transfer_manager;
   BootstrapState *state;
+  const gchar *sdk;
 
   g_assert (IDE_IS_MAIN_THREAD ());
   g_assert (GBP_IS_FLATPAK_INSTALL_DIALOG (dialog));
@@ -678,6 +703,7 @@ gbp_flatpak_runtime_provider_bootstrap_cb (GObject      *object,
 
   runtimes = gbp_flatpak_install_dialog_get_runtimes (dialog);
   transfer_manager = ide_transfer_manager_get_default ();
+  sdk = gbp_flatpak_install_dialog_get_sdk (dialog);
 
   for (guint i = 0; runtimes[i]; i++)
     {
@@ -692,6 +718,9 @@ gbp_flatpak_runtime_provider_bootstrap_cb (GObject      *object,
 
           state->count++;
 
+          if (branch == NULL)
+            branch = resolve_extension_branch (self, sdk, name);
+
           transfer = gbp_flatpak_transfer_new (name, arch, branch, FALSE);
           notif = ide_transfer_create_notification (IDE_TRANSFER (transfer));
           ide_notification_attach (notif, IDE_OBJECT (self));
@@ -779,6 +808,15 @@ gbp_flatpak_runtime_provider_bootstrap_async (IdeRuntimeProvider  *provider,
   if (GBP_IS_FLATPAK_MANIFEST (state->config))
     {
       g_auto(GStrv) all = NULL;
+      g_autofree gchar *sdk_full = NULL;
+      const gchar *sdk;
+
+      /* Tell the dialog about the SDK so it can resolve common ancestors for
+       * SDK extensions missing a branch name.
+       */
+      sdk = gbp_flatpak_manifest_get_sdk (GBP_FLATPAK_MANIFEST (state->config));
+      sdk_full = g_strdup_printf ("%s/%s/%s", sdk, state->arch, state->branch);
+      gbp_flatpak_install_dialog_set_sdk (dialog, sdk_full);
 
       all = gbp_flatpak_manifest_get_runtimes (GBP_FLATPAK_MANIFEST (state->config),
                                                state->arch);


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