// Copyright (C) 2011, Google Inc.
// and other copyright owners as documented in the project's IP log.
//
// This program and the accompanying materials are made available
// under the terms of the Eclipse Distribution License v1.0 which
// accompanies this distribution, is reproduced below, and is
// available at http://www.eclipse.org/org/documents/edl-v10.php
//
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or
// without modification, are permitted provided that the following
// conditions are met:
//
// - Redistributions of source code must retain the above copyright
//   notice, this list of conditions and the following disclaimer.
//
// - Redistributions in binary form must reproduce the above
//   copyright notice, this list of conditions and the following
//   disclaimer in the documentation and/or other materials provided
//   with the distribution.
//
// - Neither the name of the Eclipse Foundation, Inc. nor the
//   names of its contributors may be used to endorse or promote
//   products derived from this software without specific prior
//   written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
// CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
// NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
// ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
//
// WARNING:  If you edit this file, run generate.sh
//
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

syntax = "proto2";

package org.eclipse.jgit.storage.dht;
option java_generate_equals_and_hash = true;
option java_package = "org.eclipse.jgit.generated.storage.dht.proto";


    // Entry in RefTable describing the target of the reference.
    // Either symref *OR* target must be populated, but never both.
    //
message RefData {
    // Incrementing counter updated each time the RefData changes.
    // Should always start at 1.
    //
  required uint32 sequence = 5 [default = 0];

    // An ObjectId with an optional hint about where it can be found.
    //
  message Id {
    required string object_name = 1;
    optional string chunk_key = 2;
  }

    // Name of another reference this reference inherits its target
    // from.  The target is inherited on-the-fly at runtime by reading
    // the other reference.  Typically only "HEAD" uses symref.
    //
  optional string symref = 1;

    // ObjectId this reference currently points at.
    //
  optional Id target = 2;

    // True if the correct value for peeled is stored.
    //
  optional bool is_peeled = 3;

    // If is_peeled is true, this field is accurate.  This field
    // exists only if target points to annotated tag object, then
    // this field stores the "object" field for that tag.
    //
  optional Id peeled = 4;
}


    // Entry in ObjectIndexTable, describes how an object appears in a chunk.
    //
message ObjectInfo {
    // Type of Git object.
    //
  enum ObjectType {
    COMMIT = 1;
    TREE = 2;
    BLOB = 3;
    TAG = 4;
  }
  optional ObjectType object_type = 1;

    // Position of the object's header within its chunk.
    //
  required int32 offset = 2;

    // Total number of compressed data bytes, not including the pack
    // header. For fragmented objects this is the sum of all chunks.
    //
  required int64 packed_size = 3;

    // Total number of bytes of the uncompressed object. For a
    // delta this is the size after applying the delta onto its base.
    //
  required int64 inflated_size = 4;

    // ObjectId of the delta base, if this object is stored as a delta.
    // The base is stored in raw binary.
    //
  optional bytes delta_base = 5;

    // True if the object requires more than one chunk to be stored.
    //
  optional bool is_fragmented = 6;
}


    // Describes at a high-level the information about a chunk.
    // A repository can use this summary to determine how much
    // data is stored, or when garbage collection should occur.
    //
message ChunkInfo {
    // Source of the chunk (what code path created it).
    //
  enum Source {
    RECEIVE = 1;    // Came in over the network from external source.
    INSERT = 2;     // Created in this repository (e.g. a merge).
    REPACK = 3;     // Generated during a repack of this repository.
  }
  optional Source source = 1;

    // Type of Git object stored in this chunk.
    //
  enum ObjectType {
    MIXED = 0;
    COMMIT = 1;
    TREE = 2;
    BLOB = 3;
    TAG = 4;
  }
  optional ObjectType object_type = 2;

    // True if this chunk is a member of a fragmented object.
    //
  optional bool is_fragment = 3;

    // If present, key of the CachedPackInfo object
    // that this chunk is a member of.
    //
  optional string cached_pack_key = 4;

    // Summary description of the objects stored here.
    //
  message ObjectCounts {
      // Number of objects stored in this chunk.
      //
    optional int32 total = 1;

      // Number of objects stored in whole (non-delta) form.
      //
    optional int32 whole = 2;

      // Number of objects stored in OFS_DELTA format.
      // The delta base appears in the same chunk, or
      // may appear in an earlier chunk through the
      // ChunkMeta.base_chunk link.
      //
    optional int32 ofs_delta = 3;

      // Number of objects stored in REF_DELTA format.
      // The delta base is at an unknown location.
      //
    optional int32 ref_delta = 4;
  }
  optional ObjectCounts object_counts = 5;

    // Size in bytes of the chunk's compressed data column.
    //
  optional int32 chunk_size = 6;

    // Size in bytes of the chunk's index.
    //
  optional int32 index_size = 7;

    // Size in bytes of the meta information.
    //
  optional int32 meta_size  = 8;
}


    // Describes meta information about a chunk, stored inline with it.
    //
message ChunkMeta {
    // Enumerates the other chunks this chunk depends upon by OFS_DELTA.
    // Entries are sorted by relative_start ascending, enabling search.  Thus
    // the earliest chunk is at the end of the list.
    //
  message BaseChunk {
      // Bytes between start of the base chunk and start of this chunk.
      // Although the value is positive, its a negative offset.
      //
    required int64 relative_start = 1;
    required string chunk_key = 2;
  }
  repeated BaseChunk base_chunk = 1;

    // If this chunk is part of a fragment, key of every chunk that
    // makes up the fragment, including this chunk.
    //
  repeated string fragment = 2;

    // Chunks that should be prefetched if reading the current chunk.
    //
  message PrefetchHint {
    repeated string edge = 1;
    repeated string sequential = 2;
  }
  optional PrefetchHint commit_prefetch = 51;
  optional PrefetchHint tree_prefetch = 52;
}


    // Describes a CachedPack, for efficient bulk clones.
    //
message CachedPackInfo {
    // Unique name of the cached pack.  This is the SHA-1 hash of
    // all of the objects that make up the cached pack, sorted and
    // in binary form.  (Same rules as Git on the filesystem.)
    //
  required string name = 1;

    // SHA-1 of all chunk keys, which are themselves SHA-1s of the
    // raw chunk data. If any bit differs in compression (due to
    // repacking) the version will differ.
    //
  required string version = 2;

    // Total number of objects in the cached pack. This must be known
    // in order to set the final resulting pack header correctly before it
    // is sent to clients.
    //
  required int64 objects_total = 3;

    // Number of objects stored as deltas, rather than deflated whole.
    //
  optional int64 objects_delta = 4;

    // Total size of the chunks, in bytes, not including the chunk footer.
    //
  optional int64 bytes_total = 5;

    // Objects this pack starts from.
    //
  message TipObjectList {
    repeated string object_name = 1;
  }
  required TipObjectList tip_list = 6;

    // Chunks, in order of occurrence in the stream.
    //
  message ChunkList {
    repeated string chunk_key = 1;
  }
  required ChunkList chunk_list = 7;
}
