Add jgvariant-ostree module.

Change-Id: Idf7bacad28d7cf65eb1ddd0994dcc2c2c2a7e18e
diff --git a/jgvariant-ostree/src/test/java/eu/mulk/jgvariant/ostree/OstreeDecoderTest.java b/jgvariant-ostree/src/test/java/eu/mulk/jgvariant/ostree/OstreeDecoderTest.java
new file mode 100644
index 0000000..5e4d37c
--- /dev/null
+++ b/jgvariant-ostree/src/test/java/eu/mulk/jgvariant/ostree/OstreeDecoderTest.java
@@ -0,0 +1,104 @@
+package eu.mulk.jgvariant.ostree;
+
+import static org.junit.jupiter.api.Assertions.assertAll;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+import com.adelean.inject.resources.junit.jupiter.GivenBinaryResource;
+import com.adelean.inject.resources.junit.jupiter.TestWithResources;
+import eu.mulk.jgvariant.core.Signature;
+import eu.mulk.jgvariant.core.Variant;
+import java.nio.ByteBuffer;
+import java.util.List;
+import org.junit.jupiter.api.Disabled;
+import org.junit.jupiter.api.Test;
+
+@TestWithResources
+class OstreeDecoderTest {
+
+  @GivenBinaryResource("/ostree/summary")
+  byte[] summaryBytes;
+
+  @GivenBinaryResource(
+      "/ostree/objects/3d/3b3329dca38871f29aeda1bf5854d76c707fa269759a899d0985c91815fe6f.commit")
+  byte[] commitBytes;
+
+  @GivenBinaryResource(
+      "/ostree/objects/14/c9b958ac59df4979095a3485b4da5a045fe8737ffdba8cfbfff24988b238f7.dirtree")
+  byte[] dirTreeBytes;
+
+  @GivenBinaryResource(
+      "/ostree/objects/48/cc6a2ecdab284b9d1e5b0e875c905866ff32f65ee1e857df0e691285d6f14c.dirmeta")
+  byte[] dirMetaBytes;
+
+  @GivenBinaryResource("/ostree/deltas/Mc/iDXVydLGaHpQCRyFFC0bLYU_9Bap+4G07jB1RRDVI/superblock")
+  byte[] deltaSuperblockBytes;
+
+  @GivenBinaryResource("/ostree/deltas/Mc/iDXVydLGaHpQCRyFFC0bLYU_9Bap+4G07jB1RRDVI/0")
+  byte[] deltaPartPayloadBytes;
+
+  @Test
+  void testTrivial() {
+    assertTrue(true);
+  }
+
+  @Test
+  void testSummaryDecoder() {
+    var decoder = Summary.decoder();
+    var summary = decoder.decode(ByteBuffer.wrap(summaryBytes));
+    assertAll(
+        () ->
+            assertEquals(
+                List.of(
+                    new Summary.Entry(
+                        "mulkos/1.x/amd64",
+                        new Summary.Entry.Value(
+                            214,
+                            Checksum.ofHex(
+                                "66ff167ff35ce87daac817447a9490a262ee75f095f017716a6eb1a9d9eb3350"),
+                            new Metadata(
+                                List.of(
+                                    new Metadata.Field(
+                                        "ostree.commit.timestamp",
+                                        new Variant(Signature.parse("t"), 1640537170L))))))),
+                summary.entries()));
+    // FIXME: check metadata field
+    System.out.println(summary);
+  }
+
+  @Test
+  void testCommitDecoder() {
+    var decoder = Commit.decoder();
+    var commit = decoder.decode(ByteBuffer.wrap(commitBytes));
+    System.out.println(commit);
+  }
+
+  @Test
+  void testDirTreeDecoder() {
+    var decoder = DirTree.decoder();
+    var dirTree = decoder.decode(ByteBuffer.wrap(dirTreeBytes));
+    System.out.println(dirTree);
+  }
+
+  @Test
+  void testDirMetaDecoder() {
+    var decoder = DirMeta.decoder();
+    var dirMeta = decoder.decode(ByteBuffer.wrap(dirMetaBytes));
+    System.out.println(dirMeta);
+  }
+
+  @Test
+  void testSuperblockDecoder() {
+    var decoder = DeltaSuperblock.decoder();
+    var deltaSuperblock = decoder.decode(ByteBuffer.wrap(deltaSuperblockBytes));
+    System.out.println(deltaSuperblock);
+  }
+
+  @Disabled("invalid: compression byte not taken into account")
+  @Test
+  void testPartPayloadDecoder() {
+    var decoder = DeltaPartPayload.decoder();
+    var deltaPartPayload = decoder.decode(ByteBuffer.wrap(deltaPartPayloadBytes));
+    System.out.println(deltaPartPayload);
+  }
+}
diff --git a/jgvariant-ostree/src/test/resources/ostree/.lock b/jgvariant-ostree/src/test/resources/ostree/.lock
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/jgvariant-ostree/src/test/resources/ostree/.lock
diff --git a/jgvariant-ostree/src/test/resources/ostree/config b/jgvariant-ostree/src/test/resources/ostree/config
new file mode 100644
index 0000000..15694aa
--- /dev/null
+++ b/jgvariant-ostree/src/test/resources/ostree/config
@@ -0,0 +1,4 @@
+[core]
+repo_version=1
+mode=bare
+indexed-deltas=true
diff --git a/jgvariant-ostree/src/test/resources/ostree/delta-indexes/Mc/iDXVydLGaHpQCRyFFC0bLYU_9Bap+4G07jB1RRDVI.index b/jgvariant-ostree/src/test/resources/ostree/delta-indexes/Mc/iDXVydLGaHpQCRyFFC0bLYU_9Bap+4G07jB1RRDVI.index
new file mode 100644
index 0000000..455b34c
--- /dev/null
+++ b/jgvariant-ostree/src/test/resources/ostree/delta-indexes/Mc/iDXVydLGaHpQCRyFFC0bLYU_9Bap+4G07jB1RRDVI.index
Binary files differ
diff --git a/jgvariant-ostree/src/test/resources/ostree/delta-indexes/PT/szKdyjiHHymu2hv1hU12xwf6JpdZqJnQmFyRgV_m8.index b/jgvariant-ostree/src/test/resources/ostree/delta-indexes/PT/szKdyjiHHymu2hv1hU12xwf6JpdZqJnQmFyRgV_m8.index
new file mode 100644
index 0000000..4b44198
--- /dev/null
+++ b/jgvariant-ostree/src/test/resources/ostree/delta-indexes/PT/szKdyjiHHymu2hv1hU12xwf6JpdZqJnQmFyRgV_m8.index
Binary files differ
diff --git a/jgvariant-ostree/src/test/resources/ostree/delta-indexes/Zv/8Wf_Nc6H2qyBdEepSQomLudfCV8Bdxam6xqdnrM1A.index b/jgvariant-ostree/src/test/resources/ostree/delta-indexes/Zv/8Wf_Nc6H2qyBdEepSQomLudfCV8Bdxam6xqdnrM1A.index
new file mode 100644
index 0000000..2ff3e34
--- /dev/null
+++ b/jgvariant-ostree/src/test/resources/ostree/delta-indexes/Zv/8Wf_Nc6H2qyBdEepSQomLudfCV8Bdxam6xqdnrM1A.index
Binary files differ
diff --git a/jgvariant-ostree/src/test/resources/ostree/deltas/Mc/iDXVydLGaHpQCRyFFC0bLYU_9Bap+4G07jB1RRDVI-PTszKdyjiHHymu2hv1hU12xwf6JpdZqJnQmFyRgV_m8/0 b/jgvariant-ostree/src/test/resources/ostree/deltas/Mc/iDXVydLGaHpQCRyFFC0bLYU_9Bap+4G07jB1RRDVI-PTszKdyjiHHymu2hv1hU12xwf6JpdZqJnQmFyRgV_m8/0
new file mode 100644
index 0000000..8fbcd13
--- /dev/null
+++ b/jgvariant-ostree/src/test/resources/ostree/deltas/Mc/iDXVydLGaHpQCRyFFC0bLYU_9Bap+4G07jB1RRDVI-PTszKdyjiHHymu2hv1hU12xwf6JpdZqJnQmFyRgV_m8/0
Binary files differ
diff --git a/jgvariant-ostree/src/test/resources/ostree/deltas/Mc/iDXVydLGaHpQCRyFFC0bLYU_9Bap+4G07jB1RRDVI-PTszKdyjiHHymu2hv1hU12xwf6JpdZqJnQmFyRgV_m8/superblock b/jgvariant-ostree/src/test/resources/ostree/deltas/Mc/iDXVydLGaHpQCRyFFC0bLYU_9Bap+4G07jB1RRDVI-PTszKdyjiHHymu2hv1hU12xwf6JpdZqJnQmFyRgV_m8/superblock
new file mode 100644
index 0000000..24b2739
--- /dev/null
+++ b/jgvariant-ostree/src/test/resources/ostree/deltas/Mc/iDXVydLGaHpQCRyFFC0bLYU_9Bap+4G07jB1RRDVI-PTszKdyjiHHymu2hv1hU12xwf6JpdZqJnQmFyRgV_m8/superblock
Binary files differ
diff --git a/jgvariant-ostree/src/test/resources/ostree/deltas/Mc/iDXVydLGaHpQCRyFFC0bLYU_9Bap+4G07jB1RRDVI/0 b/jgvariant-ostree/src/test/resources/ostree/deltas/Mc/iDXVydLGaHpQCRyFFC0bLYU_9Bap+4G07jB1RRDVI/0
new file mode 100644
index 0000000..86a5de4
--- /dev/null
+++ b/jgvariant-ostree/src/test/resources/ostree/deltas/Mc/iDXVydLGaHpQCRyFFC0bLYU_9Bap+4G07jB1RRDVI/0
Binary files differ
diff --git a/jgvariant-ostree/src/test/resources/ostree/deltas/Mc/iDXVydLGaHpQCRyFFC0bLYU_9Bap+4G07jB1RRDVI/superblock b/jgvariant-ostree/src/test/resources/ostree/deltas/Mc/iDXVydLGaHpQCRyFFC0bLYU_9Bap+4G07jB1RRDVI/superblock
new file mode 100644
index 0000000..6a8ea75
--- /dev/null
+++ b/jgvariant-ostree/src/test/resources/ostree/deltas/Mc/iDXVydLGaHpQCRyFFC0bLYU_9Bap+4G07jB1RRDVI/superblock
Binary files differ
diff --git a/jgvariant-ostree/src/test/resources/ostree/deltas/PT/szKdyjiHHymu2hv1hU12xwf6JpdZqJnQmFyRgV_m8-Zv8Wf_Nc6H2qyBdEepSQomLudfCV8Bdxam6xqdnrM1A/0 b/jgvariant-ostree/src/test/resources/ostree/deltas/PT/szKdyjiHHymu2hv1hU12xwf6JpdZqJnQmFyRgV_m8-Zv8Wf_Nc6H2qyBdEepSQomLudfCV8Bdxam6xqdnrM1A/0
new file mode 100644
index 0000000..483db33
--- /dev/null
+++ b/jgvariant-ostree/src/test/resources/ostree/deltas/PT/szKdyjiHHymu2hv1hU12xwf6JpdZqJnQmFyRgV_m8-Zv8Wf_Nc6H2qyBdEepSQomLudfCV8Bdxam6xqdnrM1A/0
Binary files differ
diff --git a/jgvariant-ostree/src/test/resources/ostree/deltas/PT/szKdyjiHHymu2hv1hU12xwf6JpdZqJnQmFyRgV_m8-Zv8Wf_Nc6H2qyBdEepSQomLudfCV8Bdxam6xqdnrM1A/superblock b/jgvariant-ostree/src/test/resources/ostree/deltas/PT/szKdyjiHHymu2hv1hU12xwf6JpdZqJnQmFyRgV_m8-Zv8Wf_Nc6H2qyBdEepSQomLudfCV8Bdxam6xqdnrM1A/superblock
new file mode 100644
index 0000000..219c92a
--- /dev/null
+++ b/jgvariant-ostree/src/test/resources/ostree/deltas/PT/szKdyjiHHymu2hv1hU12xwf6JpdZqJnQmFyRgV_m8-Zv8Wf_Nc6H2qyBdEepSQomLudfCV8Bdxam6xqdnrM1A/superblock
Binary files differ
diff --git a/jgvariant-ostree/src/test/resources/ostree/objects/14/c9b958ac59df4979095a3485b4da5a045fe8737ffdba8cfbfff24988b238f7.dirtree b/jgvariant-ostree/src/test/resources/ostree/objects/14/c9b958ac59df4979095a3485b4da5a045fe8737ffdba8cfbfff24988b238f7.dirtree
new file mode 100644
index 0000000..8f4b074
--- /dev/null
+++ b/jgvariant-ostree/src/test/resources/ostree/objects/14/c9b958ac59df4979095a3485b4da5a045fe8737ffdba8cfbfff24988b238f7.dirtree
Binary files differ
diff --git a/jgvariant-ostree/src/test/resources/ostree/objects/15/87cb76cddd6ecdd5830a0f218d6ba60a95e79643ed8764ad62cf18e62a0b59.file b/jgvariant-ostree/src/test/resources/ostree/objects/15/87cb76cddd6ecdd5830a0f218d6ba60a95e79643ed8764ad62cf18e62a0b59.file
new file mode 100644
index 0000000..3987f9c
--- /dev/null
+++ b/jgvariant-ostree/src/test/resources/ostree/objects/15/87cb76cddd6ecdd5830a0f218d6ba60a95e79643ed8764ad62cf18e62a0b59.file
@@ -0,0 +1 @@
+version 1.1
diff --git a/jgvariant-ostree/src/test/resources/ostree/objects/31/c8835d5c9d2c6687a50091c85142d1b2d853ff416a9fb81b4ee30754510d52.commit b/jgvariant-ostree/src/test/resources/ostree/objects/31/c8835d5c9d2c6687a50091c85142d1b2d853ff416a9fb81b4ee30754510d52.commit
new file mode 100644
index 0000000..bcd2731
--- /dev/null
+++ b/jgvariant-ostree/src/test/resources/ostree/objects/31/c8835d5c9d2c6687a50091c85142d1b2d853ff416a9fb81b4ee30754510d52.commit
Binary files differ
diff --git a/jgvariant-ostree/src/test/resources/ostree/objects/3d/3b3329dca38871f29aeda1bf5854d76c707fa269759a899d0985c91815fe6f.commit b/jgvariant-ostree/src/test/resources/ostree/objects/3d/3b3329dca38871f29aeda1bf5854d76c707fa269759a899d0985c91815fe6f.commit
new file mode 100644
index 0000000..c6ab7dc
--- /dev/null
+++ b/jgvariant-ostree/src/test/resources/ostree/objects/3d/3b3329dca38871f29aeda1bf5854d76c707fa269759a899d0985c91815fe6f.commit
Binary files differ
diff --git a/jgvariant-ostree/src/test/resources/ostree/objects/46/22b8c6cdcb4cbe29b8f79641f0304b30066596194b6b32981e46422d12c282.dirtree b/jgvariant-ostree/src/test/resources/ostree/objects/46/22b8c6cdcb4cbe29b8f79641f0304b30066596194b6b32981e46422d12c282.dirtree
new file mode 100644
index 0000000..196a4bc
--- /dev/null
+++ b/jgvariant-ostree/src/test/resources/ostree/objects/46/22b8c6cdcb4cbe29b8f79641f0304b30066596194b6b32981e46422d12c282.dirtree
Binary files differ
diff --git a/jgvariant-ostree/src/test/resources/ostree/objects/48/cc6a2ecdab284b9d1e5b0e875c905866ff32f65ee1e857df0e691285d6f14c.dirmeta b/jgvariant-ostree/src/test/resources/ostree/objects/48/cc6a2ecdab284b9d1e5b0e875c905866ff32f65ee1e857df0e691285d6f14c.dirmeta
new file mode 100644
index 0000000..4c76b11
--- /dev/null
+++ b/jgvariant-ostree/src/test/resources/ostree/objects/48/cc6a2ecdab284b9d1e5b0e875c905866ff32f65ee1e857df0e691285d6f14c.dirmeta
Binary files differ
diff --git a/jgvariant-ostree/src/test/resources/ostree/objects/66/ff167ff35ce87daac817447a9490a262ee75f095f017716a6eb1a9d9eb3350.commit b/jgvariant-ostree/src/test/resources/ostree/objects/66/ff167ff35ce87daac817447a9490a262ee75f095f017716a6eb1a9d9eb3350.commit
new file mode 100644
index 0000000..45aaf5f
--- /dev/null
+++ b/jgvariant-ostree/src/test/resources/ostree/objects/66/ff167ff35ce87daac817447a9490a262ee75f095f017716a6eb1a9d9eb3350.commit
Binary files differ
diff --git a/jgvariant-ostree/src/test/resources/ostree/objects/73/4ed4332dd46f0ec95395ea6b404f9a19eacfc74de9100e19842cbe9b960d0a.dirtree b/jgvariant-ostree/src/test/resources/ostree/objects/73/4ed4332dd46f0ec95395ea6b404f9a19eacfc74de9100e19842cbe9b960d0a.dirtree
new file mode 100644
index 0000000..d7e9e1f
--- /dev/null
+++ b/jgvariant-ostree/src/test/resources/ostree/objects/73/4ed4332dd46f0ec95395ea6b404f9a19eacfc74de9100e19842cbe9b960d0a.dirtree
Binary files differ
diff --git a/jgvariant-ostree/src/test/resources/ostree/objects/76/766e52e4a737646788570c8c44a3cf70b17ece81ce4c9b44f4f5869f138e8d.dirtree b/jgvariant-ostree/src/test/resources/ostree/objects/76/766e52e4a737646788570c8c44a3cf70b17ece81ce4c9b44f4f5869f138e8d.dirtree
new file mode 100644
index 0000000..7a4ee69
--- /dev/null
+++ b/jgvariant-ostree/src/test/resources/ostree/objects/76/766e52e4a737646788570c8c44a3cf70b17ece81ce4c9b44f4f5869f138e8d.dirtree
Binary files differ
diff --git a/jgvariant-ostree/src/test/resources/ostree/objects/84/2d6670d6c0d116a9723bd4329cacec722079177e886bd833f182500b879bfe.dirtree b/jgvariant-ostree/src/test/resources/ostree/objects/84/2d6670d6c0d116a9723bd4329cacec722079177e886bd833f182500b879bfe.dirtree
new file mode 100644
index 0000000..cf37b48
--- /dev/null
+++ b/jgvariant-ostree/src/test/resources/ostree/objects/84/2d6670d6c0d116a9723bd4329cacec722079177e886bd833f182500b879bfe.dirtree
Binary files differ
diff --git a/jgvariant-ostree/src/test/resources/ostree/objects/88/534f940aa700c0f5d470c86f699179bf11fe486f3a8514f56a9703355d761b.dirtree b/jgvariant-ostree/src/test/resources/ostree/objects/88/534f940aa700c0f5d470c86f699179bf11fe486f3a8514f56a9703355d761b.dirtree
new file mode 100644
index 0000000..1005c58
--- /dev/null
+++ b/jgvariant-ostree/src/test/resources/ostree/objects/88/534f940aa700c0f5d470c86f699179bf11fe486f3a8514f56a9703355d761b.dirtree
Binary files differ
diff --git a/jgvariant-ostree/src/test/resources/ostree/objects/8f/576d91bd42c0d7682000271d40aa27866537d477220b2b97f536ada9da0d7c.file b/jgvariant-ostree/src/test/resources/ostree/objects/8f/576d91bd42c0d7682000271d40aa27866537d477220b2b97f536ada9da0d7c.file
new file mode 100644
index 0000000..26af6a8
--- /dev/null
+++ b/jgvariant-ostree/src/test/resources/ostree/objects/8f/576d91bd42c0d7682000271d40aa27866537d477220b2b97f536ada9da0d7c.file
@@ -0,0 +1 @@
+zero
diff --git a/jgvariant-ostree/src/test/resources/ostree/objects/92/6fd84a0da031392cd97a07948238946894979695a25a3dd9da5fe3f719c98a.file b/jgvariant-ostree/src/test/resources/ostree/objects/92/6fd84a0da031392cd97a07948238946894979695a25a3dd9da5fe3f719c98a.file
new file mode 100644
index 0000000..f719efd
--- /dev/null
+++ b/jgvariant-ostree/src/test/resources/ostree/objects/92/6fd84a0da031392cd97a07948238946894979695a25a3dd9da5fe3f719c98a.file
@@ -0,0 +1 @@
+two
diff --git a/jgvariant-ostree/src/test/resources/ostree/objects/c9/af809d0778808c3b5f38bbac35d88da150cbb4cf3929b2e5ed2f9828080e08.file b/jgvariant-ostree/src/test/resources/ostree/objects/c9/af809d0778808c3b5f38bbac35d88da150cbb4cf3929b2e5ed2f9828080e08.file
new file mode 100644
index 0000000..5626abf
--- /dev/null
+++ b/jgvariant-ostree/src/test/resources/ostree/objects/c9/af809d0778808c3b5f38bbac35d88da150cbb4cf3929b2e5ed2f9828080e08.file
@@ -0,0 +1 @@
+one
diff --git a/jgvariant-ostree/src/test/resources/ostree/objects/cf/ff1525790c356cf268894ce6cabda5c5aa6fabc8b2becb39faf2d195f8ebaa.dirtree b/jgvariant-ostree/src/test/resources/ostree/objects/cf/ff1525790c356cf268894ce6cabda5c5aa6fabc8b2becb39faf2d195f8ebaa.dirtree
new file mode 100644
index 0000000..b568e92
--- /dev/null
+++ b/jgvariant-ostree/src/test/resources/ostree/objects/cf/ff1525790c356cf268894ce6cabda5c5aa6fabc8b2becb39faf2d195f8ebaa.dirtree
Binary files differ
diff --git a/jgvariant-ostree/src/test/resources/ostree/objects/d3/365463d0acd8eda475a874a01dae6b7f20b5ce8864e36fa27d485a7b821d6d.file b/jgvariant-ostree/src/test/resources/ostree/objects/d3/365463d0acd8eda475a874a01dae6b7f20b5ce8864e36fa27d485a7b821d6d.file
new file mode 100644
index 0000000..7c8de03
--- /dev/null
+++ b/jgvariant-ostree/src/test/resources/ostree/objects/d3/365463d0acd8eda475a874a01dae6b7f20b5ce8864e36fa27d485a7b821d6d.file
@@ -0,0 +1 @@
+version 1.0
diff --git a/jgvariant-ostree/src/test/resources/ostree/objects/df/f640414799416e7a874eaec41471905adaf18b694ec537fb99e662626864f3.file b/jgvariant-ostree/src/test/resources/ostree/objects/df/f640414799416e7a874eaec41471905adaf18b694ec537fb99e662626864f3.file
new file mode 100644
index 0000000..ef7df68
--- /dev/null
+++ b/jgvariant-ostree/src/test/resources/ostree/objects/df/f640414799416e7a874eaec41471905adaf18b694ec537fb99e662626864f3.file
@@ -0,0 +1 @@
+version 1.2
diff --git a/jgvariant-ostree/src/test/resources/ostree/objects/e0/83c4299293b067841a51af2c9156dc3b35f95af27773147b0458934ca37d4f.file b/jgvariant-ostree/src/test/resources/ostree/objects/e0/83c4299293b067841a51af2c9156dc3b35f95af27773147b0458934ca37d4f.file
new file mode 100644
index 0000000..2bdf67a
--- /dev/null
+++ b/jgvariant-ostree/src/test/resources/ostree/objects/e0/83c4299293b067841a51af2c9156dc3b35f95af27773147b0458934ca37d4f.file
@@ -0,0 +1 @@
+three
diff --git a/jgvariant-ostree/src/test/resources/ostree/refs/heads/mulkos/1.x/amd64 b/jgvariant-ostree/src/test/resources/ostree/refs/heads/mulkos/1.x/amd64
new file mode 100644
index 0000000..82901ea
--- /dev/null
+++ b/jgvariant-ostree/src/test/resources/ostree/refs/heads/mulkos/1.x/amd64
@@ -0,0 +1 @@
+66ff167ff35ce87daac817447a9490a262ee75f095f017716a6eb1a9d9eb3350
diff --git a/jgvariant-ostree/src/test/resources/ostree/summary b/jgvariant-ostree/src/test/resources/ostree/summary
new file mode 100644
index 0000000..4bd06af
--- /dev/null
+++ b/jgvariant-ostree/src/test/resources/ostree/summary
Binary files differ