diff options
| author | Matthias Andreas Benkard <code@mail.matthias.benkard.de> | 2022-01-23 18:10:03 +0100 | 
|---|---|---|
| committer | Matthias Andreas Benkard <code@mail.matthias.benkard.de> | 2022-01-23 18:10:03 +0100 | 
| commit | c7aa2b6a54064157dc167002c850cd403c3b1656 (patch) | |
| tree | ab255bf08d9666102d5ac58a6614d6abda711f8f /jgvariant-ostree/src/main/java | |
| parent | e14bd1b88c708276d267d0e05c68a7714f7d5afc (diff) | |
Document repository layout, add modified Base64 ByteString encoding.
Change-Id: I564db0e346346b608fa11527590e264c694fedaf
Diffstat (limited to 'jgvariant-ostree/src/main/java')
4 files changed, 278 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 index cf6e99a..bb8cbb6 100644 --- a/jgvariant-ostree/src/main/java/eu/mulk/jgvariant/ostree/ByteString.java +++ b/jgvariant-ostree/src/main/java/eu/mulk/jgvariant/ostree/ByteString.java @@ -2,6 +2,7 @@ package eu.mulk.jgvariant.ostree;  import eu.mulk.jgvariant.core.Decoder;  import java.util.Arrays; +import java.util.Base64;  import java.util.HexFormat;  import java.util.stream.IntStream;  import java.util.stream.Stream; @@ -62,6 +63,34 @@ public record ByteString(byte[] bytes) {    }    /** +   * Converts the contained byte array into modified Base64 (with {@code "/"} replaced with {@code +   * "-"}). +   * +   * <p>Modified Base64 is Base64 with {@code "/"} replaced with {@code "_"}. It is used to address +   * static deltas in an OSTree repository. +   * +   * <p>Useful for printing. +   * +   * @return a modified Base64 representation of the bytes making up this checksum. +   */ +  public String modifiedBase64() { +    return Base64.getEncoder().withoutPadding().encodeToString(bytes).replace('/', '_'); +  } + +  /** +   * Parses a modified Base64 string into a {@link Checksum}. +   * +   * <p>Modified Base64 is Base64 with {@code "/"} replaced with {@code "_"}. It is used to address +   * static deltas in an OSTree repository. +   * +   * @param mbase64 a hex string. +   * @return a {@link Checksum} corresponding to the given modified Base64 string. +   */ +  public static ByteString ofModifiedBase64(String mbase64) { +    return new ByteString(Base64.getDecoder().decode(mbase64.replace('_', '/'))); +  } + +  /**     * Returns the number of bytes in the byte string.     *     * @return the number of bytes in the byte string. 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 index ce5f9b0..94a728c 100644 --- a/jgvariant-ostree/src/main/java/eu/mulk/jgvariant/ostree/Checksum.java +++ b/jgvariant-ostree/src/main/java/eu/mulk/jgvariant/ostree/Checksum.java @@ -76,6 +76,34 @@ public record Checksum(ByteString byteString) {    }    /** +   * Converts the contained byte array into modified Base64 (with {@code "/"} replaced with {@code +   * "-"}). +   * +   * <p>Modified Base64 is Base64 with {@code "/"} replaced with {@code "_"}. It is used to address +   * static deltas in an OSTree repository. +   * +   * <p>Useful for printing. +   * +   * @return a modified Base64 representation of the bytes making up this checksum. +   */ +  public String modifiedBase64() { +    return byteString.modifiedBase64(); +  } + +  /** +   * Parses a modified Base64 string into a {@link Checksum}. +   * +   * <p>Modified Base64 is Base64 with {@code "/"} replaced with {@code "_"}. It is used to address +   * static deltas in an OSTree repository. +   * +   * @param mbase64 a hex string. +   * @return a {@link Checksum} corresponding to the given modified Base64 string. +   */ +  public static Checksum ofModifiedBase64(String mbase64) { +    return new Checksum(ByteString.ofModifiedBase64(mbase64)); +  } + +  /**     * Reads a Checksum for a {@link ByteBuffer}.     *     * @param byteBuffer the byte buffer to read from. diff --git a/jgvariant-ostree/src/main/java/eu/mulk/jgvariant/ostree/ObjectType.java b/jgvariant-ostree/src/main/java/eu/mulk/jgvariant/ostree/ObjectType.java index 28371fc..721d857 100644 --- a/jgvariant-ostree/src/main/java/eu/mulk/jgvariant/ostree/ObjectType.java +++ b/jgvariant-ostree/src/main/java/eu/mulk/jgvariant/ostree/ObjectType.java @@ -24,12 +24,56 @@ import org.apiguardian.api.API;   */  @API(status = STABLE)  public enum ObjectType { + +  /** +   * A regular file. +   * +   * <p>File ending: {@code .file} +   */    FILE((byte) 1, "file"), + +  /** +   * A serialized {@link DirTree} object. +   * +   * <p>File ending: {@code .dirtree} +   */    DIR_TREE((byte) 2, "dirtree"), + +  /** +   * A serialized {@link DirMeta} object. +   * +   * <p>File ending: {@code .dirmeta} +   */    DIR_META((byte) 3, "dirmeta"), + +  /** +   * A serialized {@link Commit} object. +   * +   * <p>File ending: {@code .commit} +   */    COMMIT((byte) 4, "commit"), + +  /** +   * A tombstone file standing in for a commit that was deleted. +   * +   * <p>File ending: {@code .commit-tombstone} +   */    TOMBSTONE_COMMIT((byte) 5, "commit-tombstone"), + +  /** +   * Detached metadata for a {@link Commit}. +   * +   * <p>Often goes together with a {@link #TOMBSTONE_COMMIT}. +   * +   * <p>File ending: {@code .commitmeta} +   */    COMMIT_META((byte) 6, "commitmeta"), + +  /** +   * A symlink to a {@link #FILE} that lives somewhere else. +   * +   * <p>File ending: {@code .payload-link} +   */    PAYLOAD_LINK((byte) 7, "payload-link");    private final byte byteValue; 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 index c6a61f1..028f4cd 100644 --- 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 @@ -2,6 +2,183 @@   * 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. + * + * <h2>OStree repository structure</h2> + * + * <p>An OSTree repository has the following layout: + * + * <table> + *   <caption>OSTree repository layout</caption> + * + *   <tr> + *     <td>{@code config}</td> + *     <td> + *       <p> + *         A plain text file that contains various settings.  Among other things, this defines + *         the <a href="https://ostreedev.github.io/ostree/formats/#the-archive-format">archive + *         format</a> of the repository and whether files are compressed ({@code mode=archive-z2}) + *         or plain ({@code mode=bare}, {@code mode=bare-user}). + *       </p> + *     </td> + *   </tr> + * + *   <tr> + *     <td>{@code summary}</td> + *     <td> + *       <p> + *         A {@link eu.mulk.jgvariant.ostree.Summary} object containing information on what is + *         available under {@code refs/}, {@code deltas/}, and {@code delta-indexes/}. + *       </p> + * + *       <p>This file may or may not exist and, if it exists, may or may not be up to date.</p> + *     </td> + *   </tr> + * + *   <tr> + *     <td>{@code refs/heads/{name...}}</td> + *     <td>Plain-text files containing {@link eu.mulk.jgvariant.ostree.Checksum}s in hex format + *     (see {@link eu.mulk.jgvariant.ostree.Checksum#ofHex}) referring to + *     {@link eu.mulk.jgvariant.ostree.Commit} objects.  See below for the layout of the + *     {@code objects/} directory that this refers to.</td> + *   </tr> + * + *   <tr> + *     <td>{@code objects/{checksumHead}/{checksumRest}.{fileExtension}}</td> + *     <td> + *       <p> + *         Objects of various types as described by {@link eu.mulk.jgvariant.ostree.ObjectType} + *         and keyed by {@link eu.mulk.jgvariant.ostree.Checksum}. + *       </p> + * + *       <p> + *         Among other things, this is where you find {@link eu.mulk.jgvariant.ostree.Commit} + *         ({@code .commit)}, {@link eu.mulk.jgvariant.ostree.DirTree} ({@code .dirtree}), + *         and {@link eu.mulk.jgvariant.ostree.DirMeta} ({@code .dirmeta}) objects as well as + *         plain ({@code .file}) or compressed files ({@code .filez}). + *       </p> + * + *       <p> + *         Static delta information is not stored here, but in the {@code deltas/} and + *         {@code delta-indexes/} directories (if available). + *       </p> + * + *       <p> + *         The individual parts of the file path are defined as follows: + *       </p> + * + *       <dl> + *         <dt>{@code {checksumHead}} + *         <dd> + *           the first two characters of {@link eu.mulk.jgvariant.ostree.Checksum#hex()} + *         <dt>{@code {checksumRest}} + *         <dd> + *           the substring of {@link eu.mulk.jgvariant.ostree.Checksum#hex()} starting from the + *           3rd character + *         <dt>{@code {fileExtension}} + *         <dd> + *           the {@link eu.mulk.jgvariant.ostree.ObjectType#fileExtension()} of the object type + *       </dl> + *     </td> + *   </tr> + * + *   <tr id="delta-superblock"> + *     <td>{@code deltas/{targetChecksumMbase64Head}/{targetChecksumMbase64Rest}/superblock}</td> + *     <td> + *       <p> + *         A {@link eu.mulk.jgvariant.ostree.DeltaSuperblock} to get from nothing (an empty commit) + *         to the commit named by the checksum encoded in the path. + *       </p> + * + *       <p> + *         The individual parts of the file path are defined as follows: + *       </p> + * + *       <dl> + *         <dt>{@code {checksumHead}} + *         <dd> + *           the first two characters of {@link eu.mulk.jgvariant.ostree.Checksum#modifiedBase64()} + *         <dt>{@code {checksumRest}} + *         <dd> + *           the substring of {@link eu.mulk.jgvariant.ostree.Checksum#modifiedBase64()} starting + *           from the 3rd character + *       </dl> + *     </td> + *   </tr> + * + *   <tr> + *     <td>{@code deltas/{targetChecksumMbase64Head}/{targetChecksumMbase64Rest}/{digit...}}</td> + *     <td> + *       <p> + *         A {@link eu.mulk.jgvariant.ostree.DeltaPartPayload} belonging to a delta that goes from + *         nothing (an empty commit) to the commit named by the checksum encoded in the path. + *       </p> + * + *       <p> + *         The individual parts of the file path are defined as follows: + *       </p> + * + *       <dl> + *         <dt>{@code {checksumHead}} + *         <dd> + *           the first two characters of {@link eu.mulk.jgvariant.ostree.Checksum#modifiedBase64()} + *         <dt>{@code {checksumRest}} + *         <dd> + *           the substring of {@link eu.mulk.jgvariant.ostree.Checksum#modifiedBase64()} starting + *           from the 3rd character + *       </dl> + *     </td> + *   </tr> + * + *   <tr> + *     <td>{@code deltas/{sourceChecksumMbase64Head}/{sourceChecksumMbase64Rest}-{targetChecksumMbase64}/superblock}</td> + *     <td> + *       <p> + *         A {@link eu.mulk.jgvariant.ostree.DeltaSuperblock} to get from the source commit + *         referenced by the first checksum encoded in the path to the target commit referenced + *         in the second checksum encoded in the path. + *       </p> + * + *       <p> + *         The individual parts of the file path are defined as follows: + *       </p> + * + *       <dl> + *         <dt>{@code {checksumHead}} + *         <dd> + *           the first two characters of {@link eu.mulk.jgvariant.ostree.Checksum#modifiedBase64()} + *         <dt>{@code {checksumRest}} + *         <dd> + *           the substring of {@link eu.mulk.jgvariant.ostree.Checksum#modifiedBase64()} starting + *           from the 3rd character + *       </dl> + *     </td> + *   </tr> + * + *   <tr> + *     <td>{@code deltas/{sourceChecksumMbase64Head}/{sourceChecksumMbase64Rest}-{targetChecksumMbase64}/{digit...}}</td> + *     <td> + *       <p> + *         A {@link eu.mulk.jgvariant.ostree.DeltaPartPayload} belonging to a delta that goes from + *         the source commit referenced by the first checksum encoded in the path to the target + *         commit referenced in the second checksum encoded in the path. + *       </p> + * + *       <p> + *         The individual parts of the file path are defined as follows: + *       </p> + * + *       <dl> + *         <dt>{@code {checksumHead}} + *         <dd> + *           the first two characters of {@link eu.mulk.jgvariant.ostree.Checksum#modifiedBase64()} + *         <dt>{@code {checksumRest}} + *         <dd> + *           the substring of {@link eu.mulk.jgvariant.ostree.Checksum#modifiedBase64()} starting + *           from the 3rd character + *       </dl> + *     </td> + *   </tr> + * </table>   */  @API(status = Status.EXPERIMENTAL)  package eu.mulk.jgvariant.ostree; | 
