syntax = "proto3";

package git.v1;

import "common.proto";

// Mirrors: cmd/diff/mod.rs — DiffDeltaStatus
enum DiffDeltaStatus {
  DIFF_DELTA_STATUS_UNMODIFIED = 0;
  DIFF_DELTA_STATUS_ADDED = 1;
  DIFF_DELTA_STATUS_DELETED = 2;
  DIFF_DELTA_STATUS_MODIFIED = 3;
  DIFF_DELTA_STATUS_RENAMED = 4;
  DIFF_DELTA_STATUS_COPIED = 5;
  DIFF_DELTA_STATUS_TYPECHANGE = 6;
  DIFF_DELTA_STATUS_CONFLICTED = 7;
}

// Mirrors: cmd/diff/mod.rs — DiffFile
message DiffFile {
  ObjectId oid = 1;
  optional string path = 2;
  uint64 size = 3;
  bool is_binary = 4;
}

// Mirrors: cmd/diff/mod.rs — DiffHunk
message DiffHunk {
  uint32 old_start = 1;
  uint32 old_lines = 2;
  uint32 new_start = 3;
  uint32 new_lines = 4;
  string header = 5;
}

// Mirrors: cmd/diff/mod.rs — DiffDelta
message DiffDelta {
  DiffDeltaStatus status = 1;
  DiffFile old_file = 2;
  DiffFile new_file = 3;
  uint32 nfiles = 4;
  repeated DiffHunk hunks = 5;
  repeated DiffLine lines = 6;
}

// Mirrors: cmd/diff/mod.rs — DiffLine
message DiffLine {
  string content = 1;
  string origin = 2;
  optional uint32 old_lineno = 3;
  optional uint32 new_lineno = 4;
  uint32 num_lines = 5;
  int64 content_offset = 6;
}

// Mirrors: cmd/diff/mod.rs — DiffStats
message DiffStats {
  uint64 files_changed = 1;
  uint64 insertions = 2;
  uint64 deletions = 3;
}

// Mirrors: cmd/diff/mod.rs — DiffResult
message DiffResult {
  DiffStats stats = 1;
  repeated DiffDelta deltas = 2;
}

// Mirrors: cmd/diff/mod.rs — DiffOptions
message DiffOptions {
  uint32 context_lines = 1;
  repeated string pathspec = 2;
  bool ignore_whitespace = 3;
  bool force_text = 4;
  bool reverse = 5;
}

// Mirrors: cmd/diff/mod.rs — SideBySideChangeType
enum SideBySideChangeType {
  SIDE_BY_SIDE_CHANGE_TYPE_UNCHANGED = 0;
  SIDE_BY_SIDE_CHANGE_TYPE_ADDED = 1;
  SIDE_BY_SIDE_CHANGE_TYPE_REMOVED = 2;
  SIDE_BY_SIDE_CHANGE_TYPE_MODIFIED = 3;
  SIDE_BY_SIDE_CHANGE_TYPE_EMPTY = 4;
}

// Mirrors: cmd/diff/mod.rs — SideBySideLine
message SideBySideLine {
  optional uint32 left_line_no = 1;
  optional uint32 right_line_no = 2;
  string left_content = 3;
  string right_content = 4;
  SideBySideChangeType change_type = 5;
}

// Mirrors: cmd/diff/mod.rs — SideBySideFile
message SideBySideFile {
  string path = 1;
  uint64 additions = 2;
  uint64 deletions = 3;
  bool is_binary = 4;
  bool is_rename = 5;
  repeated SideBySideLine lines = 6;
}

// Mirrors: cmd/diff/mod.rs — SideBySideDiffResult
message SideBySideDiffResult {
  repeated SideBySideFile files = 1;
  uint64 total_additions = 2;
  uint64 total_deletions = 3;
}

message DiffStatsRequest {
  string repo_id = 1;
  ObjectId old_oid = 2;
  ObjectId new_oid = 3;
  optional DiffOptions options = 4;
}

message DiffStatsResponse {
  DiffResult result = 1;
}

message DiffPatchRequest {
  string repo_id = 1;
  ObjectId old_oid = 2;
  ObjectId new_oid = 3;
  optional DiffOptions options = 4;
}

message DiffPatchResponse {
  DiffResult result = 1;
}

message DiffPatchSideBySideRequest {
  string repo_id = 1;
  ObjectId old_oid = 2;
  ObjectId new_oid = 3;
  optional DiffOptions options = 4;
}

message DiffPatchSideBySideResponse {
  SideBySideDiffResult result = 1;
}

message DiffTreeToTreeRequest {
  string repo_id = 1;
  ObjectId old_tree = 2;
  ObjectId new_tree = 3;
  optional DiffOptions options = 4;
}

message DiffTreeToTreeResponse {
  DiffResult result = 1;
}

message DiffIndexToTreeRequest {
  string repo_id = 1;
  ObjectId tree_oid = 2;
  optional DiffOptions options = 3;
}

message DiffIndexToTreeResponse {
  DiffResult result = 1;
}

service DiffService {
  rpc DiffStats(DiffStatsRequest) returns (DiffStatsResponse);
  rpc DiffPatch(DiffPatchRequest) returns (DiffPatchResponse);
  rpc DiffStream(DiffPatchRequest) returns (stream DiffDelta);
  rpc DiffPatchSideBySide(DiffPatchSideBySideRequest) returns (DiffPatchSideBySideResponse);
  rpc DiffTreeToTree(DiffTreeToTreeRequest) returns (DiffTreeToTreeResponse);
  rpc DiffIndexToTree(DiffIndexToTreeRequest) returns (DiffIndexToTreeResponse);
}