[gnome-builder] configuration: add prebuild/postbuild options to buildconfig



commit 3776260df55fce2fc9b9a523fd860a1161ed0200
Author: Christian Hergert <chergert redhat com>
Date:   Fri Sep 2 19:43:06 2016 -0700

    configuration: add prebuild/postbuild options to buildconfig
    
    This allows something like the following in your .buildconfig
    
    [foo]
    prebuild=echo 'PREBUILD'; git status
    postbuild=echo 'POSTBUILD'; ls -lsah

 libide/buildsystem/ide-configuration-manager.c |   51 +++++++++++++
 libide/buildsystem/ide-configuration.c         |   73 +++++++++++++++++++
 libide/buildsystem/ide-configuration.h         |   90 ++++++++++++------------
 libide/ide-internal.h                          |    4 +
 4 files changed, 174 insertions(+), 44 deletions(-)
---
diff --git a/libide/buildsystem/ide-configuration-manager.c b/libide/buildsystem/ide-configuration-manager.c
index 9124e36..0aaa4ab 100644
--- a/libide/buildsystem/ide-configuration-manager.c
+++ b/libide/buildsystem/ide-configuration-manager.c
@@ -22,8 +22,11 @@
 
 #include "ide-context.h"
 #include "ide-debug.h"
+#include "ide-internal.h"
 #include "ide-macros.h"
 
+#include "buildsystem/ide-build-command.h"
+#include "buildsystem/ide-build-command-queue.h"
 #include "buildsystem/ide-configuration-manager.h"
 #include "buildsystem/ide-configuration.h"
 #include "buildsystem/ide-environment.h"
@@ -113,6 +116,36 @@ load_environ (IdeConfiguration *configuration,
     }
 }
 
