syntax = "proto3";

package gitaly;

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

import "google/protobuf/descriptor.proto";

message OperationMsg {
  enum Operation {
    UNKNOWN = 0;
    MUTATOR = 1;
    ACCESSOR = 2;
  }

  Operation op = 1;

  enum Scope {
    REPOSITORY = 0;
    STORAGE = 2;

    reserved 1;
    reserved "SERVER";
  }

  // Scope level indicates what level an RPC interacts with a server:
  //   - REPOSITORY: scoped to only a single repo
  //   - SERVER: affects the entire server and potentially all repos
  //   - STORAGE: scoped to a specific storage location and all repos within
  Scope scope_level = 2;
}

extend google.protobuf.ServiceOptions {
  // intercepted indicates whether the proxy intercepts and handles the call
  // instead of proxying. Intercepted services do not require scope or operation
  // annotations.
  bool intercepted = 82302;
}

extend google.protobuf.MethodOptions {
  // Random high number..
  OperationMsg op_type = 82303;
}

extend google.protobuf.FieldOptions {
  // Used to mark field containing name of affected storage.
  bool storage = 91233; // Random high number..

  // If this operation modifies a repository, this annotations
  // will specify the location of the Repository field within
  // the request message.
  //
  // Repository annotation is used mark field used as repository
  // when parent message is marked as target or additional repository
  bool repository = 91234;
  // Used to mark target repository
  bool target_repository = 91235;
  // Used to mark additional repository
  bool additional_repository = 91236;
}
