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)) diff --git a/tests/basic-test.sh b/tests/basic-test.sh index d7c5425c..e1af66cc 100644 --- a/tests/basic-test.sh +++ b/tests/basic-test.sh @@ -751,12 +751,16 @@ $OSTREE commit ${COMMIT_ARGS} -s sometest -b test2 checkout-test2 echo "ok commit with directory filename" cd $test_tmpdir/checkout-test2 -$OSTREE commit ${COMMIT_ARGS} -b test2 -s "Metadata string" --add-metadata-string=FOO=BAR --add-metadata-string=KITTENS=CUTE --add-detached-metadata-string=SIGNATURE=HANCOCK --tree=ref=test2 +$OSTREE commit ${COMMIT_ARGS} -b test2 -s "Metadata string" --add-metadata-string=FOO=BAR \ + --add-metadata-string=KITTENS=CUTE --add-detached-metadata-string=SIGNATURE=HANCOCK \ + --add-metadata=SOMENUM='uint64 42' --tree=ref=test2 cd ${test_tmpdir} $OSTREE show --print-metadata-key=FOO test2 > test2-meta assert_file_has_content test2-meta "BAR" $OSTREE show --print-metadata-key=KITTENS test2 > test2-meta assert_file_has_content test2-meta "CUTE" +$OSTREE show --print-metadata-key=SOMENUM test2 > test2-meta +assert_file_has_content test2-meta "uint64 3026418949592973312" $OSTREE show --print-detached-metadata-key=SIGNATURE test2 > test2-meta assert_file_has_content test2-meta "HANCOCK" echo "ok metadata commit with strings"