+static void
+load_command_queue (IdeBuildCommandQueue *cmdq,
+                    GKeyFile             *key_file,
+                    const gchar          *group,
+                    const gchar          *name)
+
+{
+  g_auto(GStrv) commands = NULL;
+
+  g_assert (IDE_IS_BUILD_COMMAND_QUEUE (cmdq));
+  g_assert (key_file != NULL);
+  g_assert (group != NULL);
+  g_assert (name != NULL);
+
+  commands = g_key_file_get_string_list (key_file, group, name, NULL, NULL);
+
+  if (commands != NULL)
+    {
+      for (guint i = 0; commands [i]; i++)
+        {
+          g_autoptr(IdeBuildCommand) command = NULL;
+
+          command = g_object_new (IDE_TYPE_BUILD_COMMAND,
+                                  "command-text", commands [i],
+                                  NULL);
+          ide_build_command_queue_append (cmdq, command);
+        }
+    }
+}
+
 static gboolean
 ide_configuration_manager_load (IdeConfigurationManager  *self,
                                 GKeyFile                 *key_file,
@@ -140,6 +173,24 @@ ide_configuration_manager_load (IdeConfigurationManager  *self,
   load_string (configuration, key_file, group, "runtime", "runtime-id");
   load_string (configuration, key_file, group, "prefix", "prefix");
 
+  if (g_key_file_has_key (key_file, group, "prebuild", NULL))
+    {
+      g_autoptr(IdeBuildCommandQueue) cmdq = NULL;
+
+      cmdq = ide_build_command_queue_new ();
+      load_command_queue (cmdq, key_file, group, "prebuild");
+      _ide_configuration_set_prebuild (configuration, cmdq);
+    }
+
+  if (g_key_file_has_key (key_file, group, "postbuild", NULL))
+    {
+      g_autoptr(IdeBuildCommandQueue) cmdq = NULL;
+
+      cmdq = ide_build_command_queue_new ();
+      load_command_queue (cmdq, key_file, group, "postbuild");
+      _ide_configuration_set_postbuild (configuration, cmdq);
+    }
+
   env_group = g_strdup_printf ("%s.environment", group);
 
   if (g_key_file_has_group (key_file, env_group))
diff --git a/libide/buildsystem/ide-configuration.c b/libide/buildsystem/ide-configuration.c
index 6115090..a8f913d 100644
--- a/libide/buildsystem/ide-configuration.c
+++ b/libide/buildsystem/ide-configuration.c
@@ -21,7 +21,9 @@
 #include <string.h>
 
 #include "ide-context.h"
+#include "ide-internal.h"
 
+#include "buildsystem/ide-build-command-queue.h"
 #include "buildsystem/ide-configuration.h"
 #include "buildsystem/ide-environment.h"
 #include "devices/ide-device-manager.h"
@@ -42,6 +44,9 @@ struct _IdeConfiguration
 
   IdeEnvironment *environment;
 
+  IdeBuildCommandQueue *prebuild;
+  IdeBuildCommandQueue *postbuild;
+
   gint            parallelism;
   guint           sequence;
 
@@ -176,6 +181,8 @@ ide_configuration_finalize (GObject *object)
   IdeConfiguration *self = (IdeConfiguration *)object;
 
   g_clear_object (&self->environment);
+  g_clear_object (&self->prebuild);
+  g_clear_object (&self->postbuild);
 
   g_clear_pointer (&self->config_opts, g_free);
   g_clear_pointer (&self->device_id, g_free);
@@ -849,3 +856,69 @@ ide_configuration_get_sequence (IdeConfiguration *self)
 
   return self->sequence;
 }
+
+/**
+ * ide_configuration_get_prebuild:
+ *
+ * Gets a queue of commands to be run before the standard build process of
+ * the configured build system. This can be useful for situations where the
+ * user wants to setup some custom commands to prepare their environment.
+ *
+ * Constrast this with ide_configuration_get_postbuild() which gets commands
+ * to be executed after the build system has completed.
+ *
+ * This function will always return a command queue. The command
+ * queue may contain zero or more commands to be executed.
+ *
+ * Returns: (transfer full): An #IdeBuildCommandQueue.
+ */
+IdeBuildCommandQueue *
+ide_configuration_get_prebuild (IdeConfiguration *self)
+{
+  g_return_val_if_fail (IDE_IS_CONFIGURATION (self), NULL);
+
+  if (self->prebuild != NULL)
+    return g_object_ref (self->prebuild);
+
+  return ide_build_command_queue_new ();
+}
+
+/**
+ * ide_configuration_get_postbuild:
+ *
+ * Gets a queue of commands to be run after the standard build process of
+ * the configured build system. This can be useful for situations where the
+ * user wants to modify something after the build completes.
+ *
+ * Constrast this with ide_configuration_get_prebuild() which gets commands
+ * to be executed before the build system has started.
+ *
+ * This function will always return a command queue. The command
+ * queue may contain zero or more commands to be executed.
+ *
+ * Returns: (transfer full): An #IdeBuildCommandQueue.
+ */
+IdeBuildCommandQueue *
+ide_configuration_get_postbuild (IdeConfiguration *self)
+{
+  g_return_val_if_fail (IDE_IS_CONFIGURATION (self), NULL);
+
+  if (self->postbuild != NULL)
+    return g_object_ref (self->postbuild);
+
+  return ide_build_command_queue_new ();
+}
+
+void
+_ide_configuration_set_prebuild (IdeConfiguration     *self,
+                                 IdeBuildCommandQueue *prebuild)
+{
+  g_set_object (&self->prebuild, prebuild);
+}
+
+void
+_ide_configuration_set_postbuild (IdeConfiguration     *self,
+                                  IdeBuildCommandQueue *postbuild)
+{
+  g_set_object (&self->postbuild, postbuild);
+}
diff --git a/libide/buildsystem/ide-configuration.h b/libide/buildsystem/ide-configuration.h
index 81f19f2..8c2c422 100644
--- a/libide/buildsystem/ide-configuration.h
+++ b/libide/buildsystem/ide-configuration.h
@@ -30,50 +30,52 @@ G_BEGIN_DECLS
 
 G_DECLARE_FINAL_TYPE (IdeConfiguration, ide_configuration, IDE, CONFIGURATION, IdeObject)
 
-IdeConfiguration    *ide_configuration_new              (IdeContext        *context,
-                                                         const gchar       *id,
-                                                         const gchar       *device_id,
-                                                         const gchar       *runtime_id);
-const gchar         *ide_configuration_get_id           (IdeConfiguration  *self);
-const gchar         *ide_configuration_get_runtime_id   (IdeConfiguration  *self);
-void                 ide_configuration_set_runtime_id   (IdeConfiguration  *self,
-                                                         const gchar       *runtime_id);
-const gchar         *ide_configuration_get_device_id    (IdeConfiguration  *self);
-void                 ide_configuration_set_device_id    (IdeConfiguration  *self,
-                                                         const gchar       *device_id);
-IdeDevice           *ide_configuration_get_device       (IdeConfiguration  *self);
-void                 ide_configuration_set_device       (IdeConfiguration  *self,
-                                                         IdeDevice         *device);
-gboolean             ide_configuration_get_dirty        (IdeConfiguration  *self);
-void                 ide_configuration_set_dirty        (IdeConfiguration  *self,
-                                                         gboolean           dirty);
-const gchar         *ide_configuration_get_display_name (IdeConfiguration  *self);
-void                 ide_configuration_set_display_name (IdeConfiguration  *self,
-                                                         const gchar       *display_name);
-IdeRuntime          *ide_configuration_get_runtime      (IdeConfiguration  *self);
-void                 ide_configuration_set_runtime      (IdeConfiguration  *self,
-                                                         IdeRuntime        *runtime);
-gchar              **ide_configuration_get_environ      (IdeConfiguration  *self);
-const gchar         *ide_configuration_getenv           (IdeConfiguration  *self,
-                                                         const gchar       *key);
-void                 ide_configuration_setenv           (IdeConfiguration  *self,
-                                                         const gchar       *key,
-                                                         const gchar       *value);
-gboolean             ide_configuration_get_debug        (IdeConfiguration  *self);
-void                 ide_configuration_set_debug        (IdeConfiguration  *self,
-                                                         gboolean           debug);
-const gchar         *ide_configuration_get_prefix       (IdeConfiguration  *self);
-void                 ide_configuration_set_prefix       (IdeConfiguration  *self,
-                                                         const gchar       *prefix);
-const gchar         *ide_configuration_get_config_opts  (IdeConfiguration  *self);
-void                 ide_configuration_set_config_opts  (IdeConfiguration  *self,
-                                                         const gchar       *config_opts);
-gint                 ide_configuration_get_parallelism  (IdeConfiguration  *self);
-void                 ide_configuration_set_parallelism  (IdeConfiguration  *self,
-                                                         gint               parallelism);
-IdeEnvironment      *ide_configuration_get_environment  (IdeConfiguration  *self);
-IdeConfiguration    *ide_configuration_duplicate        (IdeConfiguration  *self);
-guint                ide_configuration_get_sequence     (IdeConfiguration  *self);
+IdeConfiguration     *ide_configuration_new              (IdeContext        *context,
+                                                          const gchar       *id,
+                                                          const gchar       *device_id,
+                                                          const gchar       *runtime_id);
+const gchar          *ide_configuration_get_id           (IdeConfiguration  *self);
+const gchar          *ide_configuration_get_runtime_id   (IdeConfiguration  *self);
+void                  ide_configuration_set_runtime_id   (IdeConfiguration  *self,
+                                                          const gchar       *runtime_id);
+const gchar          *ide_configuration_get_device_id    (IdeConfiguration  *self);
+void                  ide_configuration_set_device_id    (IdeConfiguration  *self,
+                                                          const gchar       *device_id);
+IdeDevice            *ide_configuration_get_device       (IdeConfiguration  *self);
+void                  ide_configuration_set_device       (IdeConfiguration  *self,
+                                                          IdeDevice         *device);
+gboolean              ide_configuration_get_dirty        (IdeConfiguration  *self);
+void                  ide_configuration_set_dirty        (IdeConfiguration  *self,
+                                                          gboolean           dirty);
+const gchar          *ide_configuration_get_display_name (IdeConfiguration  *self);
+void                  ide_configuration_set_display_name (IdeConfiguration  *self,
+                                                          const gchar       *display_name);
+IdeRuntime           *ide_configuration_get_runtime      (IdeConfiguration  *self);
+void                  ide_configuration_set_runtime      (IdeConfiguration  *self,
+                                                          IdeRuntime        *runtime);
+gchar               **ide_configuration_get_environ      (IdeConfiguration  *self);
+const gchar          *ide_configuration_getenv           (IdeConfiguration  *self,
+                                                          const gchar       *key);
+void                  ide_configuration_setenv           (IdeConfiguration  *self,
+                                                          const gchar       *key,
+                                                          const gchar       *value);
+gboolean              ide_configuration_get_debug        (IdeConfiguration  *self);
+void                  ide_configuration_set_debug        (IdeConfiguration  *self,
+                                                          gboolean           debug);
+const gchar          *ide_configuration_get_prefix       (IdeConfiguration  *self);
+void                  ide_configuration_set_prefix       (IdeConfiguration  *self,
+                                                          const gchar       *prefix);
+const gchar          *ide_configuration_get_config_opts  (IdeConfiguration  *self);
+void                  ide_configuration_set_config_opts  (IdeConfiguration  *self,
+                                                          const gchar       *config_opts);
+gint                  ide_configuration_get_parallelism  (IdeConfiguration  *self);
+void                  ide_configuration_set_parallelism  (IdeConfiguration  *self,
+                                                          gint               parallelism);
+IdeEnvironment       *ide_configuration_get_environment  (IdeConfiguration  *self);
+IdeConfiguration     *ide_configuration_duplicate        (IdeConfiguration  *self);
+guint                 ide_configuration_get_sequence     (IdeConfiguration  *self);
+IdeBuildCommandQueue *ide_configuration_get_prebuild     (IdeConfiguration  *self);
+IdeBuildCommandQueue *ide_configuration_get_postbuild    (IdeConfiguration  *self);
 
 G_END_DECLS
 
diff --git a/libide/ide-internal.h b/libide/ide-internal.h
index c102f23..14f9d97 100644
--- a/libide/ide-internal.h
+++ b/libide/ide-internal.h
@@ -49,6 +49,10 @@ void                _ide_buffer_manager_reclaim             (IdeBufferManager
                                                              IdeBuffer             *buffer);
 void                _ide_build_system_set_project_file      (IdeBuildSystem        *self,
                                                              GFile                 *project_file);
+void                _ide_configuration_set_prebuild         (IdeConfiguration      *self,
+                                                             IdeBuildCommandQueue  *prebuild);
+void                _ide_configuration_set_postbuild        (IdeConfiguration      *self,
+                                                             IdeBuildCommandQueue  *postbuild);
 gboolean            _ide_context_is_restoring               (IdeContext            *self);
 const gchar        *_ide_file_get_content_type              (IdeFile               *self);
 GtkSourceFile      *_ide_file_set_content_type              (IdeFile               *self,


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