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;
{ "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" },
}
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;
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;
}
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))
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"