From 94ed2946abda1aafc9bbd3ed102cb286ce5839d9 Mon Sep 17 00:00:00 2001 From: Alexander Larsson Date: Thu, 13 Jun 2019 12:47:03 +0200 Subject: [PATCH] OCI: Add flatpak_oci_registry_load_image_config helper We can't use load_versioned() for images because in the docker case there is no mediatype field. --- common/flatpak-common-types-private.h | 1 + common/flatpak-json-oci-private.h | 3 +++ common/flatpak-json-oci.c | 20 ++++++++++++++++++++ common/flatpak-oci-registry-private.h | 6 ++++++ common/flatpak-oci-registry.c | 21 +++++++++++++++++++++ 5 files changed, 51 insertions(+) diff --git a/common/flatpak-common-types-private.h b/common/flatpak-common-types-private.h index 842e958d..b8997ddc 100644 --- a/common/flatpak-common-types-private.h +++ b/common/flatpak-common-types-private.h @@ -53,5 +53,6 @@ typedef struct FlatpakDir FlatpakDir; typedef struct FlatpakDeploy FlatpakDeploy; typedef struct FlatpakOciRegistry FlatpakOciRegistry; typedef struct _FlatpakOciManifest FlatpakOciManifest; +typedef struct _FlatpakOciImage FlatpakOciImage; #endif /* __FLATPAK_COMMON_TYPES_H__ */ diff --git a/common/flatpak-json-oci-private.h b/common/flatpak-json-oci-private.h index 56bd5781..1dda1af4 100644 --- a/common/flatpak-json-oci-private.h +++ b/common/flatpak-json-oci-private.h @@ -225,6 +225,9 @@ void flatpak_oci_image_set_layer (FlatpakOciImage *image, GHashTable * flatpak_oci_image_get_labels (FlatpakOciImage *self); int flatpak_oci_image_add_history (FlatpakOciImage *image); +FlatpakOciImage * flatpak_oci_image_from_json (GBytes *bytes, + GError **error); + void flatpak_oci_add_annotations_for_commit (GHashTable *annotations, const char *ref, const char *commit, diff --git a/common/flatpak-json-oci.c b/common/flatpak-json-oci.c index 15a3b6ab..cbb6941a 100644 --- a/common/flatpak-json-oci.c +++ b/common/flatpak-json-oci.c @@ -211,6 +211,26 @@ flatpak_oci_versioned_from_json (GBytes *bytes, GError **error) return NULL; } +FlatpakOciImage * +flatpak_oci_image_from_json (GBytes *bytes, + GError **error) +{ + g_autoptr(JsonParser) parser = NULL; + JsonNode *root = NULL; + + parser = json_parser_new (); + if (!json_parser_load_from_data (parser, + g_bytes_get_data (bytes, NULL), + g_bytes_get_size (bytes), + error)) + return NULL; + + root = json_parser_get_root (parser); + + return (FlatpakOciImage *) flatpak_json_from_node (root, FLATPAK_TYPE_OCI_IMAGE, error); +} + + const char * flatpak_oci_versioned_get_mediatype (FlatpakOciVersioned *self) { diff --git a/common/flatpak-oci-registry-private.h b/common/flatpak-oci-registry-private.h index 1a71c87f..5ab863ff 100644 --- a/common/flatpak-oci-registry-private.h +++ b/common/flatpak-oci-registry-private.h @@ -105,6 +105,12 @@ FlatpakOciVersioned * flatpak_oci_registry_load_versioned (FlatpakOciRegistry * gsize *out_size, GCancellable *cancellable, GError **error); +FlatpakOciImage * flatpak_oci_registry_load_image_config (FlatpakOciRegistry *self, + const char *repository, + const char *digest, + gsize *out_size, + GCancellable *cancellable, + GError **error); FlatpakOciLayerWriter *flatpak_oci_registry_write_layer (FlatpakOciRegistry *self, GCancellable *cancellable, GError **error); diff --git a/common/flatpak-oci-registry.c b/common/flatpak-oci-registry.c index cfd628e4..0cfe5fb9 100644 --- a/common/flatpak-oci-registry.c +++ b/common/flatpak-oci-registry.c @@ -957,6 +957,27 @@ flatpak_oci_registry_load_versioned (FlatpakOciRegistry *self, return flatpak_oci_versioned_from_json (bytes, error); } +FlatpakOciImage * +flatpak_oci_registry_load_image_config (FlatpakOciRegistry *self, + const char *repository, + const char *digest, + gsize *out_size, + GCancellable *cancellable, + GError **error) +{ + g_autoptr(GBytes) bytes = NULL; + + g_assert (self->valid); + + bytes = flatpak_oci_registry_load_blob (self, repository, FALSE, digest, cancellable, error); + if (bytes == NULL) + return NULL; + + if (out_size) + *out_size = g_bytes_get_size (bytes); + return flatpak_oci_image_from_json (bytes, error); +} + struct FlatpakOciLayerWriter { GObject parent;