proto/blob.proto (269 lines of code) (raw):
syntax = "proto3";
package gitaly;
import "lint.proto";
import "shared.proto";
option go_package = "gitlab.com/gitlab-org/gitaly/v16/proto/go/gitalypb";
// BlobService is a service which provides RPCs to retrieve Git blobs from a
// specific repository.
service BlobService {
// GetBlob returns the contents of a blob object referenced by its object
// ID. We use a stream to return a chunked arbitrarily large binary
// response
rpc GetBlob(GetBlobRequest) returns (stream GetBlobResponse) {
option (op_type) = {
op: ACCESSOR
};
}
// GetBlobs returns blobs identified via a revision and path.
//
// Note that the behaviour of this RPC is quite weird: it does not only return blobs, but will also return submodules
// as commits and trees. It's use is thus discouraged in favor of ListBlobs, which behaves more sanely.
rpc GetBlobs(GetBlobsRequest) returns (stream GetBlobsResponse) {
option (op_type) = {
op: ACCESSOR
};
}
// ListBlobs will list all blobs reachable from a given set of revisions by
// doing a graph walk. It is not valid to pass revisions which do not resolve
// to an existing object.
rpc ListBlobs(ListBlobsRequest) returns (stream ListBlobsResponse) {
option (op_type) = {
op: ACCESSOR
};
}
// ListAllBlobs retrieves all blobs pointers in the repository, including
// those not reachable by any reference.
rpc ListAllBlobs(ListAllBlobsRequest) returns (stream ListAllBlobsResponse) {
option (op_type) = {
op: ACCESSOR
};
}
// GetLFSPointers retrieves LFS pointers from a given set of object IDs.
// This RPC filters all requested objects and only returns those which refer
// to a valid LFS pointer.
rpc GetLFSPointers(GetLFSPointersRequest) returns (stream GetLFSPointersResponse) {
option (op_type) = {
op: ACCESSOR
};
}
// ListLFSPointers retrieves LFS pointers reachable from a given set of
// revisions by doing a graph walk. This includes both normal revisions like
// an object ID or branch, but also the pseudo-revisions "--all" and "--not"
// as documented in git-rev-parse(1). Revisions which don't directly or
// transitively reference any LFS pointers are ignored. It is not valid to
// pass revisions which do not resolve to an existing object.
rpc ListLFSPointers(ListLFSPointersRequest) returns (stream ListLFSPointersResponse) {
option (op_type) = {
op: ACCESSOR
};
}
// ListAllLFSPointers retrieves all LFS pointers in the repository, including
// those not reachable by any reference.
rpc ListAllLFSPointers(ListAllLFSPointersRequest) returns (stream ListAllLFSPointersResponse) {
option (op_type) = {
op: ACCESSOR
};
}
}
// GetBlobRequest is a request for the GetBlob RPC.
message GetBlobRequest {
// repository is the repository that shall be searched.
Repository repository = 1[(target_repository)=true];
// oid is the object ID of the blob we want to get.
string oid = 2;
// limit is the maximum number of bytes we want to receive. Use '-1' to get the full blob no matter how big. Setting
// this to `0` will return no data.
int64 limit = 3;
}
// GetBlobResponse is a response for the GetBlob RPC. Multiple responses will be returned when the blob is large and
// thus doesn't fit into a single response.
message GetBlobResponse {
// size is the size of the blob. Present only in first response message.
int64 size = 1;
// data is a chunk of data.
bytes data = 2;
// oid of the actual blob returned. Empty if no blob was found.
string oid = 3;
}
// GetBlobsRequest is a request for the GetBlobs RPC.
message GetBlobsRequest {
// RevisionPath is a combination of revision and path. All objects reachable in the subdirectory of the treeish
// will be returned.
message RevisionPath {
// revision is the revision that identifies the tree-ish. Must not be empty.
string revision = 1;
// path is the path relative to the treeish revision that shall be searched for a blob. If the path is empty the
// root directory of the tree-ish will be searched.
bytes path = 2;
}
// repository is the repository that shall be searched.
Repository repository = 1[(target_repository)=true];
// revision_paths identifies the set of revision/path pairs that shall be searched for blobs.
repeated RevisionPath revision_paths = 2;
// limit is the maximum number of bytes we want to receive. Use '-1' to get the full blobs no matter how big.
int64 limit = 3;
}
// GetBlobsResponse is a response for the GetBlobs RPC and identifies a single blob. Multiple responses can be returned
// for the same blob in case its data is longer than the gRPC message limit. Subsequent messages for the same blob will
// only have their data field set. Blobs which cannot be found will only have their path and revision set, but will
// otherwise be empty.
message GetBlobsResponse {
// size is the size of the blob. Present only on the first message per blob
int64 size = 1;
// data is a chunk of blob data, which could span over multiple messages.
bytes data = 2;
// oid is the object ID of the current blob. Only present on the first message per blob. Empty if no blob was
// found.
string oid = 3;
// is_submodule indicates whether the blob is a submodule.
bool is_submodule = 4;
// mode is the file mode of blob as present in the tree. It is typically one of:
//
// - 0o100644 for non-executable files.
// - 0o100755 for executable files.
// - 0o160000 for submodules.
// - 0o040000 for subtrees.
int32 mode = 5;
// revision is the revision that this blob has been traversed from.
string revision = 6;
// path is the path of the blob inside of the tree.
bytes path = 7;
// type is the type of the "blob".
ObjectType type = 8;
}
// ListBlobsRequest is a request for the ListBlobs RPC.
message ListBlobsRequest {
// repository is the repository in which blobs should be enumerated.
Repository repository = 1 [(target_repository)=true];
// revisions is the list of revisions to retrieve blobs from. These revisions
// will be walked. Supports pseudo-revisions `--all` and `--not` as well as
// negated revisions via `^revision`. Revisions cannot start with a leading
// dash. Please consult gitrevisions(7) for more info. Must not be empty.
repeated string revisions = 2;
// limit is the maximum number of blobs to return. If set to its default
// (`0`), then all found blobs will be returned.
uint32 limit = 3;
// bytes_limit is the maximum number of bytes to receive for each blob. If set
// to `0`, then no blob data will be sent. If `-1`, then all blob data will
// be sent without any limits.
int64 bytes_limit = 4;
// with_paths determines whether paths of blobs should be returned. When
// set to `true`, paths are returned on a best-effort basis: a path will only
// exist if the blob was traversed via a tree.
bool with_paths = 5;
}
// ListBlobsResponse is a response for the ListBlobs RPC.
message ListBlobsResponse {
// Blob represents a Git blob object.
message Blob {
// oid is the object ID of the blob. Will only be set for the first
// message of each specific blob.
string oid = 1;
// size is the size of the blob. Will only be set for the first message
// of each specific blob.
int64 size = 2;
// data is the contents of the blob. This field is optional and depends on
// the BytesLimit in the original request.
bytes data = 3;
// path is the path of the blob. May be unset depending on how the blob had
// been traversed.
bytes path = 4;
}
// blobs is the blobs which have been found. In case blob contents were
// requested and contents of a blob exceed the maximum gRPC message size,
// then this blob will be split up into multiple blob messages which span
// across multiple responses. In that case, metadata of the blob will only be
// sent on the first such message for this specific blob.
repeated Blob blobs = 1;
}
// ListAllBlobsRequest is a request for the ListAllBlobs RPC.
message ListAllBlobsRequest {
// repository is the repository in which blobs should be enumerated.
Repository repository = 1 [(target_repository)=true];
// limit is the maximum number of blobs to return. If set to its default
// (`0`), then all found blobs will be returned.
uint32 limit = 2;
// bytes_limit is the maximum number of bytes to receive for each blob. If set
// to `0`, then no blob data will be sent. If `-1`, then all blob data will
// be sent without any limits.
int64 bytes_limit = 3;
}
// ListAllBlobsResponse is a response for the ListAllBlobs RPC.
message ListAllBlobsResponse {
// Blob represents a Git blob object.
message Blob {
// oid is the object ID of the blob. Will only be set for the first
// message of each specific blob.
string oid = 1;
// size is the size of the blob. Will only be set for the first message
// of each specific blob.
int64 size = 2;
// data is the contents of the blob. This field is optional and depends on
// the BytesLimit in the original request.
bytes data = 3;
}
// blobs is the blobs which have been found. In case blob contents were
// requested and contents of a blob exceed the maximum gRPC message size,
// then this blob will be split up into multiple blob messages which span
// across multiple responses. In that case, metadata of the blob will only be
// sent on the first such message for this specific blob.
repeated Blob blobs = 1;
}
// LFSPointer is a git blob which points to an LFS object.
message LFSPointer {
// size is the size of the blob. This is not the size of the LFS object
// pointed to.
int64 size = 1;
// data is the bare data of the LFS pointer blob. It contains the pointer to
// the LFS data in the format specified by the LFS project.
bytes data = 2;
// oid is the object ID of the blob.
string oid = 3;
// file_size is the size given when parsing the LFS pointer spec.
int64 file_size = 4;
// file_oid is the object id given when parsing the LFS pointer spec.
bytes file_oid = 5;
}
// GetLFSPointersRequest is a request for the GetLFSPointers RPC.
message GetLFSPointersRequest {
// repository is the repository for which LFS pointers should be retrieved
// from.
Repository repository = 1[(target_repository)=true];
// blob_ids is the list of blobs to retrieve LFS pointers from. Must be a
// non-empty list of blobs IDs to fetch.
repeated string blob_ids = 2;
}
// GetLFSPointersResponse is a response for the GetLFSPointers RPC.
message GetLFSPointersResponse {
// lfs_pointers is the list of LFS pointers which were requested.
repeated LFSPointer lfs_pointers = 1;
}
// ListLFSPointersRequest is a request for the ListLFSPointers RPC.
message ListLFSPointersRequest {
// repository is the repository for which LFS pointers should be retrieved
// from.
Repository repository = 1[(target_repository)=true];
// revisions is the list of revisions to retrieve LFS pointers from. Must be
// a non-empty list.
repeated string revisions = 2;
// limit limits the number of LFS pointers returned.
int32 limit = 3;
}
// ListLFSPointersResponse is a response for the ListLFSPointers RPC.
message ListLFSPointersResponse {
// lfs_pointers is the list of LFS pointers which were requested.
repeated LFSPointer lfs_pointers = 1;
}
// ListAllLFSPointersRequest is a request for the ListAllLFSPointers RPC.
message ListAllLFSPointersRequest {
// repository is the repository for which LFS pointers should be retrieved
// from.
Repository repository = 1[(target_repository)=true];
// limit limits the number of LFS pointers returned.
int32 limit = 3;
}
// ListAllLFSPointersResponse is a response for the ListAllLFSPointers RPC.
message ListAllLFSPointersResponse {
// lfs_pointers is the list of LFS pointers which were requested.
repeated LFSPointer lfs_pointers = 1;
}