syntax = "proto3";

package gitaly;

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

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

// CleanupService provides RPCs to clean up a repository's contents.
service CleanupService {

  // ApplyBfgObjectMapStream ...
  rpc ApplyBfgObjectMapStream(stream ApplyBfgObjectMapStreamRequest) returns (stream ApplyBfgObjectMapStreamResponse) {
    option (op_type) = {
      op: MUTATOR
    };
  }

  // RewriteHistory redacts targeted strings and deletes requested blobs in a
  // repository and updates all references to point to the rewritten commit
  // history. This is useful for removing inadvertently pushed secrets from your
  // repository and purging large blobs. This is a dangerous operation.
  //
  // The following known error conditions may happen:
  //
  // - `InvalidArgument` in the following situations:
  //    - The provided repository can't be validated.
  //    - The repository field is set on any request other than the initial one.
  //    - All of the client requests do not contain either blobs to remove or
  //      redaction patterns to redact.
  //    - A blob object ID is invalid.
  //    - A redaction pattern contains a newline character.
  // - `Aborted` if the repository is mutated while this RPC is executing.
  rpc RewriteHistory(stream RewriteHistoryRequest) returns (RewriteHistoryResponse) {
    option (op_type) = {
      op : MUTATOR
    };
  }

}

// ApplyBfgObjectMapStreamRequest ...
message ApplyBfgObjectMapStreamRequest {
  // repository ...
  // Only available on the first message
  Repository repository = 1 [(target_repository)=true];

  // object_map is a raw object-map file as generated by BFG: https://rtyley.github.io/bfg-repo-cleaner
  // Each line in the file has two object SHAs, space-separated - the original
  // SHA of the object, and the SHA after BFG has rewritten the object.
  bytes object_map = 2;
}

// ApplyBfgObjectMapStreamResponse ...
message ApplyBfgObjectMapStreamResponse {
  // Entry refers to each parsed entry in the request's object map so the client
  // can take action.
  message Entry {
    // type ...
    ObjectType type = 1;
    // old_oid ...
    string old_oid = 2;
    // new_oid ...
    string new_oid = 3;
  }

  // entries ...
  repeated Entry entries = 1;
}

// RewriteHistoryRequest is a request for the RewriteHistory RPC.
message RewriteHistoryRequest {
  // repository is the repository that shall be rewritten.
  // Must be sent on the first request only.
  Repository repository = 1 [(target_repository)=true];
  // blobs is the list of blob object ids that will be removed from history.
  repeated string blobs = 2;
  // redactions is the list of literals or patterns that will be replaced
  // with "***REMOVED***". Items cannot contain newline characters.
  // See https://htmlpreview.github.io/?https://github.com/newren/git-filter-repo/blob/docs/html/git-filter-repo.html
  // for a full explanation of what patterns are supported.
  repeated bytes redactions = 3;
}

// RewriteHistoryResponse a response for the RewriteHistory RPC.
message RewriteHistoryResponse {
}
