diff options
Diffstat (limited to 'jgvariant-ostree/src/main')
17 files changed, 628 insertions, 0 deletions
| 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<ByteString> DECODER = Decoder.ofByteArray().map(ByteString::new); + +  public static Decoder<ByteString> 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<Checksum> DECODER = ByteString.decoder().map(Checksum::new); + +  public static Decoder<Checksum> 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. + * + * <p>Has an optional parent, a root directory, and various metadata. + * + * <p>Reference: {@code ostree-core.h#OSTREE_COMMIT_GVARIANT_STRING} + */ +public record Commit( +    Metadata metadata, +    Checksum parentChecksum, +    List<RelatedObject> relatedObjects, +    String subject, +    String body, +    long timestamp, +    Checksum rootDirTreeChecksum, +    Checksum rootDirMetaChecksum) { + +  public record RelatedObject(String ref, Checksum commitChecksum) { + +    private static final Decoder<RelatedObject> DECODER = +        Decoder.ofStructure( +            RelatedObject.class, Decoder.ofString(StandardCharsets.UTF_8), Checksum.decoder()); + +    public static Decoder<RelatedObject> decoder() { +      return DECODER; +    } +  } + +  private static final Decoder<Commit> 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<Commit> 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}. + * + * <p>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<DeltaFallback> 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<DeltaFallback> 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}. + * + * <p>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<DeltaObject> objects) { + +  record DeltaObject(byte objectType, Checksum checksum) { + +    private static final Decoder<DeltaObject> DECODER = +        Decoder.ofStructure(DeltaObject.class, Decoder.ofByte(), Checksum.decoder()); + +    public static Decoder<DeltaObject> decoder() { +      return DECODER; +    } +  } + +  private static final Decoder<DeltaMetaEntry> 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<DeltaMetaEntry> 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<FileMode> fileModes, +    List<List<Xattr>> xattrs, +    ByteString rawDataSource, +    ByteString operations) { + +  private static final Decoder<DeltaPartPayload> 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<FileMode> 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<FileMode> decoder() { +      return DECODER; +    } +  } + +  public static Decoder<DeltaPartPayload> 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<DeltaName> dependencies, +    List<DeltaMetaEntry> entries, +    List<DeltaFallback> fallbacks) { + +  public record DeltaName(Checksum fromChecksum, Checksum toChecksum) { + +    private static final Decoder<DeltaName> DECODER = +        Decoder.ofStructure(DeltaName.class, Checksum.decoder(), Checksum.decoder()); + +    public static Decoder<DeltaName> decoder() { +      return DECODER; +    } +  } + +  private static final Decoder<DeltaSuperblock> 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<DeltaSuperblock> 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. + * + * <p>Reference: {@code ostree-core.h#OSTREE_DIRMETA_GVARIANT_STRING} + */ +public record DirMeta(int uid, int gid, int mode, List<Xattr> xattrs) { + +  private static final Decoder<DirMeta> 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<DirMeta> 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. + * + * <p>Referenced by {@link Commit#rootDirTreeChecksum()} and recursively by {@link + * Directory#treeChecksum()}. + * + * <p>Reference: {@code ostree-core.h#OSTREE_TREE_GVARIANT_STRING} + */ +public record DirTree(List<File> files, List<Directory> directories) { + +  public record File(String name, Checksum checksum) { + +    private static final Decoder<File> DECODER = +        Decoder.ofStructure( +            File.class, Decoder.ofString(StandardCharsets.UTF_8), Checksum.decoder()); + +    public static Decoder<File> decoder() { +      return DECODER; +    } +  } + +  public record Directory(String name, Checksum treeChecksum, Checksum dirChecksum) { + +    private static final Decoder<Directory> DECODER = +        Decoder.ofStructure( +            Directory.class, +            Decoder.ofString(StandardCharsets.UTF_8), +            Checksum.decoder(), +            Checksum.decoder()); + +    public static Decoder<Directory> decoder() { +      return DECODER; +    } +  } + +  private static final Decoder<DirTree> DECODER = +      Decoder.ofStructure( +          DirTree.class, Decoder.ofArray(File.decoder()), Decoder.ofArray(Directory.decoder())); + +  public static Decoder<DirTree> 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. + * + * <p>Reference: {@code ostree-core.h#OSTREE_FILEMETA_GVARIANT_STRING} + */ +public record FileMeta(int uid, int gid, int mode, List<Xattr> xattrs) { + +  private static final Decoder<FileMeta> 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<FileMeta> 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. + * + * <p>Reference: (embedded in other data types) + */ +public record Metadata(List<Field> fields) { + +  /** A metadata field with a key and a value. */ +  public record Field(String key, Variant value) { + +    private static final Decoder<Field> DECODER = +        Decoder.ofStructure( +            Field.class, Decoder.ofString(StandardCharsets.UTF_8), Decoder.ofVariant()); + +    public static Decoder<Field> decoder() { +      return DECODER; +    } +  } + +  private static final Decoder<Metadata> DECODER = +      Decoder.ofArray(Field.decoder()).map(Metadata::new); + +  public static Decoder<Metadata> 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. + * + * <p>Reference: {@code ostree-repo-static-delta-private.h#OSTREE_STATIC_DELTA_SIGNED_FORMAT} + */ +public record SignedDelta( +    long magicNumber, ByteString superblock, List<SignedDelta.Signature> signatures) { + +  /** A cryptographic signature. */ +  public record Signature(String key, Variant data) { +    private static final Decoder<Signature> DECODER = +        Decoder.ofStructure( +            Signature.class, Decoder.ofString(StandardCharsets.US_ASCII), Decoder.ofVariant()); + +    public static Decoder<Signature> decoder() { +      return DECODER; +    } +  } + +  private static final Decoder<SignedDelta> DECODER = +      Decoder.ofStructure( +          SignedDelta.class, +          Decoder.ofLong().withByteOrder(ByteOrder.BIG_ENDIAN), +          ByteString.decoder(), +          Decoder.ofArray(Signature.decoder())); + +  public static Decoder<SignedDelta> 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. + * + * <p>Stored as a file named {@code summary} in the OSTree repository root. + * + * <p>Reference: {@code ostree-core.h#OSTREE_SUMMARY_GVARIANT_STRING} + */ +public record Summary(List<Entry> entries, Metadata metadata) { + +  public record Entry(String ref, Value value) { + +    public record Value(long size, Checksum checksum, Metadata metadata) { + +      private static final Decoder<Value> DECODER = +          Decoder.ofStructure( +              Value.class, +              Decoder.ofLong().withByteOrder(ByteOrder.LITTLE_ENDIAN), +              Checksum.decoder(), +              Metadata.decoder()); + +      public static Decoder<Value> decoder() { +        return DECODER; +      } +    } + +    private static final Decoder<Entry> DECODER = +        Decoder.ofStructure(Entry.class, Decoder.ofString(StandardCharsets.UTF_8), Value.decoder()); + +    public static Decoder<Entry> decoder() { +      return DECODER; +    } +  } + +  private static final Decoder<Summary> DECODER = +      Decoder.ofStructure(Summary.class, Decoder.ofArray(Entry.decoder()), Metadata.decoder()); + +  public static Decoder<Summary> 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}. + * + * <p>Stored as a file named {@code summary.sig} in the OSTree repository root. + * + * <p>Reference: {@code ostree-repo-static-delta-private.h#OSTREE_SUMMARY_SIG_GVARIANT_STRING} + */ +public record SummarySignature(List<Signature> signatures) { + +  /** A cryptographic signature. */ +  public record Signature(String key, Variant data) { + +    private static final Decoder<Signature> DECODER = +        Decoder.ofStructure( +            Signature.class, Decoder.ofString(StandardCharsets.UTF_8), Decoder.ofVariant()); + +    public static Decoder<Signature> decoder() { +      return DECODER; +    } +  } + +  private static final Decoder<SummarySignature> DECODER = +      Decoder.ofArray(Signature.decoder()).map(SummarySignature::new); + +  public static Decoder<SummarySignature> 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<Xattr> DECODER = +      Decoder.ofStructure(Xattr.class, ByteString.decoder(), ByteString.decoder()); + +  public static Decoder<Xattr> 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 <a + * href="https://ostreedev.github.io/ostree/">OSTree</a> 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 <a href="https://docs.gtk.org/glib/struct.Variant.html">GVariant</a> + * serialization format. + * + * <ul> + *   <li><a href="#sect-overview">Overview</a> + *   <li><a href="#sect-installation">Installation</a> + * </ul> + * + * <h2 id="sect-overview">Overview</h2> + * + * <p>The {@link eu.mulk.jgvariant.ostree} package contains record classes describing the elements + * of <a href="https://ostreedev.github.io/ostree/">OSTree</a> repositories and factory methods to + * create {@link eu.mulk.jgvariant.core.Decoder} instances for them. + * + * <h2 id="sect-installation">Installation</h2> + * + * <ul> + *   <li><a href="#sect-installation-maven">Usage with Maven</a> + *   <li><a href="#sect-installation-gradle">Usage with Gradle</a> + * </ul> + * + * <h3 id="sect-installation-maven">Usage with Maven</h3> + * + * <pre>{@code + * <project> + *   ... + * + *   <dependencyManagement> + *     ... + * + *     <dependencies> + *       <dependency> + *         <groupId>eu.mulk.jgvariant</groupId> + *         <artifactId>jgvariant-bom</artifactId> + *         <version>0.1.4</version> + *         <type>pom</type> + *         <scope>import</scope> + *       </dependency> + *     </dependencies> + * + *     ... + *   </dependencyManagement> + * + *   <dependencies> + *     ... + * + *     <dependency> + *       <groupId>eu.mulk.jgvariant</groupId> + *       <artifactId>jgvariant-core</artifactId> + *     </dependency> + *     <dependency> + *       <groupId>eu.mulk.jgvariant</groupId> + *       <artifactId>jgvariant-ostree</artifactId> + *     </dependency> + * + *     ... + *   </dependencies> + * + *   ... + * </project> + * }</pre> + * + * <h3 id="sect-installation-gradle">Usage with Gradle</h3> + * + * <pre>{@code + * dependencies { + *   ... + * + *   implementation(platform("eu.mulk.jgvariant:jgvariant-bom:0.1.4") + *   implementation("eu.mulk.jgvariant:jgvariant-core") + *   implementation("eu.mulk.jgvariant:jgvariant-ostree") + * + *   ... + * } + * }</pre> + */ +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; +} | 
