[ostree] deltas: Include an endianness marker
- From: Colin Walters <walters src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [ostree] deltas: Include an endianness marker
- Date: Fri, 26 Feb 2016 13:19:26 +0000 (UTC)
commit 277220aaa6e73002d5186ba1166c11be07481727
Author: Colin Walters <walters verbum org>
Date: Tue Feb 23 11:00:18 2016 -0500
deltas: Include an endianness marker
We screwed up and had delta integers use host endianness. Start
digging out by at least annotating the endianness.
https://bugzilla.gnome.org/show_bug.cgi?id=762515
.../ostree-repo-static-delta-compilation.c | 19 +++++++++++++
src/libostree/ostree-repo-static-delta-core.c | 28 ++++++++++++++++++++
tests/test-delta.sh | 5 +++
3 files changed, 52 insertions(+), 0 deletions(-)
---
diff --git a/src/libostree/ostree-repo-static-delta-compilation.c
b/src/libostree/ostree-repo-static-delta-compilation.c
index 2071bb6..e579e91 100644
--- a/src/libostree/ostree-repo-static-delta-compilation.c
+++ b/src/libostree/ostree-repo-static-delta-compilation.c
@@ -1306,6 +1306,10 @@ ostree_repo_static_delta_generate (OstreeRepo *self,
cancellable, error))
goto out;
+ /* NOTE: Add user-supplied metadata first. This is used by at least
+ * xdg-app as a way to provide MIME content sniffing, since the
+ * metadata appears first in the file.
+ */
g_variant_builder_init (&metadata_builder, G_VARIANT_TYPE ("a{sv}"));
if (metadata != NULL)
{
@@ -1320,6 +1324,21 @@ ostree_repo_static_delta_generate (OstreeRepo *self,
}
}
+ { guint8 endianness_char;
+ switch (G_BYTE_ORDER)
+ {
+ case G_LITTLE_ENDIAN:
+ endianness_char = 'l';
+ break;
+ case G_BIG_ENDIAN:
+ endianness_char = 'B';
+ break;
+ default:
+ g_assert_not_reached ();
+ }
+ g_variant_builder_add (&metadata_builder, "{sv}", "ostree.endianness", g_variant_new_byte
(endianness_char));
+ }
+
if (opt_filename)
{
g_autoptr(GFile) f = g_file_new_for_path (opt_filename);
diff --git a/src/libostree/ostree-repo-static-delta-core.c b/src/libostree/ostree-repo-static-delta-core.c
index ea5842f..6b1dc57 100644
--- a/src/libostree/ostree-repo-static-delta-core.c
+++ b/src/libostree/ostree-repo-static-delta-core.c
@@ -678,6 +678,8 @@ _ostree_repo_static_delta_dump (OstreeRepo *self,
g_autofree char *superblock_path = NULL;
glnx_fd_close int superblock_fd = -1;
g_autoptr(GVariant) delta_superblock = NULL;
+ g_autoptr(GVariant) delta_meta = NULL;
+ g_autoptr(GVariantDict) delta_metadict = NULL;
guint64 total_size = 0, total_usize = 0;
guint64 total_fallback_size = 0, total_fallback_usize = 0;
guint i;
@@ -690,7 +692,33 @@ _ostree_repo_static_delta_dump (OstreeRepo *self,
TRUE, &delta_superblock, error))
goto out;
+ delta_meta = g_variant_get_child_value (delta_superblock, 0);
+ delta_metadict = g_variant_dict_new (delta_meta);
+
g_print ("Delta: %s\n", delta_id);
+ { guint8 endianness_char;
+ const char *endianness_description;
+
+ if (g_variant_dict_lookup (delta_metadict, "ostree.endianness", "y", &endianness_char))
+ {
+ switch (endianness_char)
+ {
+ case 'l':
+ endianness_description = "little";
+ break;
+ case 'B':
+ endianness_description = "big";
+ break;
+ default:
+ endianness_description = "invalid";
+ break;
+ }
+ }
+ else
+ endianness_description = "unknown";
+
+ g_print ("Endianness: %s\n", endianness_description);
+ }
{ guint64 ts;
g_variant_get_child (delta_superblock, 1, "t", &ts);
g_print ("Timestamp: %" G_GUINT64_FORMAT "\n", GUINT64_FROM_BE (ts));
diff --git a/tests/test-delta.sh b/tests/test-delta.sh
index b31d65e..84ce8a7 100755
--- a/tests/test-delta.sh
+++ b/tests/test-delta.sh
@@ -114,6 +114,11 @@ fi
echo 'ok generate'
+${CMD_PREFIX} ostree --repo=repo static-delta show ${origrev}-${newrev} > show.txt
+assert_file_has_content show.txt 'Endianness: \(little\|big\)'
+
+echo 'ok show'
+
mkdir repo2 && ${CMD_PREFIX} ostree --repo=repo2 init --mode=archive-z2
${CMD_PREFIX} ostree --repo=repo2 pull-local repo ${newrev}
${CMD_PREFIX} ostree --repo=repo2 fsck
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]