ostree/dump: Add support for summary metadata keys
authorDan Nicholson <dbn@endlessos.org>
Mon, 30 Jan 2023 05:41:52 +0000 (22:41 -0700)
committerDan Nicholson <dbn@endlessos.org>
Wed, 8 Feb 2023 05:59:30 +0000 (22:59 -0700)
Like with commit metadata, it's useful to list and print metadata keys
are in a summary file. This adds helpers to do that.

src/ostree/ot-dump.c
src/ostree/ot-dump.h

index 509eb792d114f8431d6bfe5a5eb857ba4fd7aaeb..4cfac81135860739ee0bb72bceef4f9589f3894a 100644 (file)
@@ -407,6 +407,66 @@ ot_dump_summary_bytes (GBytes          *summary_bytes,
     }
 }
 
+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);
+}
+
+void
+ot_dump_summary_metadata_keys (GBytes *summary_bytes)
+{
+  g_autoptr(GVariant) summary = NULL;
+  g_autoptr(GVariant) metadata = NULL;
+
+  summary = g_variant_new_from_bytes (OSTREE_SUMMARY_GVARIANT_FORMAT,
+                                      summary_bytes, FALSE);
+  metadata = g_variant_get_child_value (summary, 1);
+
+  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);
+    }
+}
+
+gboolean
+ot_dump_summary_metadata_key (GBytes      *summary_bytes,
+                              const char  *key,
+                              GError     **error)
+{
+  g_autoptr(GVariant) summary = NULL;
+  g_autoptr(GVariant) metadata = NULL;
+  g_autoptr(GVariant) value = NULL;
+
+  summary = g_variant_new_from_bytes (OSTREE_SUMMARY_GVARIANT_FORMAT,
+                                      summary_bytes, FALSE);
+  metadata = g_variant_get_child_value (summary, 1);
+  value = g_variant_lookup_value (metadata, key, NULL);
+  if (!value)
+    {
+      g_set_error (error, G_IO_ERROR, G_IO_ERROR_NOT_FOUND,
+                   "No such metadata key '%s'", key);
+      return FALSE;
+    }
+
+  ot_dump_variant (value);
+
+  return TRUE;
+}
+
 static gboolean
 dump_gpg_subkey (GVariant  *subkey,
                  gboolean   primary,
index 217a3964b6866c64efe801ef108f167673bf4668..da1a2cb2f7930fcfb50b0a6b7d98abae25f84624 100644 (file)
@@ -41,5 +41,11 @@ void   ot_dump_object     (OstreeObjectType   objtype,
 void   ot_dump_summary_bytes  (GBytes          *summary_bytes,
                                OstreeDumpFlags  flags);
 
+void ot_dump_summary_metadata_keys (GBytes *summary_bytes);
+
+gboolean ot_dump_summary_metadata_key (GBytes      *summary_bytes,
+                                       const char  *key,
+                                       GError     **error);
+
 gboolean ot_dump_gpg_key  (GVariant  *key,
                            GError   **error);