// Copyright (C) 2018 The Android Open Source Project
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

syntax = "proto2";

package devtools.gerritcodereview;

option java_package = "com.google.gerrit.proto.reviewdb";

// Serialized form of com.google.gerrit.reviewdb.client.Change.Id.
// Next ID: 2
message Change_Id {
  required int32 id = 1;
}

// Serialized form of com.google.gerrit.reviewdb.client.ChangeMessage.
// Next ID: 3
message ChangeMessage_Key {
  required Change_Id change_id = 1;
  required string uuid = 2;
}

// Serialized form of com.google.gerrit.reviewdb.client.PatchSet.Id.
// Next ID: 3
message PatchSet_Id {
  required Change_Id change_id = 1;
  required int32 patch_set_id = 2;
}

// Serialized form of com.google.gerrit.reviewdb.client.Patch.Key.
// Next ID: 3
message Patch_Key {
  required PatchSet_Id patch_set_id = 1;
  required string file_name = 2;
}

// Serialized form of com.google.gerrit.reviewdb.client.PatchLineComment.Key.
// Next ID: 3
message PatchLineComment_Key {
  required Patch_Key patch_key = 1;
  required string uuid = 2;
}

// Serialized form of com.google.gerrit.reviewdb.client.Account.Id.
// Next ID: 2
message Account_Id {
  required int32 id = 1;
}

// Serialized form of com.google.gerrit.reviewdb.client.LabelId.
// Next ID: 2
message LabelId {
  required string id = 1;
}

// Serialized form of com.google.gerrit.reviewdb.client.PatchSetApproval.Key.
// Next ID: 4
message PatchSetApproval_Key {
  required PatchSet_Id patch_set_id = 1;
  required Account_Id account_id = 2;
  required LabelId category_id = 3;
}

// Serialized form of com.google.gerrit.reviewdb.client.CurrentSchemaVersion.Key.
// Next ID: 2
message CurrentSchemaVersion_Key {
  required string one = 1;
}

// Serialized form of com.google.gerrit.reviewdb.client.ChangeMessage.
// Next ID: 8
message ChangeMessage {
  required ChangeMessage_Key key = 1;
  optional Account_Id author_id = 2;
  optional fixed64 written_on = 3;
  optional string message = 4;
  optional PatchSet_Id patchset = 5;
  optional string tag = 6;
  optional Account_Id real_author = 7;
}

// Serialized form of com.google.gerrit.reviewdb.client.Change.Key.
// Next ID: 2
message Change_Key {
  optional string id = 1;
}

// Serialized form of com.google.gerrit.reviewdb.client.Project.NameKey.
// Next ID: 2
message Project_NameKey {
  optional string name = 1;
}

// Serialized form of com.google.gerrit.reviewdb.client.Branch.NameKey.
// Next ID: 3
message Branch_NameKey {
  optional Project_NameKey project_name = 1;
  optional string branch_name = 2;
}

// Serialized form of com.google.gerrit.reviewdb.client.Change.
// Next ID: 24
message Change {
  required Change_Id change_id = 1;
  optional Change_Key change_key = 2;
  optional int32 row_version = 3;
  optional fixed64 created_on = 4;
  optional fixed64 last_updated_on = 5;
  optional Account_Id owner_account_id = 7;
  optional Branch_NameKey dest = 8;
  optional uint32 status = 10;
  optional int32 current_patch_set_id = 12;
  optional string subject = 13;
  optional string topic = 14;
  optional string original_subject = 17;
  optional string submission_id = 18;
  optional Account_Id assignee = 19;
  optional bool is_private = 20;
  optional bool work_in_progress = 21;
  optional bool review_started = 22;
  optional Change_Id revert_of = 23;
  optional string note_db_state = 101;

  // Deleted fields, should not be reused:
  reserved 6;  // sortkey
  reserved 9;  // open
  reserved 11; // nbrPatchSets
  reserved 15; // lastSha1MergeTested
  reserved 16; // mergeable
}

// Serialized form of com.google.gerrit.reviewdb.client.CommentRange.
// Next ID: 5
message CommentRange {
  optional int32 start_line = 1;
  optional int32 start_character = 2;
  optional int32 end_line = 3;
  optional int32 end_character = 4;
}

// Serialized form of com.google.gerrit.reviewdb.client.PatchLineComment.
// Next ID: 13
message PatchLineComment {
  required PatchLineComment_Key key = 1;
  optional int32 line_nbr = 2;
  optional Account_Id author_id = 3;
  optional fixed64 written_on = 4;
  optional uint32 status = 5;
  optional int32 side = 6;
  optional string message = 7;
  optional string parent_uuid = 8;
  optional CommentRange range = 9;
  optional string tag = 10;
  optional Account_Id real_author = 11;
  optional bool unresolved = 12;
}

// Serialized form of com.google.gerrit.reviewdb.client.PatchSetApproval.
// Next ID: 9
message PatchSetApproval {
  required PatchSetApproval_Key key = 1;
  optional int32 value = 2;
  optional fixed64 granted = 3;
  optional string tag = 6;
  optional Account_Id real_account_id = 7;
  optional bool post_submit = 8;

  // Deleted fields, should not be reused:
  reserved 4;  // changeOpen
  reserved 5;  // changeSortKey
}

// Serialized form of com.google.gerrit.reviewdb.client.RevId.
// Next ID: 2
message RevId {
  optional string id = 1;
}

// Serialized form of com.google.gerrit.reviewdb.client.PatchSet.
// Next ID: 10
message PatchSet {
  required PatchSet_Id id = 1;
  optional RevId revision = 2;
  optional Account_Id uploader_account_id = 3;
  optional fixed64 created_on = 4;
  optional string groups = 6;
  optional string push_certificate = 8;
  optional string description = 9;

  // Deleted fields, should not be reused:
  reserved 5;  // draft
  reserved 7;  // pushCertficate
}

// Serialized form of com.google.gerrit.reviewdb.client.CurrentSchemaVersion.
// Next ID: 3
message CurrentSchemaVersion {
  required CurrentSchemaVersion_Key singleton = 1;
  optional int32 version_nbr = 2;
}
