summaryrefslogtreecommitdiff
path: root/src/ostree/ot-builtin-commit.c
diff options
context:
space:
mode:
authorColin Walters <walters@verbum.org>2017-12-11 17:43:57 -0500
committerAtomic Bot <atomic-devel@projectatomic.io>2017-12-12 19:31:16 +0000
commitac092895b10be506eada983a15c8d128158b7ad7 (patch)
treef17b3d60b12fbd06d66ee9455dbcab0f2dc826fe /src/ostree/ot-builtin-commit.c
parentf81e3c6f03f6636f1e4e4d1f13a79983820a9d29 (diff)
downloadostree-ac092895b10be506eada983a15c8d128158b7ad7.tar.gz
bin/commit: Add --add-metadata that accepts g_variant_print() format
Mostly adding this for use in test cases; it allows us to add e.g. integers, and we need to deal with byteswapping those. Someone mind also find it useful to add fully structured metadata, although most of those users should be using a real language and not shell script. Closes: #1372 Approved by: jlebon
Diffstat (limited to 'src/ostree/ot-builtin-commit.c')
-rw-r--r--src/ostree/ot-builtin-commit.c48
1 files changed, 35 insertions, 13 deletions
diff --git a/src/ostree/ot-builtin-commit.c b/src/ostree/ot-builtin-commit.c
index c24e06c7..7c81712a 100644
--- a/src/ostree/ot-builtin-commit.c
+++ b/src/ostree/ot-builtin-commit.c
@@ -42,6 +42,7 @@ static char *opt_branch;
static char *opt_statoverride_file;
static char *opt_skiplist_file;
static char **opt_metadata_strings;
+static char **opt_metadata_variants;
static char **opt_detached_metadata_strings;
static gboolean opt_link_checkout_speedup;
static gboolean opt_skip_if_unchanged;
@@ -92,6 +93,7 @@ static GOptionEntry options[] = {
{ "bind-ref", 0, 0, G_OPTION_ARG_STRING_ARRAY, &opt_bind_refs, "Add a ref to ref binding commit metadata", "BRANCH" },
{ "tree", 0, 0, G_OPTION_ARG_STRING_ARRAY, &opt_trees, "Overlay the given argument as a tree", "dir=PATH or tar=TARFILE or ref=COMMIT" },
{ "add-metadata-string", 0, 0, G_OPTION_ARG_STRING_ARRAY, &opt_metadata_strings, "Add a key/value pair to metadata", "KEY=VALUE" },
+ { "add-metadata", 0, 0, G_OPTION_ARG_STRING_ARRAY, &opt_metadata_variants, "Add a key/value pair to metadata, where the KEY is a string, an VALUE is g_variant_parse() formatted", "KEY=VALUE" },
{ "add-detached-metadata-string", 0, 0, G_OPTION_ARG_STRING_ARRAY, &opt_detached_metadata_strings, "Add a key/value pair to detached metadata", "KEY=VALUE" },
{ "owner-uid", 0, 0, G_OPTION_ARG_INT, &opt_owner_uid, "Set file ownership user id", "UID" },
{ "owner-gid", 0, 0, G_OPTION_ARG_INT, &opt_owner_gid, "Set file ownership group id", "GID" },
@@ -321,13 +323,11 @@ commit_editor (OstreeRepo *repo,
}
static gboolean
-parse_keyvalue_strings (char **strings,
- GVariant **out_metadata,
+parse_keyvalue_strings (GVariantBuilder *builder,
+ char **strings,
+ gboolean is_gvariant_print,
GError **error)
{
- g_autoptr(GVariantBuilder) builder =
- g_variant_builder_new (G_VARIANT_TYPE ("a{sv}"));
-
for (char ** iter = strings; *iter; iter++)
{
const char *s = *iter;
@@ -335,11 +335,19 @@ parse_keyvalue_strings (char **strings,
if (!eq)
return glnx_throw (error, "Missing '=' in KEY=VALUE metadata '%s'", s);
g_autofree char *key = g_strndup (s, eq - s);
- g_variant_builder_add (builder, "{sv}", key,
- g_variant_new_string (eq + 1));
+ if (is_gvariant_print)
+ {
+ g_autoptr(GVariant) value = g_variant_parse (NULL, eq + 1, NULL, NULL, error);
+ if (!value)
+ return glnx_prefix_error (error, "Parsing %s", s);
+
+ g_variant_builder_add (builder, "{sv}", key, value);
+ }
+ else
+ g_variant_builder_add (builder, "{sv}", key,
+ g_variant_new_string (eq + 1));
}
- *out_metadata = g_variant_ref_sink (g_variant_builder_end (builder));
return TRUE;
}
@@ -458,17 +466,31 @@ ostree_builtin_commit (int argc, char **argv, OstreeCommandInvocation *invocatio
goto out;
}
- if (opt_metadata_strings)
+ if (opt_metadata_strings || opt_metadata_variants)
{
- if (!parse_keyvalue_strings (opt_metadata_strings,
- &metadata, error))
+ g_autoptr(GVariantBuilder) builder =
+ g_variant_builder_new (G_VARIANT_TYPE ("a{sv}"));
+
+ if (opt_metadata_strings &&
+ !parse_keyvalue_strings (builder, opt_metadata_strings, FALSE, error))
+ goto out;
+
+ if (opt_metadata_variants &&
+ !parse_keyvalue_strings (builder, opt_metadata_variants, TRUE, error))
goto out;
+
+ metadata = g_variant_ref_sink (g_variant_builder_end (builder));
}
+
if (opt_detached_metadata_strings)
{
- if (!parse_keyvalue_strings (opt_detached_metadata_strings,
- &detached_metadata, error))
+ g_autoptr(GVariantBuilder) builder =
+ g_variant_builder_new (G_VARIANT_TYPE ("a{sv}"));
+
+ if (!parse_keyvalue_strings (builder, opt_detached_metadata_strings, FALSE, error))
goto out;
+
+ detached_metadata = g_variant_ref_sink (g_variant_builder_end (builder));
}
if (!(opt_branch || opt_orphan))