proto/ref.proto (524 lines of code) (raw):

syntax = "proto3"; package gitaly; import "errors.proto"; import "lint.proto"; import "shared.proto"; option go_package = "gitlab.com/gitlab-org/gitaly/v16/proto/go/gitalypb"; // RefService is a service that provides RPCs to list and modify Git references. service RefService { // FindDefaultBranchName looks up the default branch reference name. Unless // otherwise specified the following heuristic is used: // // 1. If there are no branches, return an empty string. // 2. If there is only one branch, return the only branch. // 3. If a branch exists that matches HEAD, return the HEAD reference name. // 4. If a branch exists named refs/heads/main, return refs/heads/main. // 5. If a branch exists named refs/heads/master, return refs/heads/master. // 6. Return the first branch (as per default ordering by git). rpc FindDefaultBranchName(FindDefaultBranchNameRequest) returns (FindDefaultBranchNameResponse) { option (op_type) = { op: ACCESSOR }; } // FindLocalBranches finds all the local branches under `refs/heads/` for the specified repository. // The response is streamed back to the client to divide the list of branches into chunks. rpc FindLocalBranches(FindLocalBranchesRequest) returns (stream FindLocalBranchesResponse) { option (op_type) = { op: ACCESSOR }; } // FindAllBranches finds all branches under `refs/heads/` and `refs/remotes/` for the specified repository. // The response is streamed back to the client to divide the list of branches into chunks. rpc FindAllBranches(FindAllBranchesRequest) returns (stream FindAllBranchesResponse) { option (op_type) = { op: ACCESSOR }; } // FindAllTags finds all tags under `refs/tags/` for the specified repository. // The response is streamed back to the client to divide the list of tags into chunks. rpc FindAllTags(FindAllTagsRequest) returns (stream FindAllTagsResponse) { option (op_type) = { op: ACCESSOR }; } // FindTag looks up a tag by its name and returns it to the caller if it exists. This RPC supports // both lightweight and annotated tags. Note: this RPC returns an `Internal` error if the tag was // not found. rpc FindTag(FindTagRequest) returns (FindTagResponse) { option (op_type) = { op: ACCESSOR }; } // FindAllRemoteBranches finds all the remote branches under `refs/remotes/` for the specified repository. // The response is streamed back to the client to divide the list of branches into chunks. rpc FindAllRemoteBranches(FindAllRemoteBranchesRequest) returns (stream FindAllRemoteBranchesResponse) { option (op_type) = { op: ACCESSOR }; } // RefExists checks if the specified reference exists. The reference must be fully qualified. rpc RefExists(RefExistsRequest) returns (RefExistsResponse) { option (op_type) = { op: ACCESSOR }; } // FindBranch finds a branch by its unqualified name (like "master") and // returns the commit it currently points to. rpc FindBranch(FindBranchRequest) returns (FindBranchResponse) { option (op_type) = { op: ACCESSOR }; } // UpdateReferences atomically updates a set of references to a new state. This RPC allows creating // new references, deleting old references and updating existing references in a raceless way. // // Updating symbolic references with this RPC is not allowed. rpc UpdateReferences(stream UpdateReferencesRequest) returns (UpdateReferencesResponse) { option (op_type) = { op: MUTATOR }; } // DeleteRefs deletes the specified references from its repository. Attempting to delete an // non-existent reference does not result in an error. It is recommended to instead use the // UpdateReferences RPC because it can delete references in a raceless manner via the expected old // object ID. rpc DeleteRefs(DeleteRefsRequest) returns (DeleteRefsResponse) { option (op_type) = { op: MUTATOR }; } // ListBranchNamesContainingCommit finds all branches under `refs/heads/` that contain the specified commit. // The response is streamed back to the client to divide the list of branches into chunks. rpc ListBranchNamesContainingCommit(ListBranchNamesContainingCommitRequest) returns (stream ListBranchNamesContainingCommitResponse) { option (op_type) = { op: ACCESSOR }; } // ListTagNamesContainingCommit finds all tags under `refs/tags/` that contain the specified commit. // The response is streamed back to the client to divide the list of tags into chunks. rpc ListTagNamesContainingCommit(ListTagNamesContainingCommitRequest) returns (stream ListTagNamesContainingCommitResponse) { option (op_type) = { op: ACCESSOR }; } // GetTagSignatures returns signatures for annotated tags resolved from a set of revisions. Revisions // which don't resolve to an annotated tag are silently discarded. Revisions which cannot be resolved // result in an error. Tags which are annotated but not signed will return a TagSignature response // which has no signature, but its unsigned contents will still be returned. rpc GetTagSignatures(GetTagSignaturesRequest) returns (stream GetTagSignaturesResponse) { option (op_type) = { op: ACCESSOR }; } // GetTagMessages returns tag messages for the annotated tags identified via the given revisions. // The response is streamed back to the client with a response message containing the tag ID // always preceding one or more messages containing the tag message contents. This is repeated for // all tags in the response. rpc GetTagMessages(GetTagMessagesRequest) returns (stream GetTagMessagesResponse) { option (op_type) = { op: ACCESSOR }; } // ListRefs returns a stream of all references in the repository. By default, pseudo-revisions like HEAD // will not be returned by this RPC. Any symbolic references will be resolved to the object ID it is // pointing at. rpc ListRefs(ListRefsRequest) returns (stream ListRefsResponse) { option (op_type) = { op: ACCESSOR }; } // FindRefsByOID returns an array of fully qualified reference names that point to an object ID. // It returns nothing if the object ID doesn't exist, or doesn't point to // any branches or tags. Prefixes can be also be used as the object ID. rpc FindRefsByOID(FindRefsByOIDRequest) returns (FindRefsByOIDResponse) { option (op_type) = { op: ACCESSOR }; } } // FindDefaultBranchNameRequest is a request for the FindDefaultBranchName RPC. message FindDefaultBranchNameRequest { // repository is the repository to find the default branch from. Repository repository = 1 [(target_repository)=true]; // head_only when true will determine the default branch using HEAD only // instead of using the heuristic. The returned reference may not exist. bool head_only = 2; } // FindDefaultBranchNameResponse is a response for the FindDefaultBranchName RPC. message FindDefaultBranchNameResponse { // name is the fully qualified default branch name. bytes name = 1; } // FindLocalBranchesRequest is a request for the FindLocalBranches RPC. message FindLocalBranchesRequest { // SortBy defines the allowed field names which references can be sorted by. // https://git-scm.com/docs/git-for-each-ref#Documentation/git-for-each-ref.txt---sortltkeygt enum SortBy { // NAME is for the `--sort=refname` option and is the default option. NAME = 0; // protolint:disable:this ENUM_FIELD_NAMES_PREFIX ENUM_FIELD_NAMES_ZERO_VALUE_END_WITH // UPDATED_ASC is for the `--sort=committerdate` option. UPDATED_ASC = 1; // protolint:disable:this ENUM_FIELD_NAMES_PREFIX // UPDATED_DESC is for the `--sort=-committerdate` option. UPDATED_DESC = 2; // protolint:disable:this ENUM_FIELD_NAMES_PREFIX } // repository is the repository to find the branch in. Repository repository = 1 [(target_repository)=true]; // sort_by sets which field the returned branches are sorted by. SortBy sort_by = 2; // pagination_params controls paging. Refer to PaginationParameter documentation for // further info. PaginationParameter pagination_params = 3; } // FindLocalBranchesResponse is a response for the FindLocalBranches RPC. message FindLocalBranchesResponse { // The field Branches has been removed in favor of LocalBranches. // Issue: https://gitlab.com/gitlab-org/gitaly/-/issues/1294 reserved "branches"; reserved 1; // local_branches is a list of local branches found in the repository. repeated Branch local_branches = 2; } // FindAllBranchesRequest is a request for the FindAllBranches RPC. message FindAllBranchesRequest { // repository is the repository to find the branch in. Repository repository = 1 [(target_repository)=true]; // merged_only if set, will only return branches that are merged into root ref. bool merged_only = 2; // merged_branches is the list of branches from which we return those merged into // the root ref. Used only when merged_only is set to true. repeated bytes merged_branches = 3; } // FindAllBranchesResponse is a response for the FindAllBranches RPC. message FindAllBranchesResponse { // Branch is a branch found in the repository. message Branch { // name is the name of the branch. bytes name = 1; // target is the commit referenced by the branch. GitCommit target = 2; } // branches is a list of branches found in the repository. repeated Branch branches = 1; } // FindTagRequest is a request for the FindTag RPC. message FindTagRequest { // repository is the repository to look up the tag in. Repository repository = 1 [(target_repository)=true]; // tag_name is the name of the tag that should be looked up. The caller is supposed to pass in the // tag name only, so if e.g. a tag `refs/tags/v1.0.0` exists, then the caller should pass `v1.0.0` // as argument. bytes tag_name = 2; } // FindTagResponse is a response for the FindTag RPC. message FindTagResponse { // tag is the tag that was found. Tag tag = 1; } // FindTagError is an error that will be returned by the FindTag RPC under specific error // conditions. message FindTagError { oneof error { // tag_not_found indicates that the tag was not found. ReferenceNotFoundError tag_not_found = 1; } } // FindAllTagsRequest is a request for the FindAllTags RPC. message FindAllTagsRequest { // SortBy allows to specify desired order of the elements. message SortBy { // Key is a key used for sorting. enum Key { // REFNAME is for the `refname` field and is the default option. REFNAME = 0; // protolint:disable:this ENUM_FIELD_NAMES_PREFIX ENUM_FIELD_NAMES_ZERO_VALUE_END_WITH // CREATORDATE is for the `creatordate` field. CREATORDATE = 1; // protolint:disable:this ENUM_FIELD_NAMES_PREFIX // VERSION_REFNAME sorts tags by their semantic versions (https://semver.org/). // tag names that are not semantic versions are sorted lexicographically. They come before // the semantic versions if the direction is ascending and after the semantic versions if // the direction is descending. VERSION_REFNAME = 2; // protolint:disable:this ENUM_FIELD_NAMES_PREFIX } // key is the key that tags are sorted by. Key key = 1; // direction is the direction that tags should be sorted in. SortDirection direction = 2; } // repository is the repository to look up the tags in. Repository repository = 1 [(target_repository)=true]; // sort_by allows to request tags in particular order. SortBy sort_by = 2; // pagination_params controls paging. Refer to PaginationParameter documentation for // further info. PaginationParameter pagination_params = 3; } // FindAllTagsResponse is a response for the FindAllTags RPC. message FindAllTagsResponse { // tags is a list of the found tags. repeated Tag tags = 1; } // RefExistsRequest is a request for the RefExists RPC. message RefExistsRequest { // repository is the repository to check if the reference exists in. Repository repository = 1 [(target_repository)=true]; // ref denotes any ref, e.g. 'refs/heads/master' or 'refs/tags/v1.0.1'. // Must start with 'refs/'. bytes ref = 2; } // RefExistsResponse is a response for the RefExists RPC. message RefExistsResponse { // value represents if the reference exists. bool value = 1; } // FindBranchRequest is a request for the FindBranch RPC. message FindBranchRequest { // repository is the repository in which the branch should be looked up. Repository repository = 1 [(target_repository)=true]; // name is the name of the branch which should be looked up. This must be the // branch name only, it must not have the "refs/heads/" prefix. bytes name = 2; } // FindBranchResponse is a response for the FindBranch RPC. message FindBranchResponse { // branch is the found branch. Branch branch = 1; } // UpdateReferencesRequest is a request for the UpdateReferences RPC. message UpdateReferencesRequest { // Update represents a reference update. message Update { // reference is the fully-qualified reference name that should be updated. bytes reference = 1; // old_object_id is the object ID the reference should be pointing to in order to be updated. // This has the intent to avoid time-of-check-time-of-use-style races when the object ID // has changed. // // If empty, the reference will be force-updated without any such checks. If set to the // all-zeroes object ID, this will verify that the branch did not exist previously. bytes old_object_id = 2; // new_object_id is the object ID the reference should be updated to. If set to the all-zeroes // object ID the branch will be deleted. bytes new_object_id = 3; }; // repository is the repository where references shall be updated in. Repository repository = 1 [(target_repository)=true]; // updates is the set of reference updates that shall be performed. repeated Update updates = 2; } // UpdateReferencesResponse is a response for the UpdateReferences RPC. message UpdateReferencesResponse { } // UpdateReferencesError is returned when UpdateReferences fails to update references in some specific well-defined // cases. message UpdateReferencesError { oneof error { // invalid_format is returned when one or more of the refs to be deleted // have an invalid format. InvalidRefFormatError invalid_format = 1; // references_locked is returned when the references to be deleted are already // locked by another process. ReferencesLockedError references_locked = 2; // reference_state_mismatch is return for unforced reference updates when the expected object ID does not match // the actual object ID of the reference. This indicates either mismatching expectations or a race with another // client that has updated the reference concurrently. ReferenceStateMismatchError reference_state_mismatch = 3; } } // DeleteRefsRequest is a request for the DeleteRefs RPC. message DeleteRefsRequest{ // repository is the repository that reference is deleted from. Repository repository = 1 [(target_repository)=true]; // except_with_prefix is the prefix used to determine which references to exclude from being deleted. // This field can not be set in combination with the refs field. If the refs field is not set, except_with_prefix // must contain at least one prefix as deleting all references in not allowed. repeated bytes except_with_prefix = 2; // protolint:disable:this REPEATED_FIELD_NAMES_PLURALIZED // refs is the list of references to be deleted. This field can not be set in combination with except_with_prefix // and cannot be empty if except_with_prefix is also empty. repeated bytes refs = 3; } // DeleteRefsResponse is a response for the DeleteRefs RPC. message DeleteRefsResponse { // git_error is a Git error returned by the RPC. Is empty if no error occurs. string git_error = 1; } // DeleteRefsError is returned when DeleteRefs fails to delete refs message DeleteRefsError { oneof error { // invalid_format is returned when one or more of the refs to be deleted // have an invalid format. InvalidRefFormatError invalid_format = 1; // references_locked is returned when the references to be deleted are already // locked by another process. ReferencesLockedError references_locked = 2; } } // ListBranchNamesContainingCommitRequest is a request for the ListBranchNamesContainingCommit RPC. message ListBranchNamesContainingCommitRequest { // repository is the repository to find branches with the specified commit in. Repository repository = 1 [(target_repository)=true]; // commit_id is the commit ID used to find branches. string commit_id = 2; // limit the number of tag names to be returned // If the limit is set to zero, all items will be returned uint32 limit = 3; } // ListBranchNamesContainingCommitResponse is a response for the ListBranchNamesContainingCommit RPC. message ListBranchNamesContainingCommitResponse { reserved 1; // branch_names contains a list of found branch names. repeated bytes branch_names = 2; } // ListTagNamesContainingCommitRequest is a request for the ListTagNamesContainingCommit RPC. message ListTagNamesContainingCommitRequest { // repository is the repository to find tags with the specified commit in. Repository repository = 1 [(target_repository)=true]; // commit_id is the commit ID used to find tags. string commit_id = 2; // limit the number of tag names to be returned // If the limit is set to zero, all items will be returned uint32 limit = 3; } // ListTagNamesContainingCommitResponse is a response for the ListTagNamesContainingCommit RPC. message ListTagNamesContainingCommitResponse { reserved 1; // tag_names contains a list of tag names found. repeated bytes tag_names = 2; } // GetTagSignaturesRequest is a request for the GetTagSignatures RPC. message GetTagSignaturesRequest { // repository is the repository in which tag signatures should be looked up. Repository repository = 1 [(target_repository)=true]; // tag_revisions is the set of revisions which that should be looked up. Revisions // supports the syntax as specified by gitrevisions(7). All revisions are expected // to resolve to annotated tag objects. At least one revision must be provided. repeated string tag_revisions = 2; } // GetTagSignaturesResponse is a response for a GetTagSignatures request. Each response // may contain multiple TagSignatures. In case TagSignatures don't fit into a single // response, signatures will be batched in multiple responses. message GetTagSignaturesResponse { // TagSignature represents the signature of a signed tag. message TagSignature { // tag_id is the resolved object ID of the tag. string tag_id = 1; // signature contains the cryptographic signature of the tag. If the tag is not // cryptographically signed, then the signature is unset. bytes signature = 2; // content contains the contents which are signed by the signature. Contents // include both the commit message, but also the commit metadata like author and // subject. bytes content = 3; } // signatures is the set of signatures found. repeated TagSignature signatures = 1; } // GetTagMessagesRequest is a request for the GetTagMessages RPC. message GetTagMessagesRequest { reserved 2; reserved "tag_names"; // repository is the repository to get tag messages from. Repository repository = 1 [(target_repository)=true]; // tag_ids is the list of annotated tag IDs used to get the tag messages. repeated string tag_ids = 3; } // GetTagMessagesResponse is a response for the GetTagMessages RPC. Annotated tag messages are // chunked and streamed back to the client across multiple response messages sequentially. Each // series of responses for a given tag begins with a response that contains only the associated tag // ID and is subsequently followed by responses containing the tag message contents. This is // repeated for each annotated tag included as part of the response stream. message GetTagMessagesResponse { reserved 1; reserved "tag_name"; // message content from the annotated tag message. bytes message = 2; // tag_id is the ID of the tag for which the message belongs. string tag_id = 3; } // FindAllRemoteBranchesRequest is a request for the FindAllRemoteBranches RPC. message FindAllRemoteBranchesRequest { // repository is the repository to find remote branches from. Repository repository = 1 [(target_repository)=true]; // remote_name is the name of the remote repository. string remote_name = 2; } // FindAllRemoteBranchesResponse is a request for the FindAllRemoteBranches RPC. message FindAllRemoteBranchesResponse { // branches contains a list of found remote branches. repeated Branch branches = 1; } // ListRefsRequest is a request for the ListRefs RPC. message ListRefsRequest { // SortBy defines the field to sort on and its direction. message SortBy { // Key is a key used for sorting. // https://git-scm.com/docs/git-for-each-ref#Documentation/git-for-each-ref.txt---sortltkeygt enum Key { // REFNAME is for the `refname` field and is the default option. REFNAME = 0; // protolint:disable:this ENUM_FIELD_NAMES_PREFIX ENUM_FIELD_NAMES_ZERO_VALUE_END_WITH // CREATORDATE is for the `creatordate` field. CREATORDATE = 1; // protolint:disable:this ENUM_FIELD_NAMES_PREFIX // AUTHORDATE is for the `authordate` field. AUTHORDATE = 2; // protolint:disable:this ENUM_FIELD_NAMES_PREFIX // COMMITTERDATE is for the `committerdate` field. COMMITTERDATE = 3; // protolint:disable:this ENUM_FIELD_NAMES_PREFIX } // key is a key used for sorting. Key key = 1; // direction is the direction that tags should be sorted in. SortDirection direction = 2; } // repository is the repository in which references should be listed in. Repository repository = 1 [(target_repository)=true]; // patterns contains all patterns which shall be listed. Patterns should be in the format // accepted by git-for-each-ref(1). At least one pattern must be given, otherwise an error // is returned. Patterns which don't match any reference will be silently ignored. repeated bytes patterns = 2; // head determines whether the RPC should also return the HEAD reference. By default, // pseudo-refs are not included in the response. bool head = 3; // sort_by allows to request SHAs in particular order. SortBy sort_by = 4; // pointing_at_oids is a list of OIDs that can optionally be passed to only return refs // pointing at the given OIDs. This corresponds to the --points-at option of git-for-each-ref(1). repeated bytes pointing_at_oids = 5; // peel_tags controls whether annotated tags should be peeled to their target objects so that the // `PeeledTarget` returned for the reference is the ID of the target object. Note that this // will significantly slow down the request by a factor of 3 to 4. bool peel_tags = 6; } // ListRefsResponse is a response for the ListRefs RPC. The RPC can return multiple responses // in case there are more references than fit into a single gRPC message. message ListRefsResponse{ // Reference is a direct Git reference. No symbolic references will ever be returned by this RPC. message Reference { // name is the fully qualified name of the reference. bytes name = 1; // target is the object ID the reference points to. string target = 2; // peeled_target is the object ID an annotated tag points to. This field is only set when // `PeelTags=true`. This field is empty in case the object is not an annotated tag. string peeled_target = 3; } // references is the set of references returned by the RPC. repeated Reference references = 1; } // FindRefsByOIDRequest is a request for the FindRefsByOID RPC. message FindRefsByOIDRequest { // repository is the repository in which references will be looked for. Repository repository = 1 [(target_repository)=true]; // oid is an object ID to find references for. string oid = 2; // ref_patterns can be one of branch name, tag name or fully qualified ref name. // Providing more than one pattern will yield refs that match any of the given patterns. // If left empty, defaults to "refs/heads/" and "refs/tags/" repeated string ref_patterns = 3; // sort_field determines the sort order of the resulting refs. // If left empty, defaults to "refname" (lexicographic refname order) string sort_field = 4; // limit limits the amount of results returned. 0 means no limit. uint32 limit = 5; } // FindRefsByOIDResponse is a response for the FindRefsByOID RPC. message FindRefsByOIDResponse { // refs is the set of fully-qualified references which have been found. repeated string refs = 1; }