[gnome-builder] shellcmd: add helper to load shellcmd from a keyfile
- From: Christian Hergert <chergert src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-builder] shellcmd: add helper to load shellcmd from a keyfile
- Date: Thu, 8 Aug 2019 20:17:09 +0000 (UTC)
commit 772b1ddde422d676f89f122b0100841a8cad6f2f
Author: Christian Hergert <chergert redhat com>
Date: Thu Aug 8 13:12:19 2019 -0700
shellcmd: add helper to load shellcmd from a keyfile
This will be used for the on-disk configuration for external commands.
The format will look something like:
[07da5d6b-6d54-4c4e-946d-8a885ef4093f]
Title=Run ps from build terminal in $build/src
Locality=build
Command=ps aux
Shortcut=<Control><Shift>z
Directory=src
Environment=
src/plugins/shellcmd/gbp-shellcmd-command.c | 97 ++++++++++++++++++++++++++++-
src/plugins/shellcmd/gbp-shellcmd-command.h | 6 ++
2 files changed, 101 insertions(+), 2 deletions(-)
---
diff --git a/src/plugins/shellcmd/gbp-shellcmd-command.c b/src/plugins/shellcmd/gbp-shellcmd-command.c
index 935acab6b..b4cd75dc8 100644
--- a/src/plugins/shellcmd/gbp-shellcmd-command.c
+++ b/src/plugins/shellcmd/gbp-shellcmd-command.c
@@ -89,11 +89,11 @@ gbp_shellcmd_command_finalize (GObject *object)
{
GbpShellcmdCommand *self = (GbpShellcmdCommand *)object;
- g_clear_pointer (&self->shortcut, g_free);
- g_clear_pointer (&self->title, g_free);
g_clear_pointer (&self->command, g_free);
g_clear_pointer (&self->cwd, g_free);
g_clear_pointer (&self->id, g_free);
+ g_clear_pointer (&self->shortcut, g_free);
+ g_clear_pointer (&self->title, g_free);
g_clear_object (&self->environment);
G_OBJECT_CLASS (gbp_shellcmd_command_parent_class)->finalize (object);
@@ -838,6 +838,99 @@ gbp_shellcmd_command_set_subtitle (GbpShellcmdCommand *self,
g_object_notify_by_pspec (G_OBJECT (self), properties [PROP_SUBTITLE]);
}
}
+
+GbpShellcmdCommand *
+gbp_shellcmd_command_from_key_file (GKeyFile *keyfile,
+ const gchar *group,
+ GError **error)
+{
+ g_autoptr(GbpShellcmdCommand) self = NULL;
+ g_autofree gchar *id = NULL;
+ struct {
+ const gchar *key_name;
+ const gchar *prop_name;
+ GType type;
+ gboolean required;
+ gboolean found;
+ } keys[] = {
+ { "Locality", "locality", GBP_TYPE_SHELLCMD_COMMAND_LOCALITY, FALSE },
+ { "Shortcut", "shortcut", G_TYPE_STRING, TRUE },
+ { "Title", "title", G_TYPE_STRING, FALSE },
+ { "Command", "command", G_TYPE_STRING, TRUE },
+ { "Directory", "cwd", G_TYPE_STRING, FALSE },
+ { "Environment", "env", G_TYPE_STRV, FALSE },
+ };
+
+ g_return_val_if_fail (keyfile != NULL, NULL);
+ g_return_val_if_fail (group != NULL, NULL);
+
+ id = g_strdelimit (g_strdup (group), "'\" ", '-');
+ self = g_object_new (GBP_TYPE_SHELLCMD_COMMAND,
+ "id", id,
+ NULL);
+
+ for (guint i = 0; i < G_N_ELEMENTS (keys); i++)
+ {
+ if (g_type_is_a (keys[i].type, G_TYPE_STRING))
+ {
+ g_autofree gchar *val = NULL;
+
+ if (!(val = g_key_file_get_string (keyfile, group, keys[i].key_name, NULL)))
+ continue;
+
+ keys[i].found = TRUE;
+
+ g_object_set (self, keys[i].prop_name, val, NULL);
+ }
+ else if (g_type_is_a (keys[i].type, G_TYPE_STRV))
+ {
+ g_auto(GStrv) val = NULL;
+
+ if (!(val = g_key_file_get_string_list (keyfile, group, keys[i].key_name, NULL, NULL)))
+ continue;
+
+ keys[i].found = TRUE;
+
+ g_object_set (self, keys[i].prop_name, val, NULL);
+ }
+ else if (g_type_is_a (keys[i].type, G_TYPE_ENUM))
+ {
+ g_autoptr(GEnumClass) eclass = g_type_class_ref (keys[i].type);
+ g_autofree gchar *val = NULL;
+ GEnumValue *eval;
+
+ if (!(val = g_key_file_get_string (keyfile, group, keys[i].key_name, NULL)))
+ continue;
+
+ if (!(eval = g_enum_get_value_by_nick (eclass, val)))
+ continue;
+
+ keys[i].found = TRUE;
+
+ g_object_set (self, keys[i].prop_name, eval->value, NULL);
+ }
+ else
+ {
+ g_assert_not_reached ();
+ }
+ }
+
+ for (guint i = 0; i < G_N_ELEMENTS (keys); i++)
+ {
+ if (keys[i].required && !keys[i].found)
+ {
+ g_set_error (error,
+ G_IO_ERROR,
+ G_IO_ERROR_INVALID_DATA,
+ "Missing key %s from command %s",
+ keys[i].key_name, group);
+ return NULL;
+ }
+ }
+
+ return g_steal_pointer (&self);
+}
+
const gchar *
gbp_shellcmd_command_get_id (GbpShellcmdCommand *self)
{
diff --git a/src/plugins/shellcmd/gbp-shellcmd-command.h b/src/plugins/shellcmd/gbp-shellcmd-command.h
index ad078d089..501c2653e 100644
--- a/src/plugins/shellcmd/gbp-shellcmd-command.h
+++ b/src/plugins/shellcmd/gbp-shellcmd-command.h
@@ -37,6 +37,12 @@ typedef enum
G_DECLARE_FINAL_TYPE (GbpShellcmdCommand, gbp_shellcmd_command, GBP, SHELLCMD_COMMAND, IdeObject)
+GbpShellcmdCommand *gbp_shellcmd_command_from_key_file (GKeyFile *key_file,
+ const gchar *group,
+ GError **error);
+gboolean gbp_shellcmd_command_to_key_file (GbpShellcmdCommand *self,
+ GKeyFile *key_file,
+ GError **error);
GbpShellcmdCommand *gbp_shellcmd_command_copy (GbpShellcmdCommand *self);
const gchar *gbp_shellcmd_command_get_id (GbpShellcmdCommand *self);
GbpShellcmdCommandLocality gbp_shellcmd_command_get_locality (GbpShellcmdCommand *self);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]