diff options
author | Dan Nicholson <dbn@endlessos.org> | 2023-01-29 14:13:05 -0700 |
---|---|---|
committer | Dan Nicholson <dbn@endlessos.org> | 2023-02-07 22:59:30 -0700 |
commit | 86701f0f848dde51352d760872d4e0d821a9fc21 (patch) | |
tree | 65e34997c59216a8799c3b978659f67d34d5c0e2 | |
parent | 008c5a95404cb670590394227e41a03ce1d1c437 (diff) | |
download | ostree-86701f0f848dde51352d760872d4e0d821a9fc21.tar.gz |
bin/show: Add options to list metadata keys
While `--print-metadata-key` is very useful, it's not that helpful if
you don't know what the keys are.
-rw-r--r-- | bash/ostree | 2 | ||||
-rw-r--r-- | man/ostree-show.xml | 16 | ||||
-rw-r--r-- | src/ostree/ot-builtin-show.c | 77 | ||||
-rw-r--r-- | tests/basic-test.sh | 7 |
4 files changed, 96 insertions, 6 deletions
diff --git a/bash/ostree b/bash/ostree index 2b7c552f..76a62c59 100644 --- a/bash/ostree +++ b/bash/ostree @@ -1486,6 +1486,8 @@ _ostree_rev_parse() { _ostree_show() { local boolean_options=" $main_boolean_options + --list-detached-metadata-keys + --list-metadata-keys --print-related --print-sizes --raw diff --git a/man/ostree-show.xml b/man/ostree-show.xml index 4495b1e6..8d134cc4 100644 --- a/man/ostree-show.xml +++ b/man/ostree-show.xml @@ -82,6 +82,14 @@ License along with this library. If not, see <https://www.gnu.org/licenses/>. </varlistentry> <varlistentry> + <term><option>--list-metadata-keys</option></term> + + <listitem><para> + List the available metadata keys. + </para></listitem> + </varlistentry> + + <varlistentry> <term><option>--print-metadata-key</option>="KEY"</term> <listitem><para> @@ -90,6 +98,14 @@ License along with this library. If not, see <https://www.gnu.org/licenses/>. </varlistentry> <varlistentry> + <term><option>--list-detached-metadata-keys</option></term> + + <listitem><para> + List the available detached metadata keys. + </para></listitem> + </varlistentry> + + <varlistentry> <term><option>--print-detached-metadata-key</option>="KEY"</term> <listitem><para> diff --git a/src/ostree/ot-builtin-show.c b/src/ostree/ot-builtin-show.c index 55f2b47e..9346a7b3 100644 --- a/src/ostree/ot-builtin-show.c +++ b/src/ostree/ot-builtin-show.c @@ -31,6 +31,8 @@ static gboolean opt_print_related; static char* opt_print_variant_type; static char* opt_print_metadata_key; static char* opt_print_detached_metadata_key; +static gboolean opt_list_metadata_keys; +static gboolean opt_list_detached_metadata_keys; static gboolean opt_print_sizes; static gboolean opt_raw; static gboolean opt_no_byteswap; @@ -45,7 +47,9 @@ static char *opt_gpg_verify_remote; static GOptionEntry options[] = { { "print-related", 0, 0, G_OPTION_ARG_NONE, &opt_print_related, "Show the \"related\" commits", NULL }, { "print-variant-type", 0, 0, G_OPTION_ARG_STRING, &opt_print_variant_type, "Memory map OBJECT (in this case a filename) to the GVariant type string", "TYPE" }, + { "list-metadata-keys", 0, 0, G_OPTION_ARG_NONE, &opt_list_metadata_keys, "List the available metadata keys", NULL }, { "print-metadata-key", 0, 0, G_OPTION_ARG_STRING, &opt_print_metadata_key, "Print string value of metadata key", "KEY" }, + { "list-detached-metadata-keys", 0, 0, G_OPTION_ARG_NONE, &opt_list_detached_metadata_keys, "List the available detached metadata keys", NULL }, { "print-detached-metadata-key", 0, 0, G_OPTION_ARG_STRING, &opt_print_detached_metadata_key, "Print string value of detached metadata key", "KEY" }, { "print-sizes", 0, 0, G_OPTION_ARG_NONE, &opt_print_sizes, "Show the commit size metadata", NULL }, { "raw", 0, 0, G_OPTION_ARG_NONE, &opt_raw, "Show raw variant data" }, @@ -98,12 +102,14 @@ do_print_related (OstreeRepo *repo, } static gboolean -do_print_metadata_key (OstreeRepo *repo, - const char *resolved_rev, - gboolean detached, - const char *key, - GError **error) +get_metadata (OstreeRepo *repo, + const char *resolved_rev, + gboolean detached, + GVariant **out_metadata, + GError **error) { + g_assert (out_metadata != NULL); + g_autoptr(GVariant) commit = NULL; g_autoptr(GVariant) metadata = NULL; @@ -128,6 +134,59 @@ do_print_metadata_key (OstreeRepo *repo, } } + *out_metadata = g_steal_pointer (&metadata); + + return TRUE; +} + +static gint +strptr_cmp (gconstpointer a, + gconstpointer b) +{ + const char *a_str = *((const char **) a); + const char *b_str = *((const char **) b); + + return g_strcmp0 (a_str, b_str); +} + +static gboolean +do_list_metadata_keys (OstreeRepo *repo, + const char *resolved_rev, + gboolean detached, + GError **error) +{ + g_autoptr(GVariant) metadata = NULL; + if (!get_metadata (repo, resolved_rev, detached, &metadata, error)) + return FALSE; + + GVariantIter iter; + const char *key = NULL; + g_autoptr(GPtrArray) keys = g_ptr_array_new (); + g_variant_iter_init (&iter, metadata); + while (g_variant_iter_loop (&iter, "{&s@v}", &key, NULL)) + g_ptr_array_add (keys, (gpointer) key); + + g_ptr_array_sort (keys, strptr_cmp); + for (guint i = 0; i < keys-> len; i++) + { + key = keys->pdata[i]; + g_print ("%s\n", key); + } + + return TRUE; +} + +static gboolean +do_print_metadata_key (OstreeRepo *repo, + const char *resolved_rev, + gboolean detached, + const char *key, + GError **error) +{ + g_autoptr(GVariant) metadata = NULL; + if (!get_metadata (repo, resolved_rev, detached, &metadata, error)) + return FALSE; + g_autoptr(GVariant) value = g_variant_lookup_value (metadata, key, NULL); if (!value) { @@ -321,10 +380,16 @@ ostree_builtin_show (int argc, char **argv, OstreeCommandInvocation *invocation, const char *key = detached ? opt_print_detached_metadata_key : opt_print_metadata_key; if (!ostree_repo_resolve_rev (repo, rev, FALSE, &resolved_rev, error)) return FALSE; - if (!do_print_metadata_key (repo, resolved_rev, detached, key, error)) return FALSE; } + else if (opt_list_metadata_keys || opt_list_detached_metadata_keys) + { + if (!ostree_repo_resolve_rev (repo, rev, FALSE, &resolved_rev, error)) + return FALSE; + if (!do_list_metadata_keys (repo, resolved_rev, opt_list_detached_metadata_keys, error)) + return FALSE; + } else if (opt_print_related) { if (!ostree_repo_resolve_rev (repo, rev, FALSE, &resolved_rev, error)) diff --git a/tests/basic-test.sh b/tests/basic-test.sh index f97f6fc3..e2a7d70c 100644 --- a/tests/basic-test.sh +++ b/tests/basic-test.sh @@ -1006,6 +1006,13 @@ $OSTREE show -B --print-metadata-key=SOMENUM test2 > test2-meta assert_file_has_content test2-meta "uint64 42" $OSTREE show --print-detached-metadata-key=SIGNATURE test2 > test2-meta assert_file_has_content test2-meta "HANCOCK" + +$OSTREE show --list-metadata-keys test2 > test2-meta +assert_file_has_content test2-meta "FOO" +assert_file_has_content test2-meta "KITTENS" +assert_file_has_content test2-meta "SOMENUM" +$OSTREE show --list-detached-metadata-keys test2 > test2-meta +assert_file_has_content test2-meta "SIGNATURE" echo "ok metadata commit with strings" $OSTREE commit ${COMMIT_ARGS} -b test2 --tree=ref=test2 \ |