syntax = "proto3";

package gitaly;

option go_package = "gitlab.com/gitlab-org/gitaly/v14/proto/go/gitalypb";

import "lint.proto";
import "shared.proto";

service SSHService {
  // To forward 'git upload-pack' to Gitaly for SSH sessions
  rpc SSHUploadPack(stream SSHUploadPackRequest) returns (stream SSHUploadPackResponse) {
    option (op_type) = {
      op: ACCESSOR
    };
  }

  // To forward 'git upload-pack' to Gitaly for SSH sessions, via sidechannels
  rpc SSHUploadPackWithSidechannel(SSHUploadPackWithSidechannelRequest) returns (SSHUploadPackWithSidechannelResponse) {
    option (op_type) = {
      op: ACCESSOR
    };
  }

  // To forward 'git receive-pack' to Gitaly for SSH sessions
  rpc SSHReceivePack(stream SSHReceivePackRequest) returns (stream SSHReceivePackResponse) {
    option (op_type) = {
      op: MUTATOR
    };
  }

  // To forward 'git upload-archive' to Gitaly for SSH sessions
  rpc SSHUploadArchive(stream SSHUploadArchiveRequest) returns (stream SSHUploadArchiveResponse) {
    option (op_type) = {
      op: ACCESSOR
    };
  }
}

message SSHUploadPackRequest {
  // 'repository' must be present in the first message.
  Repository repository = 1 [(target_repository)=true];
  // A chunk of raw data to be copied to 'git upload-pack' standard input
  bytes stdin = 2;
  // Prevent re-use of field id 3 and/or the "git_config_parameters" name
  reserved 3;
  reserved "git_config_parameters";
  // Parameters to use with git -c (key=value pairs)
  repeated string git_config_options = 4;

  // Git protocol version
  string git_protocol = 5;
}

message SSHUploadPackResponse {
  // A chunk of raw data from 'git upload-pack' standard output
  bytes stdout = 1;
  // A chunk of raw data from 'git upload-pack' standard error
  bytes stderr = 2;
  // This field may be nil. This is intentional: only when the remote
  // command has finished can we return its exit status.
  ExitStatus exit_status = 3;
}

message SSHUploadPackWithSidechannelRequest {
  // 'repository' must be present in the first message.
  Repository repository = 1 [(target_repository)=true];
  // Parameters to use with git -c (key=value pairs)
  repeated string git_config_options = 2;

  // Git protocol version
  string git_protocol = 3;
}

message SSHUploadPackWithSidechannelResponse {}

message SSHReceivePackRequest {
  // 'repository' must be present in the first message.
  Repository repository = 1 [(target_repository)=true];
  // A chunk of raw data to be copied to 'git upload-pack' standard input
  bytes stdin = 2;
  // Contents of GL_ID, GL_REPOSITORY, and GL_USERNAME environment variables
  // for 'git receive-pack'
  string gl_id = 3;
  string gl_repository = 4;
  string gl_username = 5;

  // Git protocol version
  string git_protocol = 6;

  // Parameters to use with git -c (key=value pairs)
  repeated string git_config_options = 7;
}

message SSHReceivePackResponse {
  // A chunk of raw data from 'git receive-pack' standard output
  bytes stdout = 1;
  // A chunk of raw data from 'git receive-pack' standard error
  bytes stderr = 2;
  // This field may be nil. This is intentional: only when the remote
  // command has finished can we return its exit status.
  ExitStatus exit_status = 3;
}

message SSHUploadArchiveRequest {
  // 'repository' must be present in the first message.
  Repository repository = 1 [(target_repository)=true];
  // A chunk of raw data to be copied to 'git upload-archive' standard input
  bytes stdin = 2;
}

message SSHUploadArchiveResponse {
  // A chunk of raw data from 'git upload-archive' standard output
  bytes stdout = 1;
  // A chunk of raw data from 'git upload-archive' standard error
  bytes stderr = 2;
  // This value will only be set on the last message
  ExitStatus exit_status = 3;
}
