From 4e8423db22a77af394bb519e2a828714ab48898d Mon Sep 17 00:00:00 2001 From: Matthias Andreas Benkard Date: Sun, 19 Dec 2021 22:56:09 +0100 Subject: Add jgvariant-ostree module. Change-Id: Idf7bacad28d7cf65eb1ddd0994dcc2c2c2a7e18e --- .../java/eu/mulk/jgvariant/ostree/ByteString.java | 41 ++++++++ .../java/eu/mulk/jgvariant/ostree/Checksum.java | 24 +++++ .../main/java/eu/mulk/jgvariant/ostree/Commit.java | 51 ++++++++++ .../eu/mulk/jgvariant/ostree/DeltaFallback.java | 25 +++++ .../eu/mulk/jgvariant/ostree/DeltaMetaEntry.java | 38 ++++++++ .../eu/mulk/jgvariant/ostree/DeltaPartPayload.java | 41 ++++++++ .../eu/mulk/jgvariant/ostree/DeltaSuperblock.java | 43 +++++++++ .../java/eu/mulk/jgvariant/ostree/DirMeta.java | 25 +++++ .../java/eu/mulk/jgvariant/ostree/DirTree.java | 49 ++++++++++ .../java/eu/mulk/jgvariant/ostree/FileMeta.java | 25 +++++ .../java/eu/mulk/jgvariant/ostree/Metadata.java | 33 +++++++ .../java/eu/mulk/jgvariant/ostree/SignedDelta.java | 38 ++++++++ .../java/eu/mulk/jgvariant/ostree/Summary.java | 47 ++++++++++ .../eu/mulk/jgvariant/ostree/SummarySignature.java | 35 +++++++ .../main/java/eu/mulk/jgvariant/ostree/Xattr.java | 18 ++++ .../eu/mulk/jgvariant/ostree/package-info.java | 10 ++ jgvariant-ostree/src/main/java/module-info.java | 85 +++++++++++++++++ .../mulk/jgvariant/ostree/OstreeDecoderTest.java | 104 +++++++++++++++++++++ jgvariant-ostree/src/test/resources/ostree/.lock | 0 jgvariant-ostree/src/test/resources/ostree/config | 4 + ...iDXVydLGaHpQCRyFFC0bLYU_9Bap+4G07jB1RRDVI.index | Bin 0 -> 141 bytes ...szKdyjiHHymu2hv1hU12xwf6JpdZqJnQmFyRgV_m8.index | Bin 0 -> 205 bytes ...8Wf_Nc6H2qyBdEepSQomLudfCV8Bdxam6xqdnrM1A.index | Bin 0 -> 205 bytes .../0 | Bin 0 -> 489 bytes .../superblock | Bin 0 -> 524 bytes .../Mc/iDXVydLGaHpQCRyFFC0bLYU_9Bap+4G07jB1RRDVI/0 | Bin 0 -> 509 bytes .../superblock | Bin 0 -> 628 bytes .../0 | Bin 0 -> 433 bytes .../superblock | Bin 0 -> 460 bytes ...5b4da5a045fe8737ffdba8cfbfff24988b238f7.dirtree | Bin 0 -> 45 bytes ...0f218d6ba60a95e79643ed8764ad62cf18e62a0b59.file | 1 + ...c85142d1b2d853ff416a9fb81b4ee30754510d52.commit | Bin 0 -> 182 bytes ...bf5854d76c707fa269759a899d0985c91815fe6f.commit | Bin 0 -> 214 bytes ...1f0304b30066596194b6b32981e46422d12c282.dirtree | Bin 0 -> 43 bytes ...75c905866ff32f65ee1e857df0e691285d6f14c.dirmeta | Bin 0 -> 41 bytes ...7a9490a262ee75f095f017716a6eb1a9d9eb3350.commit | Bin 0 -> 214 bytes ...b404f9a19eacfc74de9100e19842cbe9b960d0a.dirtree | Bin 0 -> 44 bytes ...c44a3cf70b17ece81ce4c9b44f4f5869f138e8d.dirtree | Bin 0 -> 43 bytes ...29cacec722079177e886bd833f182500b879bfe.dirtree | Bin 0 -> 264 bytes ...f699179bf11fe486f3a8514f56a9703355d761b.dirtree | Bin 0 -> 339 bytes ...271d40aa27866537d477220b2b97f536ada9da0d7c.file | 1 + ...07948238946894979695a25a3dd9da5fe3f719c98a.file | 1 + ...bbac35d88da150cbb4cf3929b2e5ed2f9828080e08.file | 1 + ...6cabda5c5aa6fabc8b2becb39faf2d195f8ebaa.dirtree | Bin 0 -> 339 bytes ...74a01dae6b7f20b5ce8864e36fa27d485a7b821d6d.file | 1 + ...aec41471905adaf18b694ec537fb99e662626864f3.file | 1 + ...af2c9156dc3b35f95af27773147b0458934ca37d4f.file | 1 + .../resources/ostree/refs/heads/mulkos/1.x/amd64 | 1 + jgvariant-ostree/src/test/resources/ostree/summary | Bin 0 -> 784 bytes 49 files changed, 744 insertions(+) create mode 100644 jgvariant-ostree/src/main/java/eu/mulk/jgvariant/ostree/ByteString.java create mode 100644 jgvariant-ostree/src/main/java/eu/mulk/jgvariant/ostree/Checksum.java create mode 100644 jgvariant-ostree/src/main/java/eu/mulk/jgvariant/ostree/Commit.java create mode 100644 jgvariant-ostree/src/main/java/eu/mulk/jgvariant/ostree/DeltaFallback.java create mode 100644 jgvariant-ostree/src/main/java/eu/mulk/jgvariant/ostree/DeltaMetaEntry.java create mode 100644 jgvariant-ostree/src/main/java/eu/mulk/jgvariant/ostree/DeltaPartPayload.java create mode 100644 jgvariant-ostree/src/main/java/eu/mulk/jgvariant/ostree/DeltaSuperblock.java create mode 100644 jgvariant-ostree/src/main/java/eu/mulk/jgvariant/ostree/DirMeta.java create mode 100644 jgvariant-ostree/src/main/java/eu/mulk/jgvariant/ostree/DirTree.java create mode 100644 jgvariant-ostree/src/main/java/eu/mulk/jgvariant/ostree/FileMeta.java create mode 100644 jgvariant-ostree/src/main/java/eu/mulk/jgvariant/ostree/Metadata.java create mode 100644 jgvariant-ostree/src/main/java/eu/mulk/jgvariant/ostree/SignedDelta.java create mode 100644 jgvariant-ostree/src/main/java/eu/mulk/jgvariant/ostree/Summary.java create mode 100644 jgvariant-ostree/src/main/java/eu/mulk/jgvariant/ostree/SummarySignature.java create mode 100644 jgvariant-ostree/src/main/java/eu/mulk/jgvariant/ostree/Xattr.java create mode 100644 jgvariant-ostree/src/main/java/eu/mulk/jgvariant/ostree/package-info.java create mode 100644 jgvariant-ostree/src/main/java/module-info.java create mode 100644 jgvariant-ostree/src/test/java/eu/mulk/jgvariant/ostree/OstreeDecoderTest.java create mode 100644 jgvariant-ostree/src/test/resources/ostree/.lock create mode 100644 jgvariant-ostree/src/test/resources/ostree/config create mode 100644 jgvariant-ostree/src/test/resources/ostree/delta-indexes/Mc/iDXVydLGaHpQCRyFFC0bLYU_9Bap+4G07jB1RRDVI.index create mode 100644 jgvariant-ostree/src/test/resources/ostree/delta-indexes/PT/szKdyjiHHymu2hv1hU12xwf6JpdZqJnQmFyRgV_m8.index create mode 100644 jgvariant-ostree/src/test/resources/ostree/delta-indexes/Zv/8Wf_Nc6H2qyBdEepSQomLudfCV8Bdxam6xqdnrM1A.index create mode 100644 jgvariant-ostree/src/test/resources/ostree/deltas/Mc/iDXVydLGaHpQCRyFFC0bLYU_9Bap+4G07jB1RRDVI-PTszKdyjiHHymu2hv1hU12xwf6JpdZqJnQmFyRgV_m8/0 create mode 100644 jgvariant-ostree/src/test/resources/ostree/deltas/Mc/iDXVydLGaHpQCRyFFC0bLYU_9Bap+4G07jB1RRDVI-PTszKdyjiHHymu2hv1hU12xwf6JpdZqJnQmFyRgV_m8/superblock create mode 100644 jgvariant-ostree/src/test/resources/ostree/deltas/Mc/iDXVydLGaHpQCRyFFC0bLYU_9Bap+4G07jB1RRDVI/0 create mode 100644 jgvariant-ostree/src/test/resources/ostree/deltas/Mc/iDXVydLGaHpQCRyFFC0bLYU_9Bap+4G07jB1RRDVI/superblock create mode 100644 jgvariant-ostree/src/test/resources/ostree/deltas/PT/szKdyjiHHymu2hv1hU12xwf6JpdZqJnQmFyRgV_m8-Zv8Wf_Nc6H2qyBdEepSQomLudfCV8Bdxam6xqdnrM1A/0 create mode 100644 jgvariant-ostree/src/test/resources/ostree/deltas/PT/szKdyjiHHymu2hv1hU12xwf6JpdZqJnQmFyRgV_m8-Zv8Wf_Nc6H2qyBdEepSQomLudfCV8Bdxam6xqdnrM1A/superblock create mode 100644 jgvariant-ostree/src/test/resources/ostree/objects/14/c9b958ac59df4979095a3485b4da5a045fe8737ffdba8cfbfff24988b238f7.dirtree create mode 100644 jgvariant-ostree/src/test/resources/ostree/objects/15/87cb76cddd6ecdd5830a0f218d6ba60a95e79643ed8764ad62cf18e62a0b59.file create mode 100644 jgvariant-ostree/src/test/resources/ostree/objects/31/c8835d5c9d2c6687a50091c85142d1b2d853ff416a9fb81b4ee30754510d52.commit create mode 100644 jgvariant-ostree/src/test/resources/ostree/objects/3d/3b3329dca38871f29aeda1bf5854d76c707fa269759a899d0985c91815fe6f.commit create mode 100644 jgvariant-ostree/src/test/resources/ostree/objects/46/22b8c6cdcb4cbe29b8f79641f0304b30066596194b6b32981e46422d12c282.dirtree create mode 100644 jgvariant-ostree/src/test/resources/ostree/objects/48/cc6a2ecdab284b9d1e5b0e875c905866ff32f65ee1e857df0e691285d6f14c.dirmeta create mode 100644 jgvariant-ostree/src/test/resources/ostree/objects/66/ff167ff35ce87daac817447a9490a262ee75f095f017716a6eb1a9d9eb3350.commit create mode 100644 jgvariant-ostree/src/test/resources/ostree/objects/73/4ed4332dd46f0ec95395ea6b404f9a19eacfc74de9100e19842cbe9b960d0a.dirtree create mode 100644 jgvariant-ostree/src/test/resources/ostree/objects/76/766e52e4a737646788570c8c44a3cf70b17ece81ce4c9b44f4f5869f138e8d.dirtree create mode 100644 jgvariant-ostree/src/test/resources/ostree/objects/84/2d6670d6c0d116a9723bd4329cacec722079177e886bd833f182500b879bfe.dirtree create mode 100644 jgvariant-ostree/src/test/resources/ostree/objects/88/534f940aa700c0f5d470c86f699179bf11fe486f3a8514f56a9703355d761b.dirtree create mode 100644 jgvariant-ostree/src/test/resources/ostree/objects/8f/576d91bd42c0d7682000271d40aa27866537d477220b2b97f536ada9da0d7c.file create mode 100644 jgvariant-ostree/src/test/resources/ostree/objects/92/6fd84a0da031392cd97a07948238946894979695a25a3dd9da5fe3f719c98a.file create mode 100644 jgvariant-ostree/src/test/resources/ostree/objects/c9/af809d0778808c3b5f38bbac35d88da150cbb4cf3929b2e5ed2f9828080e08.file create mode 100644 jgvariant-ostree/src/test/resources/ostree/objects/cf/ff1525790c356cf268894ce6cabda5c5aa6fabc8b2becb39faf2d195f8ebaa.dirtree create mode 100644 jgvariant-ostree/src/test/resources/ostree/objects/d3/365463d0acd8eda475a874a01dae6b7f20b5ce8864e36fa27d485a7b821d6d.file create mode 100644 jgvariant-ostree/src/test/resources/ostree/objects/df/f640414799416e7a874eaec41471905adaf18b694ec537fb99e662626864f3.file create mode 100644 jgvariant-ostree/src/test/resources/ostree/objects/e0/83c4299293b067841a51af2c9156dc3b35f95af27773147b0458934ca37d4f.file create mode 100644 jgvariant-ostree/src/test/resources/ostree/refs/heads/mulkos/1.x/amd64 create mode 100644 jgvariant-ostree/src/test/resources/ostree/summary (limited to 'jgvariant-ostree/src') diff --git a/jgvariant-ostree/src/main/java/eu/mulk/jgvariant/ostree/ByteString.java b/jgvariant-ostree/src/main/java/eu/mulk/jgvariant/ostree/ByteString.java new file mode 100644 index 0000000..1a85547 --- /dev/null +++ b/jgvariant-ostree/src/main/java/eu/mulk/jgvariant/ostree/ByteString.java @@ -0,0 +1,41 @@ +package eu.mulk.jgvariant.ostree; + +import eu.mulk.jgvariant.core.Decoder; +import java.util.Arrays; +import java.util.HexFormat; + +/** + * A wrapper for a {@code byte[]} that implements {@link #equals(Object)}, {@link #hashCode()}, and + * {@link #toString()} according to value semantics. + */ +public record ByteString(byte[] bytes) { + + private static final Decoder DECODER = Decoder.ofByteArray().map(ByteString::new); + + public static Decoder decoder() { + return DECODER; + } + + @Override + public boolean equals(Object o) { + return (o instanceof ByteString byteString) && Arrays.equals(bytes, byteString.bytes); + } + + @Override + public int hashCode() { + return Arrays.hashCode(bytes); + } + + @Override + public String toString() { + return "ByteString{hex=\"%s\"}".formatted(hex()); + } + + public String hex() { + return HexFormat.of().formatHex(bytes); + } + + public static ByteString ofHex(String hex) { + return new ByteString(HexFormat.of().parseHex(hex)); + } +} diff --git a/jgvariant-ostree/src/main/java/eu/mulk/jgvariant/ostree/Checksum.java b/jgvariant-ostree/src/main/java/eu/mulk/jgvariant/ostree/Checksum.java new file mode 100644 index 0000000..f77eb57 --- /dev/null +++ b/jgvariant-ostree/src/main/java/eu/mulk/jgvariant/ostree/Checksum.java @@ -0,0 +1,24 @@ +package eu.mulk.jgvariant.ostree; + +import eu.mulk.jgvariant.core.Decoder; + +/** + * A wrapper for {@link ByteString} that refers to a content-addressed object in an OSTree + * repository. + */ +public record Checksum(ByteString bytes) { + + private static final Decoder DECODER = ByteString.decoder().map(Checksum::new); + + public static Decoder decoder() { + return DECODER; + } + + public String hex() { + return bytes.hex(); + } + + public static Checksum ofHex(String hex) { + return new Checksum(ByteString.ofHex(hex)); + } +} diff --git a/jgvariant-ostree/src/main/java/eu/mulk/jgvariant/ostree/Commit.java b/jgvariant-ostree/src/main/java/eu/mulk/jgvariant/ostree/Commit.java new file mode 100644 index 0000000..43909ba --- /dev/null +++ b/jgvariant-ostree/src/main/java/eu/mulk/jgvariant/ostree/Commit.java @@ -0,0 +1,51 @@ +package eu.mulk.jgvariant.ostree; + +import eu.mulk.jgvariant.core.Decoder; +import java.nio.ByteOrder; +import java.nio.charset.StandardCharsets; +import java.util.List; + +/** + * A commit in an OSTree repository. + * + *

Has an optional parent, a root directory, and various metadata. + * + *

Reference: {@code ostree-core.h#OSTREE_COMMIT_GVARIANT_STRING} + */ +public record Commit( + Metadata metadata, + Checksum parentChecksum, + List relatedObjects, + String subject, + String body, + long timestamp, + Checksum rootDirTreeChecksum, + Checksum rootDirMetaChecksum) { + + public record RelatedObject(String ref, Checksum commitChecksum) { + + private static final Decoder DECODER = + Decoder.ofStructure( + RelatedObject.class, Decoder.ofString(StandardCharsets.UTF_8), Checksum.decoder()); + + public static Decoder decoder() { + return DECODER; + } + } + + private static final Decoder DECODER = + Decoder.ofStructure( + Commit.class, + Metadata.decoder(), + Checksum.decoder(), + Decoder.ofArray(RelatedObject.decoder()), + Decoder.ofString(StandardCharsets.UTF_8), + Decoder.ofString(StandardCharsets.UTF_8), + Decoder.ofLong().withByteOrder(ByteOrder.BIG_ENDIAN), + Checksum.decoder(), + Checksum.decoder()); + + public static Decoder decoder() { + return DECODER; + } +} diff --git a/jgvariant-ostree/src/main/java/eu/mulk/jgvariant/ostree/DeltaFallback.java b/jgvariant-ostree/src/main/java/eu/mulk/jgvariant/ostree/DeltaFallback.java new file mode 100644 index 0000000..1b3cc0a --- /dev/null +++ b/jgvariant-ostree/src/main/java/eu/mulk/jgvariant/ostree/DeltaFallback.java @@ -0,0 +1,25 @@ +package eu.mulk.jgvariant.ostree; + +import eu.mulk.jgvariant.core.Decoder; +import java.nio.ByteOrder; + +/** + * A fallback entry in a {@link DeltaSuperblock}. + * + *

Reference: {@code ostree-repo-static-delta-private.h#OSTREE_STATIC_DELTA_FALLBACK_FORMAT} + */ +public record DeltaFallback( + byte objectType, Checksum checksum, long compressedSize, long uncompressedSize) { + + private static final Decoder DECODER = + Decoder.ofStructure( + DeltaFallback.class, + Decoder.ofByte(), + Checksum.decoder(), + Decoder.ofLong().withByteOrder(ByteOrder.LITTLE_ENDIAN), // FIXME: non-canonical + Decoder.ofLong().withByteOrder(ByteOrder.LITTLE_ENDIAN)); // FIXME: non-canonical + + public static Decoder decoder() { + return DECODER; + } +} diff --git a/jgvariant-ostree/src/main/java/eu/mulk/jgvariant/ostree/DeltaMetaEntry.java b/jgvariant-ostree/src/main/java/eu/mulk/jgvariant/ostree/DeltaMetaEntry.java new file mode 100644 index 0000000..39ada86 --- /dev/null +++ b/jgvariant-ostree/src/main/java/eu/mulk/jgvariant/ostree/DeltaMetaEntry.java @@ -0,0 +1,38 @@ +package eu.mulk.jgvariant.ostree; + +import eu.mulk.jgvariant.core.Decoder; +import java.nio.ByteOrder; +import java.util.List; + +/** + * An entry in a {@link DeltaSuperblock}. + * + *

Reference: {@code ostree-repo-static-delta-private.h#OSTREE_STATIC_DELTA_META_ENTRY_FORMAT} + */ +public record DeltaMetaEntry( + int version, Checksum checksum, long size, long usize, List objects) { + + record DeltaObject(byte objectType, Checksum checksum) { + + private static final Decoder DECODER = + Decoder.ofStructure(DeltaObject.class, Decoder.ofByte(), Checksum.decoder()); + + public static Decoder decoder() { + return DECODER; + } + } + + private static final Decoder DECODER = + Decoder.ofStructure( + DeltaMetaEntry.class, + Decoder.ofInt().withByteOrder(ByteOrder.LITTLE_ENDIAN), // FIXME: non-canonical + Checksum.decoder(), + Decoder.ofLong().withByteOrder(ByteOrder.LITTLE_ENDIAN), // FIXME: non-canonical + Decoder.ofLong().withByteOrder(ByteOrder.LITTLE_ENDIAN), // FIXME: non-canonical + Decoder.ofByteArray().map(x -> List.of()) // FIXME + ); + + public static Decoder decoder() { + return DECODER; + } +} diff --git a/jgvariant-ostree/src/main/java/eu/mulk/jgvariant/ostree/DeltaPartPayload.java b/jgvariant-ostree/src/main/java/eu/mulk/jgvariant/ostree/DeltaPartPayload.java new file mode 100644 index 0000000..c8c5fe7 --- /dev/null +++ b/jgvariant-ostree/src/main/java/eu/mulk/jgvariant/ostree/DeltaPartPayload.java @@ -0,0 +1,41 @@ +package eu.mulk.jgvariant.ostree; + +import eu.mulk.jgvariant.core.Decoder; +import java.nio.ByteOrder; +import java.util.List; + +/** + * Reference: {@code ostree-repo-static-delta-private.h#OSTREE_STATIC_DELTA_PART_PAYLOAD_FORMAT_V0} + */ +public record DeltaPartPayload( + List fileModes, + List> xattrs, + ByteString rawDataSource, + ByteString operations) { + + private static final Decoder DECODER = + Decoder.ofStructure( + DeltaPartPayload.class, + Decoder.ofArray(FileMode.decoder()), + Decoder.ofArray(Decoder.ofArray(Xattr.decoder())), + ByteString.decoder(), + ByteString.decoder()); + + public record FileMode(int uid, int gid, int mode) { + + private static final Decoder DECODER = + Decoder.ofStructure( + FileMode.class, + Decoder.ofInt().withByteOrder(ByteOrder.LITTLE_ENDIAN), + Decoder.ofInt().withByteOrder(ByteOrder.LITTLE_ENDIAN), + Decoder.ofInt().withByteOrder(ByteOrder.LITTLE_ENDIAN)); + + public static Decoder decoder() { + return DECODER; + } + } + + public static Decoder decoder() { + return DECODER; + } +} diff --git a/jgvariant-ostree/src/main/java/eu/mulk/jgvariant/ostree/DeltaSuperblock.java b/jgvariant-ostree/src/main/java/eu/mulk/jgvariant/ostree/DeltaSuperblock.java new file mode 100644 index 0000000..2b09645 --- /dev/null +++ b/jgvariant-ostree/src/main/java/eu/mulk/jgvariant/ostree/DeltaSuperblock.java @@ -0,0 +1,43 @@ +package eu.mulk.jgvariant.ostree; + +import eu.mulk.jgvariant.core.Decoder; +import java.nio.ByteOrder; +import java.util.List; + +/** Reference: {@code ostree-repo-static-delta-private.h#OSTREE_STATIC_DELTA_SUPERBLOCK_FORMAT} */ +public record DeltaSuperblock( + Metadata metadata, + long timestamp, + Checksum fromChecksum, + Checksum toChecksum, + Commit commit, + List dependencies, + List entries, + List fallbacks) { + + public record DeltaName(Checksum fromChecksum, Checksum toChecksum) { + + private static final Decoder DECODER = + Decoder.ofStructure(DeltaName.class, Checksum.decoder(), Checksum.decoder()); + + public static Decoder decoder() { + return DECODER; + } + } + + private static final Decoder DECODER = + Decoder.ofStructure( + DeltaSuperblock.class, + Metadata.decoder(), + Decoder.ofLong().withByteOrder(ByteOrder.BIG_ENDIAN), + Checksum.decoder(), + Checksum.decoder(), + Commit.decoder(), + Decoder.ofByteArray().map(x -> List.of()), // FIXME + Decoder.ofArray(DeltaMetaEntry.decoder()), + Decoder.ofArray(DeltaFallback.decoder())); + + public static Decoder decoder() { + return DECODER; + } +} diff --git a/jgvariant-ostree/src/main/java/eu/mulk/jgvariant/ostree/DirMeta.java b/jgvariant-ostree/src/main/java/eu/mulk/jgvariant/ostree/DirMeta.java new file mode 100644 index 0000000..3a9672d --- /dev/null +++ b/jgvariant-ostree/src/main/java/eu/mulk/jgvariant/ostree/DirMeta.java @@ -0,0 +1,25 @@ +package eu.mulk.jgvariant.ostree; + +import eu.mulk.jgvariant.core.Decoder; +import java.nio.ByteOrder; +import java.util.List; + +/** + * Permission bits and extended attributes for a directory. + * + *

Reference: {@code ostree-core.h#OSTREE_DIRMETA_GVARIANT_STRING} + */ +public record DirMeta(int uid, int gid, int mode, List xattrs) { + + private static final Decoder DECODER = + Decoder.ofStructure( + DirMeta.class, + Decoder.ofInt().withByteOrder(ByteOrder.BIG_ENDIAN), + Decoder.ofInt().withByteOrder(ByteOrder.BIG_ENDIAN), + Decoder.ofInt().withByteOrder(ByteOrder.BIG_ENDIAN), + Decoder.ofArray(Xattr.decoder())); + + public static Decoder decoder() { + return DECODER; + } +} diff --git a/jgvariant-ostree/src/main/java/eu/mulk/jgvariant/ostree/DirTree.java b/jgvariant-ostree/src/main/java/eu/mulk/jgvariant/ostree/DirTree.java new file mode 100644 index 0000000..3a14abb --- /dev/null +++ b/jgvariant-ostree/src/main/java/eu/mulk/jgvariant/ostree/DirTree.java @@ -0,0 +1,49 @@ +package eu.mulk.jgvariant.ostree; + +import eu.mulk.jgvariant.core.Decoder; +import java.nio.charset.StandardCharsets; +import java.util.List; + +/** + * Metadata describing files and directories of a file tree. + * + *

Referenced by {@link Commit#rootDirTreeChecksum()} and recursively by {@link + * Directory#treeChecksum()}. + * + *

Reference: {@code ostree-core.h#OSTREE_TREE_GVARIANT_STRING} + */ +public record DirTree(List files, List directories) { + + public record File(String name, Checksum checksum) { + + private static final Decoder DECODER = + Decoder.ofStructure( + File.class, Decoder.ofString(StandardCharsets.UTF_8), Checksum.decoder()); + + public static Decoder decoder() { + return DECODER; + } + } + + public record Directory(String name, Checksum treeChecksum, Checksum dirChecksum) { + + private static final Decoder DECODER = + Decoder.ofStructure( + Directory.class, + Decoder.ofString(StandardCharsets.UTF_8), + Checksum.decoder(), + Checksum.decoder()); + + public static Decoder decoder() { + return DECODER; + } + } + + private static final Decoder DECODER = + Decoder.ofStructure( + DirTree.class, Decoder.ofArray(File.decoder()), Decoder.ofArray(Directory.decoder())); + + public static Decoder decoder() { + return DECODER; + } +} diff --git a/jgvariant-ostree/src/main/java/eu/mulk/jgvariant/ostree/FileMeta.java b/jgvariant-ostree/src/main/java/eu/mulk/jgvariant/ostree/FileMeta.java new file mode 100644 index 0000000..19e0677 --- /dev/null +++ b/jgvariant-ostree/src/main/java/eu/mulk/jgvariant/ostree/FileMeta.java @@ -0,0 +1,25 @@ +package eu.mulk.jgvariant.ostree; + +import eu.mulk.jgvariant.core.Decoder; +import java.nio.ByteOrder; +import java.util.List; + +/** + * Permission bits and extended attributes for a file. + * + *

Reference: {@code ostree-core.h#OSTREE_FILEMETA_GVARIANT_STRING} + */ +public record FileMeta(int uid, int gid, int mode, List xattrs) { + + private static final Decoder DECODER = + Decoder.ofStructure( + FileMeta.class, + Decoder.ofInt().withByteOrder(ByteOrder.BIG_ENDIAN), + Decoder.ofInt().withByteOrder(ByteOrder.BIG_ENDIAN), + Decoder.ofInt().withByteOrder(ByteOrder.BIG_ENDIAN), + Decoder.ofArray(Xattr.decoder())); + + public static Decoder decoder() { + return DECODER; + } +} diff --git a/jgvariant-ostree/src/main/java/eu/mulk/jgvariant/ostree/Metadata.java b/jgvariant-ostree/src/main/java/eu/mulk/jgvariant/ostree/Metadata.java new file mode 100644 index 0000000..cf838d3 --- /dev/null +++ b/jgvariant-ostree/src/main/java/eu/mulk/jgvariant/ostree/Metadata.java @@ -0,0 +1,33 @@ +package eu.mulk.jgvariant.ostree; + +import eu.mulk.jgvariant.core.Decoder; +import eu.mulk.jgvariant.core.Variant; +import java.nio.charset.StandardCharsets; +import java.util.List; + +/** + * A wrapper for a list of metadata fields. + * + *

Reference: (embedded in other data types) + */ +public record Metadata(List fields) { + + /** A metadata field with a key and a value. */ + public record Field(String key, Variant value) { + + private static final Decoder DECODER = + Decoder.ofStructure( + Field.class, Decoder.ofString(StandardCharsets.UTF_8), Decoder.ofVariant()); + + public static Decoder decoder() { + return DECODER; + } + } + + private static final Decoder DECODER = + Decoder.ofArray(Field.decoder()).map(Metadata::new); + + public static Decoder decoder() { + return DECODER; + } +} diff --git a/jgvariant-ostree/src/main/java/eu/mulk/jgvariant/ostree/SignedDelta.java b/jgvariant-ostree/src/main/java/eu/mulk/jgvariant/ostree/SignedDelta.java new file mode 100644 index 0000000..2fc5c25 --- /dev/null +++ b/jgvariant-ostree/src/main/java/eu/mulk/jgvariant/ostree/SignedDelta.java @@ -0,0 +1,38 @@ +package eu.mulk.jgvariant.ostree; + +import eu.mulk.jgvariant.core.Decoder; +import eu.mulk.jgvariant.core.Variant; +import java.nio.ByteOrder; +import java.nio.charset.StandardCharsets; +import java.util.List; + +/** + * A {@link DeltaSuperblock} signed with some sort of key. + * + *

Reference: {@code ostree-repo-static-delta-private.h#OSTREE_STATIC_DELTA_SIGNED_FORMAT} + */ +public record SignedDelta( + long magicNumber, ByteString superblock, List signatures) { + + /** A cryptographic signature. */ + public record Signature(String key, Variant data) { + private static final Decoder DECODER = + Decoder.ofStructure( + Signature.class, Decoder.ofString(StandardCharsets.US_ASCII), Decoder.ofVariant()); + + public static Decoder decoder() { + return DECODER; + } + } + + private static final Decoder DECODER = + Decoder.ofStructure( + SignedDelta.class, + Decoder.ofLong().withByteOrder(ByteOrder.BIG_ENDIAN), + ByteString.decoder(), + Decoder.ofArray(Signature.decoder())); + + public static Decoder decoder() { + return DECODER; + } +} diff --git a/jgvariant-ostree/src/main/java/eu/mulk/jgvariant/ostree/Summary.java b/jgvariant-ostree/src/main/java/eu/mulk/jgvariant/ostree/Summary.java new file mode 100644 index 0000000..8f4ddf6 --- /dev/null +++ b/jgvariant-ostree/src/main/java/eu/mulk/jgvariant/ostree/Summary.java @@ -0,0 +1,47 @@ +package eu.mulk.jgvariant.ostree; + +import eu.mulk.jgvariant.core.Decoder; +import java.nio.ByteOrder; +import java.nio.charset.StandardCharsets; +import java.util.List; + +/** + * The summary file of an OSTree repository. + * + *

Stored as a file named {@code summary} in the OSTree repository root. + * + *

Reference: {@code ostree-core.h#OSTREE_SUMMARY_GVARIANT_STRING} + */ +public record Summary(List entries, Metadata metadata) { + + public record Entry(String ref, Value value) { + + public record Value(long size, Checksum checksum, Metadata metadata) { + + private static final Decoder DECODER = + Decoder.ofStructure( + Value.class, + Decoder.ofLong().withByteOrder(ByteOrder.LITTLE_ENDIAN), + Checksum.decoder(), + Metadata.decoder()); + + public static Decoder decoder() { + return DECODER; + } + } + + private static final Decoder DECODER = + Decoder.ofStructure(Entry.class, Decoder.ofString(StandardCharsets.UTF_8), Value.decoder()); + + public static Decoder decoder() { + return DECODER; + } + } + + private static final Decoder

DECODER = + Decoder.ofStructure(Summary.class, Decoder.ofArray(Entry.decoder()), Metadata.decoder()); + + public static Decoder decoder() { + return DECODER; + } +} diff --git a/jgvariant-ostree/src/main/java/eu/mulk/jgvariant/ostree/SummarySignature.java b/jgvariant-ostree/src/main/java/eu/mulk/jgvariant/ostree/SummarySignature.java new file mode 100644 index 0000000..a05b96d --- /dev/null +++ b/jgvariant-ostree/src/main/java/eu/mulk/jgvariant/ostree/SummarySignature.java @@ -0,0 +1,35 @@ +package eu.mulk.jgvariant.ostree; + +import eu.mulk.jgvariant.core.Decoder; +import eu.mulk.jgvariant.core.Variant; +import java.nio.charset.StandardCharsets; +import java.util.List; + +/** + * A collection of cryptographic signatures for a {@link Summary}. + * + *

Stored as a file named {@code summary.sig} in the OSTree repository root. + * + *

Reference: {@code ostree-repo-static-delta-private.h#OSTREE_SUMMARY_SIG_GVARIANT_STRING} + */ +public record SummarySignature(List signatures) { + + /** A cryptographic signature. */ + public record Signature(String key, Variant data) { + + private static final Decoder DECODER = + Decoder.ofStructure( + Signature.class, Decoder.ofString(StandardCharsets.UTF_8), Decoder.ofVariant()); + + public static Decoder decoder() { + return DECODER; + } + } + + private static final Decoder DECODER = + Decoder.ofArray(Signature.decoder()).map(SummarySignature::new); + + public static Decoder decoder() { + return DECODER; + } +} diff --git a/jgvariant-ostree/src/main/java/eu/mulk/jgvariant/ostree/Xattr.java b/jgvariant-ostree/src/main/java/eu/mulk/jgvariant/ostree/Xattr.java new file mode 100644 index 0000000..68628c4 --- /dev/null +++ b/jgvariant-ostree/src/main/java/eu/mulk/jgvariant/ostree/Xattr.java @@ -0,0 +1,18 @@ +package eu.mulk.jgvariant.ostree; + +import eu.mulk.jgvariant.core.Decoder; + +/** + * Reference: (embedded in other data types, e.g. {@code + * ostree-core.h#OSTREE_DIRMETA_GVARIANT_STRING}, {@code + * ostree-core.h#OSTREE_FILEMETA_GVARIANT_STRING}) + */ +public record Xattr(ByteString name, ByteString value) { + + private static final Decoder DECODER = + Decoder.ofStructure(Xattr.class, ByteString.decoder(), ByteString.decoder()); + + public static Decoder decoder() { + return DECODER; + } +} diff --git a/jgvariant-ostree/src/main/java/eu/mulk/jgvariant/ostree/package-info.java b/jgvariant-ostree/src/main/java/eu/mulk/jgvariant/ostree/package-info.java new file mode 100644 index 0000000..c6a61f1 --- /dev/null +++ b/jgvariant-ostree/src/main/java/eu/mulk/jgvariant/ostree/package-info.java @@ -0,0 +1,10 @@ +/** + * Provides record classes describing the elements of OSTree repositories and factory methods to create + * {@link eu.mulk.jgvariant.core.Decoder} instances for them. + */ +@API(status = Status.EXPERIMENTAL) +package eu.mulk.jgvariant.ostree; + +import org.apiguardian.api.API; +import org.apiguardian.api.API.Status; diff --git a/jgvariant-ostree/src/main/java/module-info.java b/jgvariant-ostree/src/main/java/module-info.java new file mode 100644 index 0000000..e51c586 --- /dev/null +++ b/jgvariant-ostree/src/main/java/module-info.java @@ -0,0 +1,85 @@ +/** + * Provides a parser for the GVariant + * serialization format. + * + *

+ * + *

Overview

+ * + *

The {@link eu.mulk.jgvariant.ostree} package contains record classes describing the elements + * of OSTree repositories and factory methods to + * create {@link eu.mulk.jgvariant.core.Decoder} instances for them. + * + *

Installation

+ * + * + * + *

Usage with Maven

+ * + *
{@code
+ * 
+ *   ...
+ *
+ *   
+ *     ...
+ *
+ *     
+ *       
+ *         eu.mulk.jgvariant
+ *         jgvariant-bom
+ *         0.1.4
+ *         pom
+ *         import
+ *       
+ *     
+ *
+ *     ...
+ *   
+ *
+ *   
+ *     ...
+ *
+ *     
+ *       eu.mulk.jgvariant
+ *       jgvariant-core
+ *     
+ *     
+ *       eu.mulk.jgvariant
+ *       jgvariant-ostree
+ *     
+ *
+ *     ...
+ *   
+ *
+ *   ...
+ * 
+ * }
+ * + *

Usage with Gradle

+ * + *
{@code
+ * dependencies {
+ *   ...
+ *
+ *   implementation(platform("eu.mulk.jgvariant:jgvariant-bom:0.1.4")
+ *   implementation("eu.mulk.jgvariant:jgvariant-core")
+ *   implementation("eu.mulk.jgvariant:jgvariant-ostree")
+ *
+ *   ...
+ * }
+ * }
+ */ +module eu.mulk.jgvariant.gvariant { + requires transitive eu.mulk.jgvariant.core; + requires com.google.errorprone.annotations; + requires org.jetbrains.annotations; + requires org.apiguardian.api; + + exports eu.mulk.jgvariant.ostree; +} 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 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 Binary files /dev/null and b/jgvariant-ostree/src/test/resources/ostree/delta-indexes/Mc/iDXVydLGaHpQCRyFFC0bLYU_9Bap+4G07jB1RRDVI.index 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 Binary files /dev/null and b/jgvariant-ostree/src/test/resources/ostree/delta-indexes/PT/szKdyjiHHymu2hv1hU12xwf6JpdZqJnQmFyRgV_m8.index 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 Binary files /dev/null and b/jgvariant-ostree/src/test/resources/ostree/delta-indexes/Zv/8Wf_Nc6H2qyBdEepSQomLudfCV8Bdxam6xqdnrM1A.index 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 Binary files /dev/null and b/jgvariant-ostree/src/test/resources/ostree/deltas/Mc/iDXVydLGaHpQCRyFFC0bLYU_9Bap+4G07jB1RRDVI-PTszKdyjiHHymu2hv1hU12xwf6JpdZqJnQmFyRgV_m8/0 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 Binary files /dev/null and b/jgvariant-ostree/src/test/resources/ostree/deltas/Mc/iDXVydLGaHpQCRyFFC0bLYU_9Bap+4G07jB1RRDVI-PTszKdyjiHHymu2hv1hU12xwf6JpdZqJnQmFyRgV_m8/superblock 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 Binary files /dev/null and b/jgvariant-ostree/src/test/resources/ostree/deltas/Mc/iDXVydLGaHpQCRyFFC0bLYU_9Bap+4G07jB1RRDVI/0 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 Binary files /dev/null and b/jgvariant-ostree/src/test/resources/ostree/deltas/Mc/iDXVydLGaHpQCRyFFC0bLYU_9Bap+4G07jB1RRDVI/superblock 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 Binary files /dev/null and b/jgvariant-ostree/src/test/resources/ostree/deltas/PT/szKdyjiHHymu2hv1hU12xwf6JpdZqJnQmFyRgV_m8-Zv8Wf_Nc6H2qyBdEepSQomLudfCV8Bdxam6xqdnrM1A/0 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 Binary files /dev/null and b/jgvariant-ostree/src/test/resources/ostree/deltas/PT/szKdyjiHHymu2hv1hU12xwf6JpdZqJnQmFyRgV_m8-Zv8Wf_Nc6H2qyBdEepSQomLudfCV8Bdxam6xqdnrM1A/superblock 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 Binary files /dev/null and b/jgvariant-ostree/src/test/resources/ostree/objects/14/c9b958ac59df4979095a3485b4da5a045fe8737ffdba8cfbfff24988b238f7.dirtree 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 Binary files /dev/null and b/jgvariant-ostree/src/test/resources/ostree/objects/31/c8835d5c9d2c6687a50091c85142d1b2d853ff416a9fb81b4ee30754510d52.commit 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 Binary files /dev/null and b/jgvariant-ostree/src/test/resources/ostree/objects/3d/3b3329dca38871f29aeda1bf5854d76c707fa269759a899d0985c91815fe6f.commit 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 Binary files /dev/null and b/jgvariant-ostree/src/test/resources/ostree/objects/46/22b8c6cdcb4cbe29b8f79641f0304b30066596194b6b32981e46422d12c282.dirtree 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 Binary files /dev/null and b/jgvariant-ostree/src/test/resources/ostree/objects/48/cc6a2ecdab284b9d1e5b0e875c905866ff32f65ee1e857df0e691285d6f14c.dirmeta 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 Binary files /dev/null and b/jgvariant-ostree/src/test/resources/ostree/objects/66/ff167ff35ce87daac817447a9490a262ee75f095f017716a6eb1a9d9eb3350.commit 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 Binary files /dev/null and b/jgvariant-ostree/src/test/resources/ostree/objects/73/4ed4332dd46f0ec95395ea6b404f9a19eacfc74de9100e19842cbe9b960d0a.dirtree 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 Binary files /dev/null and b/jgvariant-ostree/src/test/resources/ostree/objects/76/766e52e4a737646788570c8c44a3cf70b17ece81ce4c9b44f4f5869f138e8d.dirtree 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 Binary files /dev/null and b/jgvariant-ostree/src/test/resources/ostree/objects/84/2d6670d6c0d116a9723bd4329cacec722079177e886bd833f182500b879bfe.dirtree 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 Binary files /dev/null and b/jgvariant-ostree/src/test/resources/ostree/objects/88/534f940aa700c0f5d470c86f699179bf11fe486f3a8514f56a9703355d761b.dirtree 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 Binary files /dev/null and b/jgvariant-ostree/src/test/resources/ostree/objects/cf/ff1525790c356cf268894ce6cabda5c5aa6fabc8b2becb39faf2d195f8ebaa.dirtree 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 Binary files /dev/null and b/jgvariant-ostree/src/test/resources/ostree/summary differ -- cgit v1.2.3