[gnome-builder/wip/gtk4-port] libide/foundry: use flatpak-spawn for host execution
- From: Christian Hergert <chergert src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-builder/wip/gtk4-port] libide/foundry: use flatpak-spawn for host execution
- Date: Wed, 22 Jun 2022 18:58:37 +0000 (UTC)
commit 6eb90979bf441c89afebebe2f2ba552b1c894a2b
Author: Christian Hergert <chergert redhat com>
Date: Wed Jun 22 11:56:51 2022 -0700
libide/foundry: use flatpak-spawn for host execution
Rather than using our IdeSubprocessLauncher with a "run-on-host", we can
use "flatpak-spawn" as another layer to the run context.
There may be an opportunity to completely remove IdeSubprocessLauncher by
converting API usage to IdeRunContext if we add a spawn API.
src/libide/foundry/ide-run-context.c | 97 +++++++++++++++++++++++++------
src/libide/foundry/ide-run-context.h | 5 +-
src/plugins/flatpak/gbp-flatpak-runtime.c | 6 +-
3 files changed, 83 insertions(+), 25 deletions(-)
---
diff --git a/src/libide/foundry/ide-run-context.c b/src/libide/foundry/ide-run-context.c
index 26e9b0228..5d52c20fd 100644
--- a/src/libide/foundry/ide-run-context.c
+++ b/src/libide/foundry/ide-run-context.c
@@ -48,7 +48,6 @@ struct _IdeRunContext
GQueue layers;
IdeRunContextLayer root;
guint ended : 1;
- guint run_on_host : 1;
};
G_DEFINE_FINAL_TYPE (IdeRunContext, ide_run_context, G_TYPE_OBJECT)
@@ -169,6 +168,84 @@ ide_run_context_push (IdeRunContext *self,
g_queue_push_head_link (&self->layers, &layer->qlink);
}
+static gboolean
+ide_run_context_host_handler (IdeRunContext *self,
+ const char * const *argv,
+ const char * const *env,
+ const char *cwd,
+ IdeUnixFDMap *unix_fd_map,
+ gpointer user_data,
+ GError **error)
+{
+ guint length;
+
+ g_assert (IDE_IS_RUN_CONTEXT (self));
+ g_assert (argv != NULL);
+ g_assert (env != NULL);
+ g_assert (IDE_IS_UNIX_FD_MAP (unix_fd_map));
+ g_assert (ide_is_flatpak ());
+
+ ide_run_context_append_argv (self, "flatpak-spawn");
+ ide_run_context_append_argv (self, "--host");
+ ide_run_context_append_argv (self, "--clear-env");
+ ide_run_context_append_argv (self, "--share-pids");
+ ide_run_context_append_argv (self, "--watch-bus");
+
+ if (env != NULL)
+ {
+ for (guint i = 0; env[i]; i++)
+ ide_run_context_append_formatted (self, "--env=%s", env[i]);
+ }
+
+ if (cwd != NULL)
+ ide_run_context_append_formatted (self, "--directory=%s", cwd);
+
+ if ((length = ide_unix_fd_map_get_length (unix_fd_map)))
+ {
+ if (!ide_run_context_merge_unix_fd_map (self, unix_fd_map, error))
+ return FALSE;
+
+ for (guint i = 0; i < length; i++)
+ {
+ int source_fd;
+ int dest_fd;
+
+ source_fd = ide_unix_fd_map_peek (unix_fd_map, i, &dest_fd);
+
+ if (source_fd != -1 && dest_fd != -1)
+ ide_run_context_append_formatted (self, "--forward-fd=%d", dest_fd);
+ }
+ }
+
+ /* Now append the arguments */
+ ide_run_context_append_args (self, argv);
+
+ return TRUE;
+}
+
+/**
+ * ide_run_context_push_host:
+ * @self: a #IdeRunContext
+ *
+ * Pushes handler to transform command to run on host.
+ *
+ * If necessary, a layer is pushed to ensure the command is run on the
+ * host instead of the application container.
+ *
+ * If Builder is running on the host already, this function does nothing.
+ */
+void
+ide_run_context_push_host (IdeRunContext *self)
+{
+ g_return_if_fail (IDE_IS_RUN_CONTEXT (self));
+
+ if (ide_is_flatpak ())
+ ide_run_context_push (self,
+ ide_run_context_host_handler,
+ NULL,
+ NULL);
+}
+
const char * const *
ide_run_context_get_argv (IdeRunContext *self)
{
@@ -280,23 +357,6 @@ ide_run_context_add_environ (IdeRunContext *self,
}
}
-gboolean
-ide_run_context_get_run_on_host (IdeRunContext *self)
-{
- g_return_val_if_fail (IDE_IS_RUN_CONTEXT (self), FALSE);
-
- return self->run_on_host;
-}
-
-void
-ide_run_context_set_run_on_host (IdeRunContext *self,
- gboolean run_on_host)
-{
- g_return_if_fail (IDE_IS_RUN_CONTEXT (self));
-
- self->run_on_host = !!run_on_host;
-}
-
const char *
ide_run_context_get_cwd (IdeRunContext *self)
{
@@ -716,7 +776,6 @@ ide_run_context_end (IdeRunContext *self,
ide_subprocess_launcher_set_argv (launcher, ide_run_context_get_argv (self));
ide_subprocess_launcher_set_environ (launcher, ide_run_context_get_environ (self));
ide_subprocess_launcher_set_cwd (launcher, cwd);
- ide_subprocess_launcher_set_run_on_host (launcher, self->run_on_host);
return g_steal_pointer (&launcher);
}
diff --git a/src/libide/foundry/ide-run-context.h b/src/libide/foundry/ide-run-context.h
index 8ad40a3d4..8695448c7 100644
--- a/src/libide/foundry/ide-run-context.h
+++ b/src/libide/foundry/ide-run-context.h
@@ -54,10 +54,7 @@ void ide_run_context_push (IdeRunContext
gpointer handler_data,
GDestroyNotify handler_data_destroy);
IDE_AVAILABLE_IN_ALL
-gboolean ide_run_context_get_run_on_host (IdeRunContext *self);
-IDE_AVAILABLE_IN_ALL
-void ide_run_context_set_run_on_host (IdeRunContext *self,
- gboolean run_on_host);
+void ide_run_context_push_host (IdeRunContext *self);
IDE_AVAILABLE_IN_ALL
const char * const *ide_run_context_get_argv (IdeRunContext *self);
IDE_AVAILABLE_IN_ALL
diff --git a/src/plugins/flatpak/gbp-flatpak-runtime.c b/src/plugins/flatpak/gbp-flatpak-runtime.c
index dcb5d28cf..d5065cfa8 100644
--- a/src/plugins/flatpak/gbp-flatpak-runtime.c
+++ b/src/plugins/flatpak/gbp-flatpak-runtime.c
@@ -360,8 +360,6 @@ gbp_flatpak_runtime_handle_run_context_cb (IdeRunContext *run_context,
g_assert (IDE_IS_RUN_CONTEXT (run_context));
g_assert (IDE_IS_UNIX_FD_MAP (unix_fd_map));
- ide_run_context_set_run_on_host (run_context, TRUE);
-
/* Pass through the FD mappings */
if (!ide_run_context_merge_unix_fd_map (run_context, unix_fd_map, error))
return FALSE;
@@ -456,6 +454,10 @@ gbp_flatpak_runtime_prepare_run_context (IdeRuntime *runtime,
g_assert (GBP_IS_FLATPAK_RUNTIME (runtime));
g_assert (IDE_IS_RUN_CONTEXT (run_context));
+ /* We have to run "flatpak build" from the host */
+ ide_run_context_push_host (run_context);
+
+ /* Handle the upper layer to rewrite the command using "flatpak build" */
ide_run_context_push (run_context,
gbp_flatpak_runtime_handle_run_context_cb,
g_object_ref (runtime),
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]