detached c671ff4

feat(proto): merge request mergeability, its Watch event and the merge commit mode

commit
c671ff44c6025b2c1819dced069baee101b836c1
author
brice · · 2026-10-19 12:32 UTC
committer
brice · · 2026-10-19 14:35 UTC
parent
2aff1f7
signature
GPG VerifiedCD88F9E564E0102646FB6077A1A07C7C7C3E349D · arch-gpg Verified for the committer email
14 files · +717 -298
M docs/services.md +2 -2
@@ -5,10 +5,10 @@
55 | `RepoService` | `ListRepos`, `GetRepo`, `CreateRepo`, `UpdateRepo` (field mask, merge settings), `DeleteRepo` |
66 | `GitService` | `ListRefs`, `GetTree`, `ListPaths`, `GetBlob` (streamed), `ListCommits`, `GetCommit` (structured diff), `ResolveRevision` |
77 | `TokenService` | `CreateToken` (secret shown once), `ListTokens`, `RevokeToken` |
8-| `MergeRequestService` | `CreateMergeRequest`, `ListMergeRequests`, `GetMergeRequest` (commits, diff, comments), `AddComment`, `EditComment`, `DeleteComment`, `ResolveComment`, `CloseMergeRequest`, `MergeMergeRequest`, `MarkRead` |
8+| `MergeRequestService` | `CreateMergeRequest`, `ListMergeRequests`, `GetMergeRequest` (commits, diff, comments), `AddComment`, `EditComment`, `DeleteComment`, `ResolveComment`, `CloseMergeRequest`, `MergeMergeRequest` (modes fast-forward, squash, merge commit), `MarkRead`. Open merge requests carry `mergeability` (up to date, behind, conflict, or checking) and `Watch` publishes `MergeRequestMergeability` when it changes (feature `merge_requests.mergeability`) |
99 | `IssueService` | `CreateIssue`, `ListIssues`, `GetIssue` (comments), `AddIssueComment`, `CloseIssue`, `ReopenIssue`; owner only: `ListPendingIssues`, `ApproveIssue`, `RejectIssue`. Feature `issues`. Issues share numbers with merge requests |
1010 | `SessionService` | `CreateLoginLink`, `SignOutEverywhere` (owner only) |
11-| `EventService` | `Watch` (streamed, resumable). Topics `home`, `repo:<name>` and `owner` (owner rights only). Events 17–21: `issue_opened`, `issue_closed`, `issue_reopened`, `issue_commented`, and `issue_submitted` (only on `owner`, no content) |
11+| `EventService` | `Watch` (streamed, resumable). Topics `home`, `repo:<name>` and `owner` (owner rights only). Events 17–21: `issue_opened`, `issue_closed`, `issue_reopened`, `issue_commented`, and `issue_submitted` (only on `owner`, no content). Event 22: `merge_request_mergeability` |
1212 | `ServerService` | `GetVersion` (version and features), `GetSigningKey`, `RotateOIDCKey` (owner only) |
1313 | `TrustedKeyService` | `ListTrustedKeys`, `AddTrustedKey` and `RemoveTrustedKey` (owner only). `Commit.verification` carries the result of the check (feature `commit_signatures`) |
1414 | `RunService` | `ListRuns`, `GetRun`, `GetJob`, `GetJobLog` (streamed, follow), `ListAnnotations`, `GetStepSummaries`, `CancelRun`, `RerunRun`, `DispatchWorkflow`, `ListWorkflows`, `DisableWorkflow`, `EnableWorkflow`, `ListChecks`, `ListRunners`, `RemoveRunner` |
@@ -5,10 +5,10 @@
5 | `RepoService` | `ListRepos`, `GetRepo`, `CreateRepo`, `UpdateRepo` (field mask, merge settings), `DeleteRepo` |5 | `RepoService` | `ListRepos`, `GetRepo`, `CreateRepo`, `UpdateRepo` (field mask, merge settings), `DeleteRepo` |
6 | `GitService` | `ListRefs`, `GetTree`, `ListPaths`, `GetBlob` (streamed), `ListCommits`, `GetCommit` (structured diff), `ResolveRevision` |6 | `GitService` | `ListRefs`, `GetTree`, `ListPaths`, `GetBlob` (streamed), `ListCommits`, `GetCommit` (structured diff), `ResolveRevision` |
7 | `TokenService` | `CreateToken` (secret shown once), `ListTokens`, `RevokeToken` |7 | `TokenService` | `CreateToken` (secret shown once), `ListTokens`, `RevokeToken` |
8-| `MergeRequestService` | `CreateMergeRequest`, `ListMergeRequests`, `GetMergeRequest` (commits, diff, comments), `AddComment`, `EditComment`, `DeleteComment`, `ResolveComment`, `CloseMergeRequest`, `MergeMergeRequest`, `MarkRead` |8+| `MergeRequestService` | `CreateMergeRequest`, `ListMergeRequests`, `GetMergeRequest` (commits, diff, comments), `AddComment`, `EditComment`, `DeleteComment`, `ResolveComment`, `CloseMergeRequest`, `MergeMergeRequest` (modes fast-forward, squash, merge commit), `MarkRead`. Open merge requests carry `mergeability` (up to date, behind, conflict, or checking) and `Watch` publishes `MergeRequestMergeability` when it changes (feature `merge_requests.mergeability`) |
9 | `IssueService` | `CreateIssue`, `ListIssues`, `GetIssue` (comments), `AddIssueComment`, `CloseIssue`, `ReopenIssue`; owner only: `ListPendingIssues`, `ApproveIssue`, `RejectIssue`. Feature `issues`. Issues share numbers with merge requests |9 | `IssueService` | `CreateIssue`, `ListIssues`, `GetIssue` (comments), `AddIssueComment`, `CloseIssue`, `ReopenIssue`; owner only: `ListPendingIssues`, `ApproveIssue`, `RejectIssue`. Feature `issues`. Issues share numbers with merge requests |
10 | `SessionService` | `CreateLoginLink`, `SignOutEverywhere` (owner only) |10 | `SessionService` | `CreateLoginLink`, `SignOutEverywhere` (owner only) |
11-| `EventService` | `Watch` (streamed, resumable). Topics `home`, `repo:<name>` and `owner` (owner rights only). Events 17–21: `issue_opened`, `issue_closed`, `issue_reopened`, `issue_commented`, and `issue_submitted` (only on `owner`, no content) |11+| `EventService` | `Watch` (streamed, resumable). Topics `home`, `repo:<name>` and `owner` (owner rights only). Events 17–21: `issue_opened`, `issue_closed`, `issue_reopened`, `issue_commented`, and `issue_submitted` (only on `owner`, no content). Event 22: `merge_request_mergeability` |
12 | `ServerService` | `GetVersion` (version and features), `GetSigningKey`, `RotateOIDCKey` (owner only) |12 | `ServerService` | `GetVersion` (version and features), `GetSigningKey`, `RotateOIDCKey` (owner only) |
13 | `TrustedKeyService` | `ListTrustedKeys`, `AddTrustedKey` and `RemoveTrustedKey` (owner only). `Commit.verification` carries the result of the check (feature `commit_signatures`) |13 | `TrustedKeyService` | `ListTrustedKeys`, `AddTrustedKey` and `RemoveTrustedKey` (owner only). `Commit.verification` carries the result of the check (feature `commit_signatures`) |
14 | `RunService` | `ListRuns`, `GetRun`, `GetJob`, `GetJobLog` (streamed, follow), `ListAnnotations`, `GetStepSummaries`, `CancelRun`, `RerunRun`, `DispatchWorkflow`, `ListWorkflows`, `DisableWorkflow`, `EnableWorkflow`, `ListChecks`, `ListRunners`, `RemoveRunner` |14 | `RunService` | `ListRuns`, `GetRun`, `GetJob`, `GetJobLog` (streamed, follow), `ListAnnotations`, `GetStepSummaries`, `CancelRun`, `RerunRun`, `DispatchWorkflow`, `ListWorkflows`, `DisableWorkflow`, `EnableWorkflow`, `ListChecks`, `ListRunners`, `RemoveRunner` |
M gen/ermite/ermiteconnect/merge_request.connect.go +12 -6
@@ -127,9 +127,12 @@ type MergeRequestServiceClient interface {
127127 // never merged unseen. Fails with invalid_argument if head_id is empty or
128128 // not a commit id, and with failed_precondition if the merge request is not
129129 // open, if the source branch no longer points to head_id ("branch moved,
130- // read again"), if the target is not an ancestor of the head (rebase and
131- // push again), if the mode is not allowed by RepoSettings, or if a check
132- // fails and RepoSettings.failing_checks_block is set. Merges of one
130+ // read again"), if the mode is fast-forward and the target is not an
131+ // ancestor of the head (rebase and push again, or merge with squash or
132+ // merge commit), if the mode is squash or merge commit and the head
133+ // conflicts with the target or shares no history with it (rebase and push
134+ // again), if the mode is not allowed by RepoSettings, or if a check fails
135+ // and RepoSettings.failing_checks_block is set. Merges of one
133136 // repository run one at a time. Repeating a call that succeeded fails with
134137 // failed_precondition (not open). On success the server publishes
135138 // MergeRequestMerged then Pushed for the target branch.
@@ -339,9 +342,12 @@ type MergeRequestServiceHandler interface {
339342 // never merged unseen. Fails with invalid_argument if head_id is empty or
340343 // not a commit id, and with failed_precondition if the merge request is not
341344 // open, if the source branch no longer points to head_id ("branch moved,
342- // read again"), if the target is not an ancestor of the head (rebase and
343- // push again), if the mode is not allowed by RepoSettings, or if a check
344- // fails and RepoSettings.failing_checks_block is set. Merges of one
345+ // read again"), if the mode is fast-forward and the target is not an
346+ // ancestor of the head (rebase and push again, or merge with squash or
347+ // merge commit), if the mode is squash or merge commit and the head
348+ // conflicts with the target or shares no history with it (rebase and push
349+ // again), if the mode is not allowed by RepoSettings, or if a check fails
350+ // and RepoSettings.failing_checks_block is set. Merges of one
345351 // repository run one at a time. Repeating a call that succeeded fails with
346352 // failed_precondition (not open). On success the server publishes
347353 // MergeRequestMerged then Pushed for the target branch.
@@ -127,9 +127,12 @@ type MergeRequestServiceClient interface {
127 // never merged unseen. Fails with invalid_argument if head_id is empty or127 // never merged unseen. Fails with invalid_argument if head_id is empty or
128 // not a commit id, and with failed_precondition if the merge request is not128 // not a commit id, and with failed_precondition if the merge request is not
129 // open, if the source branch no longer points to head_id ("branch moved,129 // open, if the source branch no longer points to head_id ("branch moved,
130- // read again"), if the target is not an ancestor of the head (rebase and130+ // read again"), if the mode is fast-forward and the target is not an
131- // push again), if the mode is not allowed by RepoSettings, or if a check131+ // ancestor of the head (rebase and push again, or merge with squash or
132- // fails and RepoSettings.failing_checks_block is set. Merges of one132+ // merge commit), if the mode is squash or merge commit and the head
133+ // conflicts with the target or shares no history with it (rebase and push
134+ // again), if the mode is not allowed by RepoSettings, or if a check fails
135+ // and RepoSettings.failing_checks_block is set. Merges of one
133 // repository run one at a time. Repeating a call that succeeded fails with136 // repository run one at a time. Repeating a call that succeeded fails with
134 // failed_precondition (not open). On success the server publishes137 // failed_precondition (not open). On success the server publishes
135 // MergeRequestMerged then Pushed for the target branch.138 // MergeRequestMerged then Pushed for the target branch.
@@ -339,9 +342,12 @@ type MergeRequestServiceHandler interface {
339 // never merged unseen. Fails with invalid_argument if head_id is empty or342 // never merged unseen. Fails with invalid_argument if head_id is empty or
340 // not a commit id, and with failed_precondition if the merge request is not343 // not a commit id, and with failed_precondition if the merge request is not
341 // open, if the source branch no longer points to head_id ("branch moved,344 // open, if the source branch no longer points to head_id ("branch moved,
342- // read again"), if the target is not an ancestor of the head (rebase and345+ // read again"), if the mode is fast-forward and the target is not an
343- // push again), if the mode is not allowed by RepoSettings, or if a check346+ // ancestor of the head (rebase and push again, or merge with squash or
344- // fails and RepoSettings.failing_checks_block is set. Merges of one347+ // merge commit), if the mode is squash or merge commit and the head
348+ // conflicts with the target or shares no history with it (rebase and push
349+ // again), if the mode is not allowed by RepoSettings, or if a check fails
350+ // and RepoSettings.failing_checks_block is set. Merges of one
345 // repository run one at a time. Repeating a call that succeeded fails with351 // repository run one at a time. Repeating a call that succeeded fails with
346 // failed_precondition (not open). On success the server publishes352 // failed_precondition (not open). On success the server publishes
347 // MergeRequestMerged then Pushed for the target branch.353 // MergeRequestMerged then Pushed for the target branch.
M gen/ermite/ermiteconnect/server.connect.go +2 -2
@@ -53,7 +53,7 @@ type ServerServiceClient interface {
5353 // it first to check compatibility.
5454 GetVersion(context.Context, *connect.Request[ermite.GetVersionRequest]) (*connect.Response[ermite.GetVersionResponse], error)
5555 // GetSigningKey returns the public key with which the server signs the
56- // commits it creates (squash merges, see MergeMode). It needs no
56+ // commits it creates (squash and merge commits, see MergeMode). It needs no
5757 // authentication: the key is public, and anyone verifying a commit needs it.
5858 // Servers that implement it list "signing_key" in
5959 // GetVersionResponse.features.
@@ -132,7 +132,7 @@ type ServerServiceHandler interface {
132132 // it first to check compatibility.
133133 GetVersion(context.Context, *connect.Request[ermite.GetVersionRequest]) (*connect.Response[ermite.GetVersionResponse], error)
134134 // GetSigningKey returns the public key with which the server signs the
135- // commits it creates (squash merges, see MergeMode). It needs no
135+ // commits it creates (squash and merge commits, see MergeMode). It needs no
136136 // authentication: the key is public, and anyone verifying a commit needs it.
137137 // Servers that implement it list "signing_key" in
138138 // GetVersionResponse.features.
@@ -53,7 +53,7 @@ type ServerServiceClient interface {
53 // it first to check compatibility.53 // it first to check compatibility.
54 GetVersion(context.Context, *connect.Request[ermite.GetVersionRequest]) (*connect.Response[ermite.GetVersionResponse], error)54 GetVersion(context.Context, *connect.Request[ermite.GetVersionRequest]) (*connect.Response[ermite.GetVersionResponse], error)
55 // GetSigningKey returns the public key with which the server signs the55 // GetSigningKey returns the public key with which the server signs the
56- // commits it creates (squash merges, see MergeMode). It needs no56+ // commits it creates (squash and merge commits, see MergeMode). It needs no
57 // authentication: the key is public, and anyone verifying a commit needs it.57 // authentication: the key is public, and anyone verifying a commit needs it.
58 // Servers that implement it list "signing_key" in58 // Servers that implement it list "signing_key" in
59 // GetVersionResponse.features.59 // GetVersionResponse.features.
@@ -132,7 +132,7 @@ type ServerServiceHandler interface {
132 // it first to check compatibility.132 // it first to check compatibility.
133 GetVersion(context.Context, *connect.Request[ermite.GetVersionRequest]) (*connect.Response[ermite.GetVersionResponse], error)133 GetVersion(context.Context, *connect.Request[ermite.GetVersionRequest]) (*connect.Response[ermite.GetVersionResponse], error)
134 // GetSigningKey returns the public key with which the server signs the134 // GetSigningKey returns the public key with which the server signs the
135- // commits it creates (squash merges, see MergeMode). It needs no135+ // commits it creates (squash and merge commits, see MergeMode). It needs no
136 // authentication: the key is public, and anyone verifying a commit needs it.136 // authentication: the key is public, and anyone verifying a commit needs it.
137 // Servers that implement it list "signing_key" in137 // Servers that implement it list "signing_key" in
138 // GetVersionResponse.features.138 // GetVersionResponse.features.
M gen/ermite/event.pb.go +207 -112
@@ -170,6 +170,7 @@ type Event struct {
170170 // *Event_IssueReopened
171171 // *Event_IssueCommented
172172 // *Event_IssueSubmitted
173+ // *Event_MergeRequestMergeability
173174 Kind isEvent_Kind `protobuf_oneof:"kind"`
174175 unknownFields protoimpl.UnknownFields
175176 sizeCache protoimpl.SizeCache
@@ -397,6 +398,15 @@ func (x *Event) GetIssueSubmitted() *IssueSubmitted {
397398 return nil
398399 }
399400
401+func (x *Event) GetMergeRequestMergeability() *MergeRequestMergeability {
402+ if x != nil {
403+ if x, ok := x.Kind.(*Event_MergeRequestMergeability); ok {
404+ return x.MergeRequestMergeability
405+ }
406+ }
407+ return nil
408+}
409+
400410 type isEvent_Kind interface {
401411 isEvent_Kind()
402412 }
@@ -497,6 +507,12 @@ type Event_IssueSubmitted struct {
497507 IssueSubmitted *IssueSubmitted `protobuf:"bytes,21,opt,name=issue_submitted,json=issueSubmitted,proto3,oneof"`
498508 }
499509
510+type Event_MergeRequestMergeability struct {
511+ // MergeRequestMergeability: the mergeability of an open merge request
512+ // changed.
513+ MergeRequestMergeability *MergeRequestMergeability `protobuf:"bytes,22,opt,name=merge_request_mergeability,json=mergeRequestMergeability,proto3,oneof"`
514+}
515+
500516 func (*Event_RepoCreated) isEvent_Kind() {}
501517
502518 func (*Event_RepoUpdated) isEvent_Kind() {}
@@ -535,6 +551,8 @@ func (*Event_IssueCommented) isEvent_Kind() {}
535551
536552 func (*Event_IssueSubmitted) isEvent_Kind() {}
537553
554+func (*Event_MergeRequestMergeability) isEvent_Kind() {}
555+
538556 // RepoCreated reports a new repository.
539557 type RepoCreated struct {
540558 state protoimpl.MessageState `protogen:"open.v1"`
@@ -885,6 +903,72 @@ func (x *MergeRequestMerged) GetMergeRequest() *MergeRequest {
885903 return nil
886904 }
887905
906+// MergeRequestMergeability reports the mergeability of an open merge request.
907+// It is published when the state changes, or when a check settles a result
908+// that readers had not seen yet (they saw CHECKING), not on every push.
909+type MergeRequestMergeability struct {
910+ state protoimpl.MessageState `protogen:"open.v1"`
911+ // Repo is the name of the repository.
912+ Repo string `protobuf:"bytes,1,opt,name=repo,proto3" json:"repo,omitempty"`
913+ // Number is the number of the merge request.
914+ Number int64 `protobuf:"varint,2,opt,name=number,proto3" json:"number,omitempty"`
915+ // Mergeability is the new result.
916+ Mergeability *Mergeability `protobuf:"bytes,3,opt,name=mergeability,proto3" json:"mergeability,omitempty"`
917+ unknownFields protoimpl.UnknownFields
918+ sizeCache protoimpl.SizeCache
919+}
920+
921+func (x *MergeRequestMergeability) Reset() {
922+ *x = MergeRequestMergeability{}
923+ mi := &file_ermite_event_proto_msgTypes[10]
924+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
925+ ms.StoreMessageInfo(mi)
926+}
927+
928+func (x *MergeRequestMergeability) String() string {
929+ return protoimpl.X.MessageStringOf(x)
930+}
931+
932+func (*MergeRequestMergeability) ProtoMessage() {}
933+
934+func (x *MergeRequestMergeability) ProtoReflect() protoreflect.Message {
935+ mi := &file_ermite_event_proto_msgTypes[10]
936+ if x != nil {
937+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
938+ if ms.LoadMessageInfo() == nil {
939+ ms.StoreMessageInfo(mi)
940+ }
941+ return ms
942+ }
943+ return mi.MessageOf(x)
944+}
945+
946+// Deprecated: Use MergeRequestMergeability.ProtoReflect.Descriptor instead.
947+func (*MergeRequestMergeability) Descriptor() ([]byte, []int) {
948+ return file_ermite_event_proto_rawDescGZIP(), []int{10}
949+}
950+
951+func (x *MergeRequestMergeability) GetRepo() string {
952+ if x != nil {
953+ return x.Repo
954+ }
955+ return ""
956+}
957+
958+func (x *MergeRequestMergeability) GetNumber() int64 {
959+ if x != nil {
960+ return x.Number
961+ }
962+ return 0
963+}
964+
965+func (x *MergeRequestMergeability) GetMergeability() *Mergeability {
966+ if x != nil {
967+ return x.Mergeability
968+ }
969+ return nil
970+}
971+
888972 // MergeRequestClosed reports a merge request closed without merging.
889973 type MergeRequestClosed struct {
890974 state protoimpl.MessageState `protogen:"open.v1"`
@@ -896,7 +980,7 @@ type MergeRequestClosed struct {
896980
897981 func (x *MergeRequestClosed) Reset() {
898982 *x = MergeRequestClosed{}
899- mi := &file_ermite_event_proto_msgTypes[10]
983+ mi := &file_ermite_event_proto_msgTypes[11]
900984 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
901985 ms.StoreMessageInfo(mi)
902986 }
@@ -908,7 +992,7 @@ func (x *MergeRequestClosed) String() string {
908992 func (*MergeRequestClosed) ProtoMessage() {}
909993
910994 func (x *MergeRequestClosed) ProtoReflect() protoreflect.Message {
911- mi := &file_ermite_event_proto_msgTypes[10]
995+ mi := &file_ermite_event_proto_msgTypes[11]
912996 if x != nil {
913997 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
914998 if ms.LoadMessageInfo() == nil {
@@ -921,7 +1005,7 @@ func (x *MergeRequestClosed) ProtoReflect() protoreflect.Message {
9211005
9221006 // Deprecated: Use MergeRequestClosed.ProtoReflect.Descriptor instead.
9231007 func (*MergeRequestClosed) Descriptor() ([]byte, []int) {
924- return file_ermite_event_proto_rawDescGZIP(), []int{10}
1008+ return file_ermite_event_proto_rawDescGZIP(), []int{11}
9251009 }
9261010
9271011 func (x *MergeRequestClosed) GetMergeRequest() *MergeRequest {
@@ -946,7 +1030,7 @@ type CommentAdded struct {
9461030
9471031 func (x *CommentAdded) Reset() {
9481032 *x = CommentAdded{}
949- mi := &file_ermite_event_proto_msgTypes[11]
1033+ mi := &file_ermite_event_proto_msgTypes[12]
9501034 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
9511035 ms.StoreMessageInfo(mi)
9521036 }
@@ -958,7 +1042,7 @@ func (x *CommentAdded) String() string {
9581042 func (*CommentAdded) ProtoMessage() {}
9591043
9601044 func (x *CommentAdded) ProtoReflect() protoreflect.Message {
961- mi := &file_ermite_event_proto_msgTypes[11]
1045+ mi := &file_ermite_event_proto_msgTypes[12]
9621046 if x != nil {
9631047 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
9641048 if ms.LoadMessageInfo() == nil {
@@ -971,7 +1055,7 @@ func (x *CommentAdded) ProtoReflect() protoreflect.Message {
9711055
9721056 // Deprecated: Use CommentAdded.ProtoReflect.Descriptor instead.
9731057 func (*CommentAdded) Descriptor() ([]byte, []int) {
974- return file_ermite_event_proto_rawDescGZIP(), []int{11}
1058+ return file_ermite_event_proto_rawDescGZIP(), []int{12}
9751059 }
9761060
9771061 func (x *CommentAdded) GetRepo() string {
@@ -1010,7 +1094,7 @@ type CommentEdited struct {
10101094
10111095 func (x *CommentEdited) Reset() {
10121096 *x = CommentEdited{}
1013- mi := &file_ermite_event_proto_msgTypes[12]
1097+ mi := &file_ermite_event_proto_msgTypes[13]
10141098 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
10151099 ms.StoreMessageInfo(mi)
10161100 }
@@ -1022,7 +1106,7 @@ func (x *CommentEdited) String() string {
10221106 func (*CommentEdited) ProtoMessage() {}
10231107
10241108 func (x *CommentEdited) ProtoReflect() protoreflect.Message {
1025- mi := &file_ermite_event_proto_msgTypes[12]
1109+ mi := &file_ermite_event_proto_msgTypes[13]
10261110 if x != nil {
10271111 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
10281112 if ms.LoadMessageInfo() == nil {
@@ -1035,7 +1119,7 @@ func (x *CommentEdited) ProtoReflect() protoreflect.Message {
10351119
10361120 // Deprecated: Use CommentEdited.ProtoReflect.Descriptor instead.
10371121 func (*CommentEdited) Descriptor() ([]byte, []int) {
1038- return file_ermite_event_proto_rawDescGZIP(), []int{12}
1122+ return file_ermite_event_proto_rawDescGZIP(), []int{13}
10391123 }
10401124
10411125 func (x *CommentEdited) GetRepo() string {
@@ -1075,7 +1159,7 @@ type CommentDeleted struct {
10751159
10761160 func (x *CommentDeleted) Reset() {
10771161 *x = CommentDeleted{}
1078- mi := &file_ermite_event_proto_msgTypes[13]
1162+ mi := &file_ermite_event_proto_msgTypes[14]
10791163 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
10801164 ms.StoreMessageInfo(mi)
10811165 }
@@ -1087,7 +1171,7 @@ func (x *CommentDeleted) String() string {
10871171 func (*CommentDeleted) ProtoMessage() {}
10881172
10891173 func (x *CommentDeleted) ProtoReflect() protoreflect.Message {
1090- mi := &file_ermite_event_proto_msgTypes[13]
1174+ mi := &file_ermite_event_proto_msgTypes[14]
10911175 if x != nil {
10921176 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
10931177 if ms.LoadMessageInfo() == nil {
@@ -1100,7 +1184,7 @@ func (x *CommentDeleted) ProtoReflect() protoreflect.Message {
11001184
11011185 // Deprecated: Use CommentDeleted.ProtoReflect.Descriptor instead.
11021186 func (*CommentDeleted) Descriptor() ([]byte, []int) {
1103- return file_ermite_event_proto_rawDescGZIP(), []int{13}
1187+ return file_ermite_event_proto_rawDescGZIP(), []int{14}
11041188 }
11051189
11061190 func (x *CommentDeleted) GetRepo() string {
@@ -1140,7 +1224,7 @@ type CommentResolved struct {
11401224
11411225 func (x *CommentResolved) Reset() {
11421226 *x = CommentResolved{}
1143- mi := &file_ermite_event_proto_msgTypes[14]
1227+ mi := &file_ermite_event_proto_msgTypes[15]
11441228 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
11451229 ms.StoreMessageInfo(mi)
11461230 }
@@ -1152,7 +1236,7 @@ func (x *CommentResolved) String() string {
11521236 func (*CommentResolved) ProtoMessage() {}
11531237
11541238 func (x *CommentResolved) ProtoReflect() protoreflect.Message {
1155- mi := &file_ermite_event_proto_msgTypes[14]
1239+ mi := &file_ermite_event_proto_msgTypes[15]
11561240 if x != nil {
11571241 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
11581242 if ms.LoadMessageInfo() == nil {
@@ -1165,7 +1249,7 @@ func (x *CommentResolved) ProtoReflect() protoreflect.Message {
11651249
11661250 // Deprecated: Use CommentResolved.ProtoReflect.Descriptor instead.
11671251 func (*CommentResolved) Descriptor() ([]byte, []int) {
1168- return file_ermite_event_proto_rawDescGZIP(), []int{14}
1252+ return file_ermite_event_proto_rawDescGZIP(), []int{15}
11691253 }
11701254
11711255 func (x *CommentResolved) GetRepo() string {
@@ -1200,7 +1284,7 @@ type IssueOpened struct {
12001284
12011285 func (x *IssueOpened) Reset() {
12021286 *x = IssueOpened{}
1203- mi := &file_ermite_event_proto_msgTypes[15]
1287+ mi := &file_ermite_event_proto_msgTypes[16]
12041288 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
12051289 ms.StoreMessageInfo(mi)
12061290 }
@@ -1212,7 +1296,7 @@ func (x *IssueOpened) String() string {
12121296 func (*IssueOpened) ProtoMessage() {}
12131297
12141298 func (x *IssueOpened) ProtoReflect() protoreflect.Message {
1215- mi := &file_ermite_event_proto_msgTypes[15]
1299+ mi := &file_ermite_event_proto_msgTypes[16]
12161300 if x != nil {
12171301 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
12181302 if ms.LoadMessageInfo() == nil {
@@ -1225,7 +1309,7 @@ func (x *IssueOpened) ProtoReflect() protoreflect.Message {
12251309
12261310 // Deprecated: Use IssueOpened.ProtoReflect.Descriptor instead.
12271311 func (*IssueOpened) Descriptor() ([]byte, []int) {
1228- return file_ermite_event_proto_rawDescGZIP(), []int{15}
1312+ return file_ermite_event_proto_rawDescGZIP(), []int{16}
12291313 }
12301314
12311315 func (x *IssueOpened) GetIssue() *Issue {
@@ -1246,7 +1330,7 @@ type IssueClosed struct {
12461330
12471331 func (x *IssueClosed) Reset() {
12481332 *x = IssueClosed{}
1249- mi := &file_ermite_event_proto_msgTypes[16]
1333+ mi := &file_ermite_event_proto_msgTypes[17]
12501334 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
12511335 ms.StoreMessageInfo(mi)
12521336 }
@@ -1258,7 +1342,7 @@ func (x *IssueClosed) String() string {
12581342 func (*IssueClosed) ProtoMessage() {}
12591343
12601344 func (x *IssueClosed) ProtoReflect() protoreflect.Message {
1261- mi := &file_ermite_event_proto_msgTypes[16]
1345+ mi := &file_ermite_event_proto_msgTypes[17]
12621346 if x != nil {
12631347 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
12641348 if ms.LoadMessageInfo() == nil {
@@ -1271,7 +1355,7 @@ func (x *IssueClosed) ProtoReflect() protoreflect.Message {
12711355
12721356 // Deprecated: Use IssueClosed.ProtoReflect.Descriptor instead.
12731357 func (*IssueClosed) Descriptor() ([]byte, []int) {
1274- return file_ermite_event_proto_rawDescGZIP(), []int{16}
1358+ return file_ermite_event_proto_rawDescGZIP(), []int{17}
12751359 }
12761360
12771361 func (x *IssueClosed) GetIssue() *Issue {
@@ -1292,7 +1376,7 @@ type IssueReopened struct {
12921376
12931377 func (x *IssueReopened) Reset() {
12941378 *x = IssueReopened{}
1295- mi := &file_ermite_event_proto_msgTypes[17]
1379+ mi := &file_ermite_event_proto_msgTypes[18]
12961380 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
12971381 ms.StoreMessageInfo(mi)
12981382 }
@@ -1304,7 +1388,7 @@ func (x *IssueReopened) String() string {
13041388 func (*IssueReopened) ProtoMessage() {}
13051389
13061390 func (x *IssueReopened) ProtoReflect() protoreflect.Message {
1307- mi := &file_ermite_event_proto_msgTypes[17]
1391+ mi := &file_ermite_event_proto_msgTypes[18]
13081392 if x != nil {
13091393 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
13101394 if ms.LoadMessageInfo() == nil {
@@ -1317,7 +1401,7 @@ func (x *IssueReopened) ProtoReflect() protoreflect.Message {
13171401
13181402 // Deprecated: Use IssueReopened.ProtoReflect.Descriptor instead.
13191403 func (*IssueReopened) Descriptor() ([]byte, []int) {
1320- return file_ermite_event_proto_rawDescGZIP(), []int{17}
1404+ return file_ermite_event_proto_rawDescGZIP(), []int{18}
13211405 }
13221406
13231407 func (x *IssueReopened) GetIssue() *Issue {
@@ -1342,7 +1426,7 @@ type IssueCommented struct {
13421426
13431427 func (x *IssueCommented) Reset() {
13441428 *x = IssueCommented{}
1345- mi := &file_ermite_event_proto_msgTypes[18]
1429+ mi := &file_ermite_event_proto_msgTypes[19]
13461430 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
13471431 ms.StoreMessageInfo(mi)
13481432 }
@@ -1354,7 +1438,7 @@ func (x *IssueCommented) String() string {
13541438 func (*IssueCommented) ProtoMessage() {}
13551439
13561440 func (x *IssueCommented) ProtoReflect() protoreflect.Message {
1357- mi := &file_ermite_event_proto_msgTypes[18]
1441+ mi := &file_ermite_event_proto_msgTypes[19]
13581442 if x != nil {
13591443 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
13601444 if ms.LoadMessageInfo() == nil {
@@ -1367,7 +1451,7 @@ func (x *IssueCommented) ProtoReflect() protoreflect.Message {
13671451
13681452 // Deprecated: Use IssueCommented.ProtoReflect.Descriptor instead.
13691453 func (*IssueCommented) Descriptor() ([]byte, []int) {
1370- return file_ermite_event_proto_rawDescGZIP(), []int{18}
1454+ return file_ermite_event_proto_rawDescGZIP(), []int{19}
13711455 }
13721456
13731457 func (x *IssueCommented) GetRepo() string {
@@ -1406,7 +1490,7 @@ type IssueSubmitted struct {
14061490
14071491 func (x *IssueSubmitted) Reset() {
14081492 *x = IssueSubmitted{}
1409- mi := &file_ermite_event_proto_msgTypes[19]
1493+ mi := &file_ermite_event_proto_msgTypes[20]
14101494 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
14111495 ms.StoreMessageInfo(mi)
14121496 }
@@ -1418,7 +1502,7 @@ func (x *IssueSubmitted) String() string {
14181502 func (*IssueSubmitted) ProtoMessage() {}
14191503
14201504 func (x *IssueSubmitted) ProtoReflect() protoreflect.Message {
1421- mi := &file_ermite_event_proto_msgTypes[19]
1505+ mi := &file_ermite_event_proto_msgTypes[20]
14221506 if x != nil {
14231507 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
14241508 if ms.LoadMessageInfo() == nil {
@@ -1431,7 +1515,7 @@ func (x *IssueSubmitted) ProtoReflect() protoreflect.Message {
14311515
14321516 // Deprecated: Use IssueSubmitted.ProtoReflect.Descriptor instead.
14331517 func (*IssueSubmitted) Descriptor() ([]byte, []int) {
1434- return file_ermite_event_proto_rawDescGZIP(), []int{19}
1518+ return file_ermite_event_proto_rawDescGZIP(), []int{20}
14351519 }
14361520
14371521 func (x *IssueSubmitted) GetRepo() string {
@@ -1461,7 +1545,7 @@ type Gap struct {
14611545
14621546 func (x *Gap) Reset() {
14631547 *x = Gap{}
1464- mi := &file_ermite_event_proto_msgTypes[20]
1548+ mi := &file_ermite_event_proto_msgTypes[21]
14651549 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
14661550 ms.StoreMessageInfo(mi)
14671551 }
@@ -1473,7 +1557,7 @@ func (x *Gap) String() string {
14731557 func (*Gap) ProtoMessage() {}
14741558
14751559 func (x *Gap) ProtoReflect() protoreflect.Message {
1476- mi := &file_ermite_event_proto_msgTypes[20]
1560+ mi := &file_ermite_event_proto_msgTypes[21]
14771561 if x != nil {
14781562 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
14791563 if ms.LoadMessageInfo() == nil {
@@ -1486,7 +1570,7 @@ func (x *Gap) ProtoReflect() protoreflect.Message {
14861570
14871571 // Deprecated: Use Gap.ProtoReflect.Descriptor instead.
14881572 func (*Gap) Descriptor() ([]byte, []int) {
1489- return file_ermite_event_proto_rawDescGZIP(), []int{20}
1573+ return file_ermite_event_proto_rawDescGZIP(), []int{21}
14901574 }
14911575
14921576 // RunUpdated reports a CI run that was created or whose status, conclusion or
@@ -1501,7 +1585,7 @@ type RunUpdated struct {
15011585
15021586 func (x *RunUpdated) Reset() {
15031587 *x = RunUpdated{}
1504- mi := &file_ermite_event_proto_msgTypes[21]
1588+ mi := &file_ermite_event_proto_msgTypes[22]
15051589 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
15061590 ms.StoreMessageInfo(mi)
15071591 }
@@ -1513,7 +1597,7 @@ func (x *RunUpdated) String() string {
15131597 func (*RunUpdated) ProtoMessage() {}
15141598
15151599 func (x *RunUpdated) ProtoReflect() protoreflect.Message {
1516- mi := &file_ermite_event_proto_msgTypes[21]
1600+ mi := &file_ermite_event_proto_msgTypes[22]
15171601 if x != nil {
15181602 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
15191603 if ms.LoadMessageInfo() == nil {
@@ -1526,7 +1610,7 @@ func (x *RunUpdated) ProtoReflect() protoreflect.Message {
15261610
15271611 // Deprecated: Use RunUpdated.ProtoReflect.Descriptor instead.
15281612 func (*RunUpdated) Descriptor() ([]byte, []int) {
1529- return file_ermite_event_proto_rawDescGZIP(), []int{21}
1613+ return file_ermite_event_proto_rawDescGZIP(), []int{22}
15301614 }
15311615
15321616 func (x *RunUpdated) GetRun() *Run {
@@ -1548,7 +1632,7 @@ type JobUpdated struct {
15481632
15491633 func (x *JobUpdated) Reset() {
15501634 *x = JobUpdated{}
1551- mi := &file_ermite_event_proto_msgTypes[22]
1635+ mi := &file_ermite_event_proto_msgTypes[23]
15521636 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
15531637 ms.StoreMessageInfo(mi)
15541638 }
@@ -1560,7 +1644,7 @@ func (x *JobUpdated) String() string {
15601644 func (*JobUpdated) ProtoMessage() {}
15611645
15621646 func (x *JobUpdated) ProtoReflect() protoreflect.Message {
1563- mi := &file_ermite_event_proto_msgTypes[22]
1647+ mi := &file_ermite_event_proto_msgTypes[23]
15641648 if x != nil {
15651649 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
15661650 if ms.LoadMessageInfo() == nil {
@@ -1573,7 +1657,7 @@ func (x *JobUpdated) ProtoReflect() protoreflect.Message {
15731657
15741658 // Deprecated: Use JobUpdated.ProtoReflect.Descriptor instead.
15751659 func (*JobUpdated) Descriptor() ([]byte, []int) {
1576- return file_ermite_event_proto_rawDescGZIP(), []int{22}
1660+ return file_ermite_event_proto_rawDescGZIP(), []int{23}
15771661 }
15781662
15791663 func (x *JobUpdated) GetJob() *RunJob {
@@ -1592,7 +1676,8 @@ const file_ermite_event_proto_rawDesc = "" +
15921676 "\x06topics\x18\x01 \x03(\tR\x06topics\x12!\n" +
15931677 "\fresume_after\x18\x02 \x01(\tR\vresumeAfter\"4\n" +
15941678 "\rWatchResponse\x12#\n" +
1595- "\x05event\x18\x01 \x01(\v2\r.ermite.EventR\x05event\"\xe6\t\n" +
1679+ "\x05event\x18\x01 \x01(\v2\r.ermite.EventR\x05event\"\xc8\n" +
1680+ "\n" +
15961681 "\x05Event\x12\x0e\n" +
15971682 "\x02id\x18\x01 \x01(\tR\x02id\x12.\n" +
15981683 "\x04time\x18\x02 \x01(\v2\x1a.google.protobuf.TimestampR\x04time\x128\n" +
@@ -1617,7 +1702,8 @@ const file_ermite_event_proto_rawDesc = "" +
16171702 "\fissue_closed\x18\x12 \x01(\v2\x13.ermite.IssueClosedH\x00R\vissueClosed\x12>\n" +
16181703 "\x0eissue_reopened\x18\x13 \x01(\v2\x15.ermite.IssueReopenedH\x00R\rissueReopened\x12A\n" +
16191704 "\x0fissue_commented\x18\x14 \x01(\v2\x16.ermite.IssueCommentedH\x00R\x0eissueCommented\x12A\n" +
1620- "\x0fissue_submitted\x18\x15 \x01(\v2\x16.ermite.IssueSubmittedH\x00R\x0eissueSubmittedB\x06\n" +
1705+ "\x0fissue_submitted\x18\x15 \x01(\v2\x16.ermite.IssueSubmittedH\x00R\x0eissueSubmitted\x12`\n" +
1706+ "\x1amerge_request_mergeability\x18\x16 \x01(\v2 .ermite.MergeRequestMergeabilityH\x00R\x18mergeRequestMergeabilityB\x06\n" +
16211707 "\x04kind\"/\n" +
16221708 "\vRepoCreated\x12 \n" +
16231709 "\x04repo\x18\x01 \x01(\v2\f.ermite.RepoR\x04repo\"/\n" +
@@ -1636,7 +1722,11 @@ const file_ermite_event_proto_rawDesc = "" +
16361722 "\x12MergeRequestOpened\x129\n" +
16371723 "\rmerge_request\x18\x01 \x01(\v2\x14.ermite.MergeRequestR\fmergeRequest\"O\n" +
16381724 "\x12MergeRequestMerged\x129\n" +
1639- "\rmerge_request\x18\x01 \x01(\v2\x14.ermite.MergeRequestR\fmergeRequest\"O\n" +
1725+ "\rmerge_request\x18\x01 \x01(\v2\x14.ermite.MergeRequestR\fmergeRequest\"\x80\x01\n" +
1726+ "\x18MergeRequestMergeability\x12\x12\n" +
1727+ "\x04repo\x18\x01 \x01(\tR\x04repo\x12\x16\n" +
1728+ "\x06number\x18\x02 \x01(\x03R\x06number\x128\n" +
1729+ "\fmergeability\x18\x03 \x01(\v2\x14.ermite.MergeabilityR\fmergeability\"O\n" +
16401730 "\x12MergeRequestClosed\x129\n" +
16411731 "\rmerge_request\x18\x01 \x01(\v2\x14.ermite.MergeRequestR\fmergeRequest\"e\n" +
16421732 "\fCommentAdded\x12\x12\n" +
@@ -1693,85 +1783,89 @@ func file_ermite_event_proto_rawDescGZIP() []byte {
16931783 return file_ermite_event_proto_rawDescData
16941784 }
16951785
1696-var file_ermite_event_proto_msgTypes = make([]protoimpl.MessageInfo, 23)
1786+var file_ermite_event_proto_msgTypes = make([]protoimpl.MessageInfo, 24)
16971787 var file_ermite_event_proto_goTypes = []any{
1698- (*WatchRequest)(nil), // 0: ermite.WatchRequest
1699- (*WatchResponse)(nil), // 1: ermite.WatchResponse
1700- (*Event)(nil), // 2: ermite.Event
1701- (*RepoCreated)(nil), // 3: ermite.RepoCreated
1702- (*RepoUpdated)(nil), // 4: ermite.RepoUpdated
1703- (*RepoDeleted)(nil), // 5: ermite.RepoDeleted
1704- (*Pushed)(nil), // 6: ermite.Pushed
1705- (*RefUpdate)(nil), // 7: ermite.RefUpdate
1706- (*MergeRequestOpened)(nil), // 8: ermite.MergeRequestOpened
1707- (*MergeRequestMerged)(nil), // 9: ermite.MergeRequestMerged
1708- (*MergeRequestClosed)(nil), // 10: ermite.MergeRequestClosed
1709- (*CommentAdded)(nil), // 11: ermite.CommentAdded
1710- (*CommentEdited)(nil), // 12: ermite.CommentEdited
1711- (*CommentDeleted)(nil), // 13: ermite.CommentDeleted
1712- (*CommentResolved)(nil), // 14: ermite.CommentResolved
1713- (*IssueOpened)(nil), // 15: ermite.IssueOpened
1714- (*IssueClosed)(nil), // 16: ermite.IssueClosed
1715- (*IssueReopened)(nil), // 17: ermite.IssueReopened
1716- (*IssueCommented)(nil), // 18: ermite.IssueCommented
1717- (*IssueSubmitted)(nil), // 19: ermite.IssueSubmitted
1718- (*Gap)(nil), // 20: ermite.Gap
1719- (*RunUpdated)(nil), // 21: ermite.RunUpdated
1720- (*JobUpdated)(nil), // 22: ermite.JobUpdated
1721- (*timestamppb.Timestamp)(nil), // 23: google.protobuf.Timestamp
1722- (*Repo)(nil), // 24: ermite.Repo
1723- (*MergeRequest)(nil), // 25: ermite.MergeRequest
1724- (*Comment)(nil), // 26: ermite.Comment
1725- (*Issue)(nil), // 27: ermite.Issue
1726- (*IssueComment)(nil), // 28: ermite.IssueComment
1727- (*Run)(nil), // 29: ermite.Run
1728- (*RunJob)(nil), // 30: ermite.RunJob
1788+ (*WatchRequest)(nil), // 0: ermite.WatchRequest
1789+ (*WatchResponse)(nil), // 1: ermite.WatchResponse
1790+ (*Event)(nil), // 2: ermite.Event
1791+ (*RepoCreated)(nil), // 3: ermite.RepoCreated
1792+ (*RepoUpdated)(nil), // 4: ermite.RepoUpdated
1793+ (*RepoDeleted)(nil), // 5: ermite.RepoDeleted
1794+ (*Pushed)(nil), // 6: ermite.Pushed
1795+ (*RefUpdate)(nil), // 7: ermite.RefUpdate
1796+ (*MergeRequestOpened)(nil), // 8: ermite.MergeRequestOpened
1797+ (*MergeRequestMerged)(nil), // 9: ermite.MergeRequestMerged
1798+ (*MergeRequestMergeability)(nil), // 10: ermite.MergeRequestMergeability
1799+ (*MergeRequestClosed)(nil), // 11: ermite.MergeRequestClosed
1800+ (*CommentAdded)(nil), // 12: ermite.CommentAdded
1801+ (*CommentEdited)(nil), // 13: ermite.CommentEdited
1802+ (*CommentDeleted)(nil), // 14: ermite.CommentDeleted
1803+ (*CommentResolved)(nil), // 15: ermite.CommentResolved
1804+ (*IssueOpened)(nil), // 16: ermite.IssueOpened
1805+ (*IssueClosed)(nil), // 17: ermite.IssueClosed
1806+ (*IssueReopened)(nil), // 18: ermite.IssueReopened
1807+ (*IssueCommented)(nil), // 19: ermite.IssueCommented
1808+ (*IssueSubmitted)(nil), // 20: ermite.IssueSubmitted
1809+ (*Gap)(nil), // 21: ermite.Gap
1810+ (*RunUpdated)(nil), // 22: ermite.RunUpdated
1811+ (*JobUpdated)(nil), // 23: ermite.JobUpdated
1812+ (*timestamppb.Timestamp)(nil), // 24: google.protobuf.Timestamp
1813+ (*Repo)(nil), // 25: ermite.Repo
1814+ (*MergeRequest)(nil), // 26: ermite.MergeRequest
1815+ (*Mergeability)(nil), // 27: ermite.Mergeability
1816+ (*Comment)(nil), // 28: ermite.Comment
1817+ (*Issue)(nil), // 29: ermite.Issue
1818+ (*IssueComment)(nil), // 30: ermite.IssueComment
1819+ (*Run)(nil), // 31: ermite.Run
1820+ (*RunJob)(nil), // 32: ermite.RunJob
17291821 }
17301822 var file_ermite_event_proto_depIdxs = []int32{
17311823 2, // 0: ermite.WatchResponse.event:type_name -> ermite.Event
1732- 23, // 1: ermite.Event.time:type_name -> google.protobuf.Timestamp
1824+ 24, // 1: ermite.Event.time:type_name -> google.protobuf.Timestamp
17331825 3, // 2: ermite.Event.repo_created:type_name -> ermite.RepoCreated
17341826 4, // 3: ermite.Event.repo_updated:type_name -> ermite.RepoUpdated
17351827 5, // 4: ermite.Event.repo_deleted:type_name -> ermite.RepoDeleted
17361828 6, // 5: ermite.Event.pushed:type_name -> ermite.Pushed
1737- 20, // 6: ermite.Event.gap:type_name -> ermite.Gap
1829+ 21, // 6: ermite.Event.gap:type_name -> ermite.Gap
17381830 8, // 7: ermite.Event.merge_request_opened:type_name -> ermite.MergeRequestOpened
17391831 9, // 8: ermite.Event.merge_request_merged:type_name -> ermite.MergeRequestMerged
1740- 10, // 9: ermite.Event.merge_request_closed:type_name -> ermite.MergeRequestClosed
1741- 11, // 10: ermite.Event.comment_added:type_name -> ermite.CommentAdded
1742- 21, // 11: ermite.Event.run_updated:type_name -> ermite.RunUpdated
1743- 22, // 12: ermite.Event.job_updated:type_name -> ermite.JobUpdated
1744- 12, // 13: ermite.Event.comment_edited:type_name -> ermite.CommentEdited
1745- 13, // 14: ermite.Event.comment_deleted:type_name -> ermite.CommentDeleted
1746- 14, // 15: ermite.Event.comment_resolved:type_name -> ermite.CommentResolved
1747- 15, // 16: ermite.Event.issue_opened:type_name -> ermite.IssueOpened
1748- 16, // 17: ermite.Event.issue_closed:type_name -> ermite.IssueClosed
1749- 17, // 18: ermite.Event.issue_reopened:type_name -> ermite.IssueReopened
1750- 18, // 19: ermite.Event.issue_commented:type_name -> ermite.IssueCommented
1751- 19, // 20: ermite.Event.issue_submitted:type_name -> ermite.IssueSubmitted
1752- 24, // 21: ermite.RepoCreated.repo:type_name -> ermite.Repo
1753- 24, // 22: ermite.RepoUpdated.repo:type_name -> ermite.Repo
1754- 7, // 23: ermite.Pushed.ref_updates:type_name -> ermite.RefUpdate
1755- 25, // 24: ermite.MergeRequestOpened.merge_request:type_name -> ermite.MergeRequest
1756- 25, // 25: ermite.MergeRequestMerged.merge_request:type_name -> ermite.MergeRequest
1757- 25, // 26: ermite.MergeRequestClosed.merge_request:type_name -> ermite.MergeRequest
1758- 26, // 27: ermite.CommentAdded.comment:type_name -> ermite.Comment
1759- 26, // 28: ermite.CommentEdited.comment:type_name -> ermite.Comment
1760- 26, // 29: ermite.CommentDeleted.comment:type_name -> ermite.Comment
1761- 26, // 30: ermite.CommentResolved.comment:type_name -> ermite.Comment
1762- 27, // 31: ermite.IssueOpened.issue:type_name -> ermite.Issue
1763- 27, // 32: ermite.IssueClosed.issue:type_name -> ermite.Issue
1764- 27, // 33: ermite.IssueReopened.issue:type_name -> ermite.Issue
1765- 28, // 34: ermite.IssueCommented.comment:type_name -> ermite.IssueComment
1766- 29, // 35: ermite.RunUpdated.run:type_name -> ermite.Run
1767- 30, // 36: ermite.JobUpdated.job:type_name -> ermite.RunJob
1768- 0, // 37: ermite.EventService.Watch:input_type -> ermite.WatchRequest
1769- 1, // 38: ermite.EventService.Watch:output_type -> ermite.WatchResponse
1770- 38, // [38:39] is the sub-list for method output_type
1771- 37, // [37:38] is the sub-list for method input_type
1772- 37, // [37:37] is the sub-list for extension type_name
1773- 37, // [37:37] is the sub-list for extension extendee
1774- 0, // [0:37] is the sub-list for field type_name
1832+ 11, // 9: ermite.Event.merge_request_closed:type_name -> ermite.MergeRequestClosed
1833+ 12, // 10: ermite.Event.comment_added:type_name -> ermite.CommentAdded
1834+ 22, // 11: ermite.Event.run_updated:type_name -> ermite.RunUpdated
1835+ 23, // 12: ermite.Event.job_updated:type_name -> ermite.JobUpdated
1836+ 13, // 13: ermite.Event.comment_edited:type_name -> ermite.CommentEdited
1837+ 14, // 14: ermite.Event.comment_deleted:type_name -> ermite.CommentDeleted
1838+ 15, // 15: ermite.Event.comment_resolved:type_name -> ermite.CommentResolved
1839+ 16, // 16: ermite.Event.issue_opened:type_name -> ermite.IssueOpened
1840+ 17, // 17: ermite.Event.issue_closed:type_name -> ermite.IssueClosed
1841+ 18, // 18: ermite.Event.issue_reopened:type_name -> ermite.IssueReopened
1842+ 19, // 19: ermite.Event.issue_commented:type_name -> ermite.IssueCommented
1843+ 20, // 20: ermite.Event.issue_submitted:type_name -> ermite.IssueSubmitted
1844+ 10, // 21: ermite.Event.merge_request_mergeability:type_name -> ermite.MergeRequestMergeability
1845+ 25, // 22: ermite.RepoCreated.repo:type_name -> ermite.Repo
1846+ 25, // 23: ermite.RepoUpdated.repo:type_name -> ermite.Repo
1847+ 7, // 24: ermite.Pushed.ref_updates:type_name -> ermite.RefUpdate
1848+ 26, // 25: ermite.MergeRequestOpened.merge_request:type_name -> ermite.MergeRequest
1849+ 26, // 26: ermite.MergeRequestMerged.merge_request:type_name -> ermite.MergeRequest
1850+ 27, // 27: ermite.MergeRequestMergeability.mergeability:type_name -> ermite.Mergeability
1851+ 26, // 28: ermite.MergeRequestClosed.merge_request:type_name -> ermite.MergeRequest
1852+ 28, // 29: ermite.CommentAdded.comment:type_name -> ermite.Comment
1853+ 28, // 30: ermite.CommentEdited.comment:type_name -> ermite.Comment
1854+ 28, // 31: ermite.CommentDeleted.comment:type_name -> ermite.Comment
1855+ 28, // 32: ermite.CommentResolved.comment:type_name -> ermite.Comment
1856+ 29, // 33: ermite.IssueOpened.issue:type_name -> ermite.Issue
1857+ 29, // 34: ermite.IssueClosed.issue:type_name -> ermite.Issue
1858+ 29, // 35: ermite.IssueReopened.issue:type_name -> ermite.Issue
1859+ 30, // 36: ermite.IssueCommented.comment:type_name -> ermite.IssueComment
1860+ 31, // 37: ermite.RunUpdated.run:type_name -> ermite.Run
1861+ 32, // 38: ermite.JobUpdated.job:type_name -> ermite.RunJob
1862+ 0, // 39: ermite.EventService.Watch:input_type -> ermite.WatchRequest
1863+ 1, // 40: ermite.EventService.Watch:output_type -> ermite.WatchResponse
1864+ 40, // [40:41] is the sub-list for method output_type
1865+ 39, // [39:40] is the sub-list for method input_type
1866+ 39, // [39:39] is the sub-list for extension type_name
1867+ 39, // [39:39] is the sub-list for extension extendee
1868+ 0, // [0:39] is the sub-list for field type_name
17751869 }
17761870
17771871 func init() { file_ermite_event_proto_init() }
@@ -1803,6 +1897,7 @@ func file_ermite_event_proto_init() {
18031897 (*Event_IssueReopened)(nil),
18041898 (*Event_IssueCommented)(nil),
18051899 (*Event_IssueSubmitted)(nil),
1900+ (*Event_MergeRequestMergeability)(nil),
18061901 }
18071902 type x struct{}
18081903 out := protoimpl.TypeBuilder{
@@ -1810,7 +1905,7 @@ func file_ermite_event_proto_init() {
18101905 GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
18111906 RawDescriptor: unsafe.Slice(unsafe.StringData(file_ermite_event_proto_rawDesc), len(file_ermite_event_proto_rawDesc)),
18121907 NumEnums: 0,
1813- NumMessages: 23,
1908+ NumMessages: 24,
18141909 NumExtensions: 0,
18151910 NumServices: 1,
18161911 },
@@ -170,6 +170,7 @@ type Event struct {
170 // *Event_IssueReopened170 // *Event_IssueReopened
171 // *Event_IssueCommented171 // *Event_IssueCommented
172 // *Event_IssueSubmitted172 // *Event_IssueSubmitted
173+ // *Event_MergeRequestMergeability
173 Kind isEvent_Kind `protobuf_oneof:"kind"`174 Kind isEvent_Kind `protobuf_oneof:"kind"`
174 unknownFields protoimpl.UnknownFields175 unknownFields protoimpl.UnknownFields
175 sizeCache protoimpl.SizeCache176 sizeCache protoimpl.SizeCache
@@ -397,6 +398,15 @@ func (x *Event) GetIssueSubmitted() *IssueSubmitted {
397 return nil398 return nil
398 }399 }
399 400
401+func (x *Event) GetMergeRequestMergeability() *MergeRequestMergeability {
402+ if x != nil {
403+ if x, ok := x.Kind.(*Event_MergeRequestMergeability); ok {
404+ return x.MergeRequestMergeability
405+ }
406+ }
407+ return nil
408+}
409+
400 type isEvent_Kind interface {410 type isEvent_Kind interface {
401 isEvent_Kind()411 isEvent_Kind()
402 }412 }
@@ -497,6 +507,12 @@ type Event_IssueSubmitted struct {
497 IssueSubmitted *IssueSubmitted `protobuf:"bytes,21,opt,name=issue_submitted,json=issueSubmitted,proto3,oneof"`507 IssueSubmitted *IssueSubmitted `protobuf:"bytes,21,opt,name=issue_submitted,json=issueSubmitted,proto3,oneof"`
498 }508 }
499 509
510+type Event_MergeRequestMergeability struct {
511+ // MergeRequestMergeability: the mergeability of an open merge request
512+ // changed.
513+ MergeRequestMergeability *MergeRequestMergeability `protobuf:"bytes,22,opt,name=merge_request_mergeability,json=mergeRequestMergeability,proto3,oneof"`
514+}
515+
500 func (*Event_RepoCreated) isEvent_Kind() {}516 func (*Event_RepoCreated) isEvent_Kind() {}
501 517
502 func (*Event_RepoUpdated) isEvent_Kind() {}518 func (*Event_RepoUpdated) isEvent_Kind() {}
@@ -535,6 +551,8 @@ func (*Event_IssueCommented) isEvent_Kind() {}
535 551
536 func (*Event_IssueSubmitted) isEvent_Kind() {}552 func (*Event_IssueSubmitted) isEvent_Kind() {}
537 553
554+func (*Event_MergeRequestMergeability) isEvent_Kind() {}
555+
538 // RepoCreated reports a new repository.556 // RepoCreated reports a new repository.
539 type RepoCreated struct {557 type RepoCreated struct {
540 state protoimpl.MessageState `protogen:"open.v1"`558 state protoimpl.MessageState `protogen:"open.v1"`
@@ -885,6 +903,72 @@ func (x *MergeRequestMerged) GetMergeRequest() *MergeRequest {
885 return nil903 return nil
886 }904 }
887 905
906+// MergeRequestMergeability reports the mergeability of an open merge request.
907+// It is published when the state changes, or when a check settles a result
908+// that readers had not seen yet (they saw CHECKING), not on every push.
909+type MergeRequestMergeability struct {
910+ state protoimpl.MessageState `protogen:"open.v1"`
911+ // Repo is the name of the repository.
912+ Repo string `protobuf:"bytes,1,opt,name=repo,proto3" json:"repo,omitempty"`
913+ // Number is the number of the merge request.
914+ Number int64 `protobuf:"varint,2,opt,name=number,proto3" json:"number,omitempty"`
915+ // Mergeability is the new result.
916+ Mergeability *Mergeability `protobuf:"bytes,3,opt,name=mergeability,proto3" json:"mergeability,omitempty"`
917+ unknownFields protoimpl.UnknownFields
918+ sizeCache protoimpl.SizeCache
919+}
920+
921+func (x *MergeRequestMergeability) Reset() {
922+ *x = MergeRequestMergeability{}
923+ mi := &file_ermite_event_proto_msgTypes[10]
924+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
925+ ms.StoreMessageInfo(mi)
926+}
927+
928+func (x *MergeRequestMergeability) String() string {
929+ return protoimpl.X.MessageStringOf(x)
930+}
931+
932+func (*MergeRequestMergeability) ProtoMessage() {}
933+
934+func (x *MergeRequestMergeability) ProtoReflect() protoreflect.Message {
935+ mi := &file_ermite_event_proto_msgTypes[10]
936+ if x != nil {
937+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
938+ if ms.LoadMessageInfo() == nil {
939+ ms.StoreMessageInfo(mi)
940+ }
941+ return ms
942+ }
943+ return mi.MessageOf(x)
944+}
945+
946+// Deprecated: Use MergeRequestMergeability.ProtoReflect.Descriptor instead.
947+func (*MergeRequestMergeability) Descriptor() ([]byte, []int) {
948+ return file_ermite_event_proto_rawDescGZIP(), []int{10}
949+}
950+
951+func (x *MergeRequestMergeability) GetRepo() string {
952+ if x != nil {
953+ return x.Repo
954+ }
955+ return ""
956+}
957+
958+func (x *MergeRequestMergeability) GetNumber() int64 {
959+ if x != nil {
960+ return x.Number
961+ }
962+ return 0
963+}
964+
965+func (x *MergeRequestMergeability) GetMergeability() *Mergeability {
966+ if x != nil {
967+ return x.Mergeability
968+ }
969+ return nil
970+}
971+
888 // MergeRequestClosed reports a merge request closed without merging.972 // MergeRequestClosed reports a merge request closed without merging.
889 type MergeRequestClosed struct {973 type MergeRequestClosed struct {
890 state protoimpl.MessageState `protogen:"open.v1"`974 state protoimpl.MessageState `protogen:"open.v1"`
@@ -896,7 +980,7 @@ type MergeRequestClosed struct {
896 980
897 func (x *MergeRequestClosed) Reset() {981 func (x *MergeRequestClosed) Reset() {
898 *x = MergeRequestClosed{}982 *x = MergeRequestClosed{}
899- mi := &file_ermite_event_proto_msgTypes[10]983+ mi := &file_ermite_event_proto_msgTypes[11]
900 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))984 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
901 ms.StoreMessageInfo(mi)985 ms.StoreMessageInfo(mi)
902 }986 }
@@ -908,7 +992,7 @@ func (x *MergeRequestClosed) String() string {
908 func (*MergeRequestClosed) ProtoMessage() {}992 func (*MergeRequestClosed) ProtoMessage() {}
909 993
910 func (x *MergeRequestClosed) ProtoReflect() protoreflect.Message {994 func (x *MergeRequestClosed) ProtoReflect() protoreflect.Message {
911- mi := &file_ermite_event_proto_msgTypes[10]995+ mi := &file_ermite_event_proto_msgTypes[11]
912 if x != nil {996 if x != nil {
913 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))997 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
914 if ms.LoadMessageInfo() == nil {998 if ms.LoadMessageInfo() == nil {
@@ -921,7 +1005,7 @@ func (x *MergeRequestClosed) ProtoReflect() protoreflect.Message {
921 1005
922 // Deprecated: Use MergeRequestClosed.ProtoReflect.Descriptor instead.1006 // Deprecated: Use MergeRequestClosed.ProtoReflect.Descriptor instead.
923 func (*MergeRequestClosed) Descriptor() ([]byte, []int) {1007 func (*MergeRequestClosed) Descriptor() ([]byte, []int) {
924- return file_ermite_event_proto_rawDescGZIP(), []int{10}1008+ return file_ermite_event_proto_rawDescGZIP(), []int{11}
925 }1009 }
926 1010
927 func (x *MergeRequestClosed) GetMergeRequest() *MergeRequest {1011 func (x *MergeRequestClosed) GetMergeRequest() *MergeRequest {
@@ -946,7 +1030,7 @@ type CommentAdded struct {
946 1030
947 func (x *CommentAdded) Reset() {1031 func (x *CommentAdded) Reset() {
948 *x = CommentAdded{}1032 *x = CommentAdded{}
949- mi := &file_ermite_event_proto_msgTypes[11]1033+ mi := &file_ermite_event_proto_msgTypes[12]
950 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))1034 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
951 ms.StoreMessageInfo(mi)1035 ms.StoreMessageInfo(mi)
952 }1036 }
@@ -958,7 +1042,7 @@ func (x *CommentAdded) String() string {
958 func (*CommentAdded) ProtoMessage() {}1042 func (*CommentAdded) ProtoMessage() {}
959 1043
960 func (x *CommentAdded) ProtoReflect() protoreflect.Message {1044 func (x *CommentAdded) ProtoReflect() protoreflect.Message {
961- mi := &file_ermite_event_proto_msgTypes[11]1045+ mi := &file_ermite_event_proto_msgTypes[12]
962 if x != nil {1046 if x != nil {
963 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))1047 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
964 if ms.LoadMessageInfo() == nil {1048 if ms.LoadMessageInfo() == nil {
@@ -971,7 +1055,7 @@ func (x *CommentAdded) ProtoReflect() protoreflect.Message {
971 1055
972 // Deprecated: Use CommentAdded.ProtoReflect.Descriptor instead.1056 // Deprecated: Use CommentAdded.ProtoReflect.Descriptor instead.
973 func (*CommentAdded) Descriptor() ([]byte, []int) {1057 func (*CommentAdded) Descriptor() ([]byte, []int) {
974- return file_ermite_event_proto_rawDescGZIP(), []int{11}1058+ return file_ermite_event_proto_rawDescGZIP(), []int{12}
975 }1059 }
976 1060
977 func (x *CommentAdded) GetRepo() string {1061 func (x *CommentAdded) GetRepo() string {
@@ -1010,7 +1094,7 @@ type CommentEdited struct {
1010 1094
1011 func (x *CommentEdited) Reset() {1095 func (x *CommentEdited) Reset() {
1012 *x = CommentEdited{}1096 *x = CommentEdited{}
1013- mi := &file_ermite_event_proto_msgTypes[12]1097+ mi := &file_ermite_event_proto_msgTypes[13]
1014 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))1098 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
1015 ms.StoreMessageInfo(mi)1099 ms.StoreMessageInfo(mi)
1016 }1100 }
@@ -1022,7 +1106,7 @@ func (x *CommentEdited) String() string {
1022 func (*CommentEdited) ProtoMessage() {}1106 func (*CommentEdited) ProtoMessage() {}
1023 1107
1024 func (x *CommentEdited) ProtoReflect() protoreflect.Message {1108 func (x *CommentEdited) ProtoReflect() protoreflect.Message {
1025- mi := &file_ermite_event_proto_msgTypes[12]1109+ mi := &file_ermite_event_proto_msgTypes[13]
1026 if x != nil {1110 if x != nil {
1027 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))1111 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
1028 if ms.LoadMessageInfo() == nil {1112 if ms.LoadMessageInfo() == nil {
@@ -1035,7 +1119,7 @@ func (x *CommentEdited) ProtoReflect() protoreflect.Message {
1035 1119
1036 // Deprecated: Use CommentEdited.ProtoReflect.Descriptor instead.1120 // Deprecated: Use CommentEdited.ProtoReflect.Descriptor instead.
1037 func (*CommentEdited) Descriptor() ([]byte, []int) {1121 func (*CommentEdited) Descriptor() ([]byte, []int) {
1038- return file_ermite_event_proto_rawDescGZIP(), []int{12}1122+ return file_ermite_event_proto_rawDescGZIP(), []int{13}
1039 }1123 }
1040 1124
1041 func (x *CommentEdited) GetRepo() string {1125 func (x *CommentEdited) GetRepo() string {
@@ -1075,7 +1159,7 @@ type CommentDeleted struct {
1075 1159
1076 func (x *CommentDeleted) Reset() {1160 func (x *CommentDeleted) Reset() {
1077 *x = CommentDeleted{}1161 *x = CommentDeleted{}
1078- mi := &file_ermite_event_proto_msgTypes[13]1162+ mi := &file_ermite_event_proto_msgTypes[14]
1079 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))1163 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
1080 ms.StoreMessageInfo(mi)1164 ms.StoreMessageInfo(mi)
1081 }1165 }
@@ -1087,7 +1171,7 @@ func (x *CommentDeleted) String() string {
1087 func (*CommentDeleted) ProtoMessage() {}1171 func (*CommentDeleted) ProtoMessage() {}
1088 1172
1089 func (x *CommentDeleted) ProtoReflect() protoreflect.Message {1173 func (x *CommentDeleted) ProtoReflect() protoreflect.Message {
1090- mi := &file_ermite_event_proto_msgTypes[13]1174+ mi := &file_ermite_event_proto_msgTypes[14]
1091 if x != nil {1175 if x != nil {
1092 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))1176 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
1093 if ms.LoadMessageInfo() == nil {1177 if ms.LoadMessageInfo() == nil {
@@ -1100,7 +1184,7 @@ func (x *CommentDeleted) ProtoReflect() protoreflect.Message {
1100 1184
1101 // Deprecated: Use CommentDeleted.ProtoReflect.Descriptor instead.1185 // Deprecated: Use CommentDeleted.ProtoReflect.Descriptor instead.
1102 func (*CommentDeleted) Descriptor() ([]byte, []int) {1186 func (*CommentDeleted) Descriptor() ([]byte, []int) {
1103- return file_ermite_event_proto_rawDescGZIP(), []int{13}1187+ return file_ermite_event_proto_rawDescGZIP(), []int{14}
1104 }1188 }
1105 1189
1106 func (x *CommentDeleted) GetRepo() string {1190 func (x *CommentDeleted) GetRepo() string {
@@ -1140,7 +1224,7 @@ type CommentResolved struct {
1140 1224
1141 func (x *CommentResolved) Reset() {1225 func (x *CommentResolved) Reset() {
1142 *x = CommentResolved{}1226 *x = CommentResolved{}
1143- mi := &file_ermite_event_proto_msgTypes[14]1227+ mi := &file_ermite_event_proto_msgTypes[15]
1144 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))1228 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
1145 ms.StoreMessageInfo(mi)1229 ms.StoreMessageInfo(mi)
1146 }1230 }
@@ -1152,7 +1236,7 @@ func (x *CommentResolved) String() string {
1152 func (*CommentResolved) ProtoMessage() {}1236 func (*CommentResolved) ProtoMessage() {}
1153 1237
1154 func (x *CommentResolved) ProtoReflect() protoreflect.Message {1238 func (x *CommentResolved) ProtoReflect() protoreflect.Message {
1155- mi := &file_ermite_event_proto_msgTypes[14]1239+ mi := &file_ermite_event_proto_msgTypes[15]
1156 if x != nil {1240 if x != nil {
1157 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))1241 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
1158 if ms.LoadMessageInfo() == nil {1242 if ms.LoadMessageInfo() == nil {
@@ -1165,7 +1249,7 @@ func (x *CommentResolved) ProtoReflect() protoreflect.Message {
1165 1249
1166 // Deprecated: Use CommentResolved.ProtoReflect.Descriptor instead.1250 // Deprecated: Use CommentResolved.ProtoReflect.Descriptor instead.
1167 func (*CommentResolved) Descriptor() ([]byte, []int) {1251 func (*CommentResolved) Descriptor() ([]byte, []int) {
1168- return file_ermite_event_proto_rawDescGZIP(), []int{14}1252+ return file_ermite_event_proto_rawDescGZIP(), []int{15}
1169 }1253 }
1170 1254
1171 func (x *CommentResolved) GetRepo() string {1255 func (x *CommentResolved) GetRepo() string {
@@ -1200,7 +1284,7 @@ type IssueOpened struct {
1200 1284
1201 func (x *IssueOpened) Reset() {1285 func (x *IssueOpened) Reset() {
1202 *x = IssueOpened{}1286 *x = IssueOpened{}
1203- mi := &file_ermite_event_proto_msgTypes[15]1287+ mi := &file_ermite_event_proto_msgTypes[16]
1204 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))1288 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
1205 ms.StoreMessageInfo(mi)1289 ms.StoreMessageInfo(mi)
1206 }1290 }
@@ -1212,7 +1296,7 @@ func (x *IssueOpened) String() string {
1212 func (*IssueOpened) ProtoMessage() {}1296 func (*IssueOpened) ProtoMessage() {}
1213 1297
1214 func (x *IssueOpened) ProtoReflect() protoreflect.Message {1298 func (x *IssueOpened) ProtoReflect() protoreflect.Message {
1215- mi := &file_ermite_event_proto_msgTypes[15]1299+ mi := &file_ermite_event_proto_msgTypes[16]
1216 if x != nil {1300 if x != nil {
1217 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))1301 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
1218 if ms.LoadMessageInfo() == nil {1302 if ms.LoadMessageInfo() == nil {
@@ -1225,7 +1309,7 @@ func (x *IssueOpened) ProtoReflect() protoreflect.Message {
1225 1309
1226 // Deprecated: Use IssueOpened.ProtoReflect.Descriptor instead.1310 // Deprecated: Use IssueOpened.ProtoReflect.Descriptor instead.
1227 func (*IssueOpened) Descriptor() ([]byte, []int) {1311 func (*IssueOpened) Descriptor() ([]byte, []int) {
1228- return file_ermite_event_proto_rawDescGZIP(), []int{15}1312+ return file_ermite_event_proto_rawDescGZIP(), []int{16}
1229 }1313 }
1230 1314
1231 func (x *IssueOpened) GetIssue() *Issue {1315 func (x *IssueOpened) GetIssue() *Issue {
@@ -1246,7 +1330,7 @@ type IssueClosed struct {
1246 1330
1247 func (x *IssueClosed) Reset() {1331 func (x *IssueClosed) Reset() {
1248 *x = IssueClosed{}1332 *x = IssueClosed{}
1249- mi := &file_ermite_event_proto_msgTypes[16]1333+ mi := &file_ermite_event_proto_msgTypes[17]
1250 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))1334 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
1251 ms.StoreMessageInfo(mi)1335 ms.StoreMessageInfo(mi)
1252 }1336 }
@@ -1258,7 +1342,7 @@ func (x *IssueClosed) String() string {
1258 func (*IssueClosed) ProtoMessage() {}1342 func (*IssueClosed) ProtoMessage() {}
1259 1343
1260 func (x *IssueClosed) ProtoReflect() protoreflect.Message {1344 func (x *IssueClosed) ProtoReflect() protoreflect.Message {
1261- mi := &file_ermite_event_proto_msgTypes[16]1345+ mi := &file_ermite_event_proto_msgTypes[17]
1262 if x != nil {1346 if x != nil {
1263 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))1347 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
1264 if ms.LoadMessageInfo() == nil {1348 if ms.LoadMessageInfo() == nil {
@@ -1271,7 +1355,7 @@ func (x *IssueClosed) ProtoReflect() protoreflect.Message {
1271 1355
1272 // Deprecated: Use IssueClosed.ProtoReflect.Descriptor instead.1356 // Deprecated: Use IssueClosed.ProtoReflect.Descriptor instead.
1273 func (*IssueClosed) Descriptor() ([]byte, []int) {1357 func (*IssueClosed) Descriptor() ([]byte, []int) {
1274- return file_ermite_event_proto_rawDescGZIP(), []int{16}1358+ return file_ermite_event_proto_rawDescGZIP(), []int{17}
1275 }1359 }
1276 1360
1277 func (x *IssueClosed) GetIssue() *Issue {1361 func (x *IssueClosed) GetIssue() *Issue {
@@ -1292,7 +1376,7 @@ type IssueReopened struct {
1292 1376
1293 func (x *IssueReopened) Reset() {1377 func (x *IssueReopened) Reset() {
1294 *x = IssueReopened{}1378 *x = IssueReopened{}
1295- mi := &file_ermite_event_proto_msgTypes[17]1379+ mi := &file_ermite_event_proto_msgTypes[18]
1296 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))1380 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
1297 ms.StoreMessageInfo(mi)1381 ms.StoreMessageInfo(mi)
1298 }1382 }
@@ -1304,7 +1388,7 @@ func (x *IssueReopened) String() string {
1304 func (*IssueReopened) ProtoMessage() {}1388 func (*IssueReopened) ProtoMessage() {}
1305 1389
1306 func (x *IssueReopened) ProtoReflect() protoreflect.Message {1390 func (x *IssueReopened) ProtoReflect() protoreflect.Message {
1307- mi := &file_ermite_event_proto_msgTypes[17]1391+ mi := &file_ermite_event_proto_msgTypes[18]
1308 if x != nil {1392 if x != nil {
1309 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))1393 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
1310 if ms.LoadMessageInfo() == nil {1394 if ms.LoadMessageInfo() == nil {
@@ -1317,7 +1401,7 @@ func (x *IssueReopened) ProtoReflect() protoreflect.Message {
1317 1401
1318 // Deprecated: Use IssueReopened.ProtoReflect.Descriptor instead.1402 // Deprecated: Use IssueReopened.ProtoReflect.Descriptor instead.
1319 func (*IssueReopened) Descriptor() ([]byte, []int) {1403 func (*IssueReopened) Descriptor() ([]byte, []int) {
1320- return file_ermite_event_proto_rawDescGZIP(), []int{17}1404+ return file_ermite_event_proto_rawDescGZIP(), []int{18}
1321 }1405 }
1322 1406
1323 func (x *IssueReopened) GetIssue() *Issue {1407 func (x *IssueReopened) GetIssue() *Issue {
@@ -1342,7 +1426,7 @@ type IssueCommented struct {
1342 1426
1343 func (x *IssueCommented) Reset() {1427 func (x *IssueCommented) Reset() {
1344 *x = IssueCommented{}1428 *x = IssueCommented{}
1345- mi := &file_ermite_event_proto_msgTypes[18]1429+ mi := &file_ermite_event_proto_msgTypes[19]
1346 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))1430 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
1347 ms.StoreMessageInfo(mi)1431 ms.StoreMessageInfo(mi)
1348 }1432 }
@@ -1354,7 +1438,7 @@ func (x *IssueCommented) String() string {
1354 func (*IssueCommented) ProtoMessage() {}1438 func (*IssueCommented) ProtoMessage() {}
1355 1439
1356 func (x *IssueCommented) ProtoReflect() protoreflect.Message {1440 func (x *IssueCommented) ProtoReflect() protoreflect.Message {
1357- mi := &file_ermite_event_proto_msgTypes[18]1441+ mi := &file_ermite_event_proto_msgTypes[19]
1358 if x != nil {1442 if x != nil {
1359 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))1443 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
1360 if ms.LoadMessageInfo() == nil {1444 if ms.LoadMessageInfo() == nil {
@@ -1367,7 +1451,7 @@ func (x *IssueCommented) ProtoReflect() protoreflect.Message {
1367 1451
1368 // Deprecated: Use IssueCommented.ProtoReflect.Descriptor instead.1452 // Deprecated: Use IssueCommented.ProtoReflect.Descriptor instead.
1369 func (*IssueCommented) Descriptor() ([]byte, []int) {1453 func (*IssueCommented) Descriptor() ([]byte, []int) {
1370- return file_ermite_event_proto_rawDescGZIP(), []int{18}1454+ return file_ermite_event_proto_rawDescGZIP(), []int{19}
1371 }1455 }
1372 1456
1373 func (x *IssueCommented) GetRepo() string {1457 func (x *IssueCommented) GetRepo() string {
@@ -1406,7 +1490,7 @@ type IssueSubmitted struct {
1406 1490
1407 func (x *IssueSubmitted) Reset() {1491 func (x *IssueSubmitted) Reset() {
1408 *x = IssueSubmitted{}1492 *x = IssueSubmitted{}
1409- mi := &file_ermite_event_proto_msgTypes[19]1493+ mi := &file_ermite_event_proto_msgTypes[20]
1410 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))1494 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
1411 ms.StoreMessageInfo(mi)1495 ms.StoreMessageInfo(mi)
1412 }1496 }
@@ -1418,7 +1502,7 @@ func (x *IssueSubmitted) String() string {
1418 func (*IssueSubmitted) ProtoMessage() {}1502 func (*IssueSubmitted) ProtoMessage() {}
1419 1503
1420 func (x *IssueSubmitted) ProtoReflect() protoreflect.Message {1504 func (x *IssueSubmitted) ProtoReflect() protoreflect.Message {
1421- mi := &file_ermite_event_proto_msgTypes[19]1505+ mi := &file_ermite_event_proto_msgTypes[20]
1422 if x != nil {1506 if x != nil {
1423 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))1507 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
1424 if ms.LoadMessageInfo() == nil {1508 if ms.LoadMessageInfo() == nil {
@@ -1431,7 +1515,7 @@ func (x *IssueSubmitted) ProtoReflect() protoreflect.Message {
1431 1515
1432 // Deprecated: Use IssueSubmitted.ProtoReflect.Descriptor instead.1516 // Deprecated: Use IssueSubmitted.ProtoReflect.Descriptor instead.
1433 func (*IssueSubmitted) Descriptor() ([]byte, []int) {1517 func (*IssueSubmitted) Descriptor() ([]byte, []int) {
1434- return file_ermite_event_proto_rawDescGZIP(), []int{19}1518+ return file_ermite_event_proto_rawDescGZIP(), []int{20}
1435 }1519 }
1436 1520
1437 func (x *IssueSubmitted) GetRepo() string {1521 func (x *IssueSubmitted) GetRepo() string {
@@ -1461,7 +1545,7 @@ type Gap struct {
1461 1545
1462 func (x *Gap) Reset() {1546 func (x *Gap) Reset() {
1463 *x = Gap{}1547 *x = Gap{}
1464- mi := &file_ermite_event_proto_msgTypes[20]1548+ mi := &file_ermite_event_proto_msgTypes[21]
1465 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))1549 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
1466 ms.StoreMessageInfo(mi)1550 ms.StoreMessageInfo(mi)
1467 }1551 }
@@ -1473,7 +1557,7 @@ func (x *Gap) String() string {
1473 func (*Gap) ProtoMessage() {}1557 func (*Gap) ProtoMessage() {}
1474 1558
1475 func (x *Gap) ProtoReflect() protoreflect.Message {1559 func (x *Gap) ProtoReflect() protoreflect.Message {
1476- mi := &file_ermite_event_proto_msgTypes[20]1560+ mi := &file_ermite_event_proto_msgTypes[21]
1477 if x != nil {1561 if x != nil {
1478 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))1562 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
1479 if ms.LoadMessageInfo() == nil {1563 if ms.LoadMessageInfo() == nil {
@@ -1486,7 +1570,7 @@ func (x *Gap) ProtoReflect() protoreflect.Message {
1486 1570
1487 // Deprecated: Use Gap.ProtoReflect.Descriptor instead.1571 // Deprecated: Use Gap.ProtoReflect.Descriptor instead.
1488 func (*Gap) Descriptor() ([]byte, []int) {1572 func (*Gap) Descriptor() ([]byte, []int) {
1489- return file_ermite_event_proto_rawDescGZIP(), []int{20}1573+ return file_ermite_event_proto_rawDescGZIP(), []int{21}
1490 }1574 }
1491 1575
1492 // RunUpdated reports a CI run that was created or whose status, conclusion or1576 // RunUpdated reports a CI run that was created or whose status, conclusion or
@@ -1501,7 +1585,7 @@ type RunUpdated struct {
1501 1585
1502 func (x *RunUpdated) Reset() {1586 func (x *RunUpdated) Reset() {
1503 *x = RunUpdated{}1587 *x = RunUpdated{}
1504- mi := &file_ermite_event_proto_msgTypes[21]1588+ mi := &file_ermite_event_proto_msgTypes[22]
1505 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))1589 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
1506 ms.StoreMessageInfo(mi)1590 ms.StoreMessageInfo(mi)
1507 }1591 }
@@ -1513,7 +1597,7 @@ func (x *RunUpdated) String() string {
1513 func (*RunUpdated) ProtoMessage() {}1597 func (*RunUpdated) ProtoMessage() {}
1514 1598
1515 func (x *RunUpdated) ProtoReflect() protoreflect.Message {1599 func (x *RunUpdated) ProtoReflect() protoreflect.Message {
1516- mi := &file_ermite_event_proto_msgTypes[21]1600+ mi := &file_ermite_event_proto_msgTypes[22]
1517 if x != nil {1601 if x != nil {
1518 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))1602 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
1519 if ms.LoadMessageInfo() == nil {1603 if ms.LoadMessageInfo() == nil {
@@ -1526,7 +1610,7 @@ func (x *RunUpdated) ProtoReflect() protoreflect.Message {
1526 1610
1527 // Deprecated: Use RunUpdated.ProtoReflect.Descriptor instead.1611 // Deprecated: Use RunUpdated.ProtoReflect.Descriptor instead.
1528 func (*RunUpdated) Descriptor() ([]byte, []int) {1612 func (*RunUpdated) Descriptor() ([]byte, []int) {
1529- return file_ermite_event_proto_rawDescGZIP(), []int{21}1613+ return file_ermite_event_proto_rawDescGZIP(), []int{22}
1530 }1614 }
1531 1615
1532 func (x *RunUpdated) GetRun() *Run {1616 func (x *RunUpdated) GetRun() *Run {
@@ -1548,7 +1632,7 @@ type JobUpdated struct {
1548 1632
1549 func (x *JobUpdated) Reset() {1633 func (x *JobUpdated) Reset() {
1550 *x = JobUpdated{}1634 *x = JobUpdated{}
1551- mi := &file_ermite_event_proto_msgTypes[22]1635+ mi := &file_ermite_event_proto_msgTypes[23]
1552 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))1636 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
1553 ms.StoreMessageInfo(mi)1637 ms.StoreMessageInfo(mi)
1554 }1638 }
@@ -1560,7 +1644,7 @@ func (x *JobUpdated) String() string {
1560 func (*JobUpdated) ProtoMessage() {}1644 func (*JobUpdated) ProtoMessage() {}
1561 1645
1562 func (x *JobUpdated) ProtoReflect() protoreflect.Message {1646 func (x *JobUpdated) ProtoReflect() protoreflect.Message {
1563- mi := &file_ermite_event_proto_msgTypes[22]1647+ mi := &file_ermite_event_proto_msgTypes[23]
1564 if x != nil {1648 if x != nil {
1565 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))1649 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
1566 if ms.LoadMessageInfo() == nil {1650 if ms.LoadMessageInfo() == nil {
@@ -1573,7 +1657,7 @@ func (x *JobUpdated) ProtoReflect() protoreflect.Message {
1573 1657
1574 // Deprecated: Use JobUpdated.ProtoReflect.Descriptor instead.1658 // Deprecated: Use JobUpdated.ProtoReflect.Descriptor instead.
1575 func (*JobUpdated) Descriptor() ([]byte, []int) {1659 func (*JobUpdated) Descriptor() ([]byte, []int) {
1576- return file_ermite_event_proto_rawDescGZIP(), []int{22}1660+ return file_ermite_event_proto_rawDescGZIP(), []int{23}
1577 }1661 }
1578 1662
1579 func (x *JobUpdated) GetJob() *RunJob {1663 func (x *JobUpdated) GetJob() *RunJob {
@@ -1592,7 +1676,8 @@ const file_ermite_event_proto_rawDesc = "" +
1592 "\x06topics\x18\x01 \x03(\tR\x06topics\x12!\n" +1676 "\x06topics\x18\x01 \x03(\tR\x06topics\x12!\n" +
1593 "\fresume_after\x18\x02 \x01(\tR\vresumeAfter\"4\n" +1677 "\fresume_after\x18\x02 \x01(\tR\vresumeAfter\"4\n" +
1594 "\rWatchResponse\x12#\n" +1678 "\rWatchResponse\x12#\n" +
1595- "\x05event\x18\x01 \x01(\v2\r.ermite.EventR\x05event\"\xe6\t\n" +1679+ "\x05event\x18\x01 \x01(\v2\r.ermite.EventR\x05event\"\xc8\n" +
1680+ "\n" +
1596 "\x05Event\x12\x0e\n" +1681 "\x05Event\x12\x0e\n" +
1597 "\x02id\x18\x01 \x01(\tR\x02id\x12.\n" +1682 "\x02id\x18\x01 \x01(\tR\x02id\x12.\n" +
1598 "\x04time\x18\x02 \x01(\v2\x1a.google.protobuf.TimestampR\x04time\x128\n" +1683 "\x04time\x18\x02 \x01(\v2\x1a.google.protobuf.TimestampR\x04time\x128\n" +
@@ -1617,7 +1702,8 @@ const file_ermite_event_proto_rawDesc = "" +
1617 "\fissue_closed\x18\x12 \x01(\v2\x13.ermite.IssueClosedH\x00R\vissueClosed\x12>\n" +1702 "\fissue_closed\x18\x12 \x01(\v2\x13.ermite.IssueClosedH\x00R\vissueClosed\x12>\n" +
1618 "\x0eissue_reopened\x18\x13 \x01(\v2\x15.ermite.IssueReopenedH\x00R\rissueReopened\x12A\n" +1703 "\x0eissue_reopened\x18\x13 \x01(\v2\x15.ermite.IssueReopenedH\x00R\rissueReopened\x12A\n" +
1619 "\x0fissue_commented\x18\x14 \x01(\v2\x16.ermite.IssueCommentedH\x00R\x0eissueCommented\x12A\n" +1704 "\x0fissue_commented\x18\x14 \x01(\v2\x16.ermite.IssueCommentedH\x00R\x0eissueCommented\x12A\n" +
1620- "\x0fissue_submitted\x18\x15 \x01(\v2\x16.ermite.IssueSubmittedH\x00R\x0eissueSubmittedB\x06\n" +1705+ "\x0fissue_submitted\x18\x15 \x01(\v2\x16.ermite.IssueSubmittedH\x00R\x0eissueSubmitted\x12`\n" +
1706+ "\x1amerge_request_mergeability\x18\x16 \x01(\v2 .ermite.MergeRequestMergeabilityH\x00R\x18mergeRequestMergeabilityB\x06\n" +
1621 "\x04kind\"/\n" +1707 "\x04kind\"/\n" +
1622 "\vRepoCreated\x12 \n" +1708 "\vRepoCreated\x12 \n" +
1623 "\x04repo\x18\x01 \x01(\v2\f.ermite.RepoR\x04repo\"/\n" +1709 "\x04repo\x18\x01 \x01(\v2\f.ermite.RepoR\x04repo\"/\n" +
@@ -1636,7 +1722,11 @@ const file_ermite_event_proto_rawDesc = "" +
1636 "\x12MergeRequestOpened\x129\n" +1722 "\x12MergeRequestOpened\x129\n" +
1637 "\rmerge_request\x18\x01 \x01(\v2\x14.ermite.MergeRequestR\fmergeRequest\"O\n" +1723 "\rmerge_request\x18\x01 \x01(\v2\x14.ermite.MergeRequestR\fmergeRequest\"O\n" +
1638 "\x12MergeRequestMerged\x129\n" +1724 "\x12MergeRequestMerged\x129\n" +
1639- "\rmerge_request\x18\x01 \x01(\v2\x14.ermite.MergeRequestR\fmergeRequest\"O\n" +1725+ "\rmerge_request\x18\x01 \x01(\v2\x14.ermite.MergeRequestR\fmergeRequest\"\x80\x01\n" +
1726+ "\x18MergeRequestMergeability\x12\x12\n" +
1727+ "\x04repo\x18\x01 \x01(\tR\x04repo\x12\x16\n" +
1728+ "\x06number\x18\x02 \x01(\x03R\x06number\x128\n" +
1729+ "\fmergeability\x18\x03 \x01(\v2\x14.ermite.MergeabilityR\fmergeability\"O\n" +
1640 "\x12MergeRequestClosed\x129\n" +1730 "\x12MergeRequestClosed\x129\n" +
1641 "\rmerge_request\x18\x01 \x01(\v2\x14.ermite.MergeRequestR\fmergeRequest\"e\n" +1731 "\rmerge_request\x18\x01 \x01(\v2\x14.ermite.MergeRequestR\fmergeRequest\"e\n" +
1642 "\fCommentAdded\x12\x12\n" +1732 "\fCommentAdded\x12\x12\n" +
@@ -1693,85 +1783,89 @@ func file_ermite_event_proto_rawDescGZIP() []byte {
1693 return file_ermite_event_proto_rawDescData1783 return file_ermite_event_proto_rawDescData
1694 }1784 }
1695 1785
1696-var file_ermite_event_proto_msgTypes = make([]protoimpl.MessageInfo, 23)1786+var file_ermite_event_proto_msgTypes = make([]protoimpl.MessageInfo, 24)
1697 var file_ermite_event_proto_goTypes = []any{1787 var file_ermite_event_proto_goTypes = []any{
1698- (*WatchRequest)(nil), // 0: ermite.WatchRequest1788+ (*WatchRequest)(nil), // 0: ermite.WatchRequest
1699- (*WatchResponse)(nil), // 1: ermite.WatchResponse1789+ (*WatchResponse)(nil), // 1: ermite.WatchResponse
1700- (*Event)(nil), // 2: ermite.Event1790+ (*Event)(nil), // 2: ermite.Event
1701- (*RepoCreated)(nil), // 3: ermite.RepoCreated1791+ (*RepoCreated)(nil), // 3: ermite.RepoCreated
1702- (*RepoUpdated)(nil), // 4: ermite.RepoUpdated1792+ (*RepoUpdated)(nil), // 4: ermite.RepoUpdated
1703- (*RepoDeleted)(nil), // 5: ermite.RepoDeleted1793+ (*RepoDeleted)(nil), // 5: ermite.RepoDeleted
1704- (*Pushed)(nil), // 6: ermite.Pushed1794+ (*Pushed)(nil), // 6: ermite.Pushed
1705- (*RefUpdate)(nil), // 7: ermite.RefUpdate1795+ (*RefUpdate)(nil), // 7: ermite.RefUpdate
1706- (*MergeRequestOpened)(nil), // 8: ermite.MergeRequestOpened1796+ (*MergeRequestOpened)(nil), // 8: ermite.MergeRequestOpened
1707- (*MergeRequestMerged)(nil), // 9: ermite.MergeRequestMerged1797+ (*MergeRequestMerged)(nil), // 9: ermite.MergeRequestMerged
1708- (*MergeRequestClosed)(nil), // 10: ermite.MergeRequestClosed1798+ (*MergeRequestMergeability)(nil), // 10: ermite.MergeRequestMergeability
1709- (*CommentAdded)(nil), // 11: ermite.CommentAdded1799+ (*MergeRequestClosed)(nil), // 11: ermite.MergeRequestClosed
1710- (*CommentEdited)(nil), // 12: ermite.CommentEdited1800+ (*CommentAdded)(nil), // 12: ermite.CommentAdded
1711- (*CommentDeleted)(nil), // 13: ermite.CommentDeleted1801+ (*CommentEdited)(nil), // 13: ermite.CommentEdited
1712- (*CommentResolved)(nil), // 14: ermite.CommentResolved1802+ (*CommentDeleted)(nil), // 14: ermite.CommentDeleted
1713- (*IssueOpened)(nil), // 15: ermite.IssueOpened1803+ (*CommentResolved)(nil), // 15: ermite.CommentResolved
1714- (*IssueClosed)(nil), // 16: ermite.IssueClosed1804+ (*IssueOpened)(nil), // 16: ermite.IssueOpened
1715- (*IssueReopened)(nil), // 17: ermite.IssueReopened1805+ (*IssueClosed)(nil), // 17: ermite.IssueClosed
1716- (*IssueCommented)(nil), // 18: ermite.IssueCommented1806+ (*IssueReopened)(nil), // 18: ermite.IssueReopened
1717- (*IssueSubmitted)(nil), // 19: ermite.IssueSubmitted1807+ (*IssueCommented)(nil), // 19: ermite.IssueCommented
1718- (*Gap)(nil), // 20: ermite.Gap1808+ (*IssueSubmitted)(nil), // 20: ermite.IssueSubmitted
1719- (*RunUpdated)(nil), // 21: ermite.RunUpdated1809+ (*Gap)(nil), // 21: ermite.Gap
1720- (*JobUpdated)(nil), // 22: ermite.JobUpdated1810+ (*RunUpdated)(nil), // 22: ermite.RunUpdated
1721- (*timestamppb.Timestamp)(nil), // 23: google.protobuf.Timestamp1811+ (*JobUpdated)(nil), // 23: ermite.JobUpdated
1722- (*Repo)(nil), // 24: ermite.Repo1812+ (*timestamppb.Timestamp)(nil), // 24: google.protobuf.Timestamp
1723- (*MergeRequest)(nil), // 25: ermite.MergeRequest1813+ (*Repo)(nil), // 25: ermite.Repo
1724- (*Comment)(nil), // 26: ermite.Comment1814+ (*MergeRequest)(nil), // 26: ermite.MergeRequest
1725- (*Issue)(nil), // 27: ermite.Issue1815+ (*Mergeability)(nil), // 27: ermite.Mergeability
1726- (*IssueComment)(nil), // 28: ermite.IssueComment1816+ (*Comment)(nil), // 28: ermite.Comment
1727- (*Run)(nil), // 29: ermite.Run1817+ (*Issue)(nil), // 29: ermite.Issue
1728- (*RunJob)(nil), // 30: ermite.RunJob1818+ (*IssueComment)(nil), // 30: ermite.IssueComment
1819+ (*Run)(nil), // 31: ermite.Run
1820+ (*RunJob)(nil), // 32: ermite.RunJob
1729 }1821 }
1730 var file_ermite_event_proto_depIdxs = []int32{1822 var file_ermite_event_proto_depIdxs = []int32{
1731 2, // 0: ermite.WatchResponse.event:type_name -> ermite.Event1823 2, // 0: ermite.WatchResponse.event:type_name -> ermite.Event
1732- 23, // 1: ermite.Event.time:type_name -> google.protobuf.Timestamp1824+ 24, // 1: ermite.Event.time:type_name -> google.protobuf.Timestamp
1733 3, // 2: ermite.Event.repo_created:type_name -> ermite.RepoCreated1825 3, // 2: ermite.Event.repo_created:type_name -> ermite.RepoCreated
1734 4, // 3: ermite.Event.repo_updated:type_name -> ermite.RepoUpdated1826 4, // 3: ermite.Event.repo_updated:type_name -> ermite.RepoUpdated
1735 5, // 4: ermite.Event.repo_deleted:type_name -> ermite.RepoDeleted1827 5, // 4: ermite.Event.repo_deleted:type_name -> ermite.RepoDeleted
1736 6, // 5: ermite.Event.pushed:type_name -> ermite.Pushed1828 6, // 5: ermite.Event.pushed:type_name -> ermite.Pushed
1737- 20, // 6: ermite.Event.gap:type_name -> ermite.Gap1829+ 21, // 6: ermite.Event.gap:type_name -> ermite.Gap
1738 8, // 7: ermite.Event.merge_request_opened:type_name -> ermite.MergeRequestOpened1830 8, // 7: ermite.Event.merge_request_opened:type_name -> ermite.MergeRequestOpened
1739 9, // 8: ermite.Event.merge_request_merged:type_name -> ermite.MergeRequestMerged1831 9, // 8: ermite.Event.merge_request_merged:type_name -> ermite.MergeRequestMerged
1740- 10, // 9: ermite.Event.merge_request_closed:type_name -> ermite.MergeRequestClosed1832+ 11, // 9: ermite.Event.merge_request_closed:type_name -> ermite.MergeRequestClosed
1741- 11, // 10: ermite.Event.comment_added:type_name -> ermite.CommentAdded1833+ 12, // 10: ermite.Event.comment_added:type_name -> ermite.CommentAdded
1742- 21, // 11: ermite.Event.run_updated:type_name -> ermite.RunUpdated1834+ 22, // 11: ermite.Event.run_updated:type_name -> ermite.RunUpdated
1743- 22, // 12: ermite.Event.job_updated:type_name -> ermite.JobUpdated1835+ 23, // 12: ermite.Event.job_updated:type_name -> ermite.JobUpdated
1744- 12, // 13: ermite.Event.comment_edited:type_name -> ermite.CommentEdited1836+ 13, // 13: ermite.Event.comment_edited:type_name -> ermite.CommentEdited
1745- 13, // 14: ermite.Event.comment_deleted:type_name -> ermite.CommentDeleted1837+ 14, // 14: ermite.Event.comment_deleted:type_name -> ermite.CommentDeleted
1746- 14, // 15: ermite.Event.comment_resolved:type_name -> ermite.CommentResolved1838+ 15, // 15: ermite.Event.comment_resolved:type_name -> ermite.CommentResolved
1747- 15, // 16: ermite.Event.issue_opened:type_name -> ermite.IssueOpened1839+ 16, // 16: ermite.Event.issue_opened:type_name -> ermite.IssueOpened
1748- 16, // 17: ermite.Event.issue_closed:type_name -> ermite.IssueClosed1840+ 17, // 17: ermite.Event.issue_closed:type_name -> ermite.IssueClosed
1749- 17, // 18: ermite.Event.issue_reopened:type_name -> ermite.IssueReopened1841+ 18, // 18: ermite.Event.issue_reopened:type_name -> ermite.IssueReopened
1750- 18, // 19: ermite.Event.issue_commented:type_name -> ermite.IssueCommented1842+ 19, // 19: ermite.Event.issue_commented:type_name -> ermite.IssueCommented
1751- 19, // 20: ermite.Event.issue_submitted:type_name -> ermite.IssueSubmitted1843+ 20, // 20: ermite.Event.issue_submitted:type_name -> ermite.IssueSubmitted
1752- 24, // 21: ermite.RepoCreated.repo:type_name -> ermite.Repo1844+ 10, // 21: ermite.Event.merge_request_mergeability:type_name -> ermite.MergeRequestMergeability
1753- 24, // 22: ermite.RepoUpdated.repo:type_name -> ermite.Repo1845+ 25, // 22: ermite.RepoCreated.repo:type_name -> ermite.Repo
1754- 7, // 23: ermite.Pushed.ref_updates:type_name -> ermite.RefUpdate1846+ 25, // 23: ermite.RepoUpdated.repo:type_name -> ermite.Repo
1755- 25, // 24: ermite.MergeRequestOpened.merge_request:type_name -> ermite.MergeRequest1847+ 7, // 24: ermite.Pushed.ref_updates:type_name -> ermite.RefUpdate
1756- 25, // 25: ermite.MergeRequestMerged.merge_request:type_name -> ermite.MergeRequest1848+ 26, // 25: ermite.MergeRequestOpened.merge_request:type_name -> ermite.MergeRequest
1757- 25, // 26: ermite.MergeRequestClosed.merge_request:type_name -> ermite.MergeRequest1849+ 26, // 26: ermite.MergeRequestMerged.merge_request:type_name -> ermite.MergeRequest
1758- 26, // 27: ermite.CommentAdded.comment:type_name -> ermite.Comment1850+ 27, // 27: ermite.MergeRequestMergeability.mergeability:type_name -> ermite.Mergeability
1759- 26, // 28: ermite.CommentEdited.comment:type_name -> ermite.Comment1851+ 26, // 28: ermite.MergeRequestClosed.merge_request:type_name -> ermite.MergeRequest
1760- 26, // 29: ermite.CommentDeleted.comment:type_name -> ermite.Comment1852+ 28, // 29: ermite.CommentAdded.comment:type_name -> ermite.Comment
1761- 26, // 30: ermite.CommentResolved.comment:type_name -> ermite.Comment1853+ 28, // 30: ermite.CommentEdited.comment:type_name -> ermite.Comment
1762- 27, // 31: ermite.IssueOpened.issue:type_name -> ermite.Issue1854+ 28, // 31: ermite.CommentDeleted.comment:type_name -> ermite.Comment
1763- 27, // 32: ermite.IssueClosed.issue:type_name -> ermite.Issue1855+ 28, // 32: ermite.CommentResolved.comment:type_name -> ermite.Comment
1764- 27, // 33: ermite.IssueReopened.issue:type_name -> ermite.Issue1856+ 29, // 33: ermite.IssueOpened.issue:type_name -> ermite.Issue
1765- 28, // 34: ermite.IssueCommented.comment:type_name -> ermite.IssueComment1857+ 29, // 34: ermite.IssueClosed.issue:type_name -> ermite.Issue
1766- 29, // 35: ermite.RunUpdated.run:type_name -> ermite.Run1858+ 29, // 35: ermite.IssueReopened.issue:type_name -> ermite.Issue
1767- 30, // 36: ermite.JobUpdated.job:type_name -> ermite.RunJob1859+ 30, // 36: ermite.IssueCommented.comment:type_name -> ermite.IssueComment
1768- 0, // 37: ermite.EventService.Watch:input_type -> ermite.WatchRequest1860+ 31, // 37: ermite.RunUpdated.run:type_name -> ermite.Run
1769- 1, // 38: ermite.EventService.Watch:output_type -> ermite.WatchResponse1861+ 32, // 38: ermite.JobUpdated.job:type_name -> ermite.RunJob
1770- 38, // [38:39] is the sub-list for method output_type1862+ 0, // 39: ermite.EventService.Watch:input_type -> ermite.WatchRequest
1771- 37, // [37:38] is the sub-list for method input_type1863+ 1, // 40: ermite.EventService.Watch:output_type -> ermite.WatchResponse
1772- 37, // [37:37] is the sub-list for extension type_name1864+ 40, // [40:41] is the sub-list for method output_type
1773- 37, // [37:37] is the sub-list for extension extendee1865+ 39, // [39:40] is the sub-list for method input_type
1774- 0, // [0:37] is the sub-list for field type_name1866+ 39, // [39:39] is the sub-list for extension type_name
1867+ 39, // [39:39] is the sub-list for extension extendee
1868+ 0, // [0:39] is the sub-list for field type_name
1775 }1869 }
1776 1870
1777 func init() { file_ermite_event_proto_init() }1871 func init() { file_ermite_event_proto_init() }
@@ -1803,6 +1897,7 @@ func file_ermite_event_proto_init() {
1803 (*Event_IssueReopened)(nil),1897 (*Event_IssueReopened)(nil),
1804 (*Event_IssueCommented)(nil),1898 (*Event_IssueCommented)(nil),
1805 (*Event_IssueSubmitted)(nil),1899 (*Event_IssueSubmitted)(nil),
1900+ (*Event_MergeRequestMergeability)(nil),
1806 }1901 }
1807 type x struct{}1902 type x struct{}
1808 out := protoimpl.TypeBuilder{1903 out := protoimpl.TypeBuilder{
@@ -1810,7 +1905,7 @@ func file_ermite_event_proto_init() {
1810 GoPackagePath: reflect.TypeOf(x{}).PkgPath(),1905 GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
1811 RawDescriptor: unsafe.Slice(unsafe.StringData(file_ermite_event_proto_rawDesc), len(file_ermite_event_proto_rawDesc)),1906 RawDescriptor: unsafe.Slice(unsafe.StringData(file_ermite_event_proto_rawDesc), len(file_ermite_event_proto_rawDesc)),
1812 NumEnums: 0,1907 NumEnums: 0,
1813- NumMessages: 23,1908+ NumMessages: 24,
1814 NumExtensions: 0,1909 NumExtensions: 0,
1815 NumServices: 1,1910 NumServices: 1,
1816 },1911 },
M gen/ermite/merge_request.pb.go +375 -159 generated file: collapsed
M gen/ermite/repo.pb.go +1 -1 generated file: collapsed
M gen/ermite/server.pb.go +4 -1 generated file: collapsed
M gen/ermite/types.pb.go +17 -5 generated file: collapsed
M gen_test.go +6 -0
@@ -114,6 +114,12 @@ func TestEnumNumbers(t *testing.T) {
114114 if got := ermite.MergeMode_MERGE_MODE_SQUASH; got != 2 {
115115 t.Errorf("MERGE_MODE_SQUASH = %d, want 2", got)
116116 }
117+ if got := ermite.MergeMode_MERGE_MODE_MERGE_COMMIT; got != 3 {
118+ t.Errorf("MERGE_MODE_MERGE_COMMIT = %d, want 3", got)
119+ }
120+ if got := ermite.MergeabilityState_MERGEABILITY_STATE_CONFLICT; got != 4 {
121+ t.Errorf("MERGEABILITY_STATE_CONFLICT = %d, want 4", got)
122+ }
117123 if got := ermite.MergeRequestState_MERGE_REQUEST_STATE_CLOSED; got != 3 {
118124 t.Errorf("MERGE_REQUEST_STATE_CLOSED = %d, want 3", got)
119125 }
@@ -114,6 +114,12 @@ func TestEnumNumbers(t *testing.T) {
114 if got := ermite.MergeMode_MERGE_MODE_SQUASH; got != 2 {114 if got := ermite.MergeMode_MERGE_MODE_SQUASH; got != 2 {
115 t.Errorf("MERGE_MODE_SQUASH = %d, want 2", got)115 t.Errorf("MERGE_MODE_SQUASH = %d, want 2", got)
116 }116 }
117+ if got := ermite.MergeMode_MERGE_MODE_MERGE_COMMIT; got != 3 {
118+ t.Errorf("MERGE_MODE_MERGE_COMMIT = %d, want 3", got)
119+ }
120+ if got := ermite.MergeabilityState_MERGEABILITY_STATE_CONFLICT; got != 4 {
121+ t.Errorf("MERGEABILITY_STATE_CONFLICT = %d, want 4", got)
122+ }
117 if got := ermite.MergeRequestState_MERGE_REQUEST_STATE_CLOSED; got != 3 {123 if got := ermite.MergeRequestState_MERGE_REQUEST_STATE_CLOSED; got != 3 {
118 t.Errorf("MERGE_REQUEST_STATE_CLOSED = %d, want 3", got)124 t.Errorf("MERGE_REQUEST_STATE_CLOSED = %d, want 3", got)
119 }125 }
M proto/ermite/event.proto +15 -0
@@ -132,6 +132,9 @@ message Event {
132132 // IssueSubmitted: an issue is awaiting moderation. Delivered only on the
133133 // "owner" topic, never on "home" or "repo:<name>", and carries no content.
134134 IssueSubmitted issue_submitted = 21;
135+ // MergeRequestMergeability: the mergeability of an open merge request
136+ // changed.
137+ MergeRequestMergeability merge_request_mergeability = 22;
135138 }
136139 }
137140
@@ -184,6 +187,18 @@ message MergeRequestMerged {
184187 MergeRequest merge_request = 1;
185188 }
186189
190+// MergeRequestMergeability reports the mergeability of an open merge request.
191+// It is published when the state changes, or when a check settles a result
192+// that readers had not seen yet (they saw CHECKING), not on every push.
193+message MergeRequestMergeability {
194+ // Repo is the name of the repository.
195+ string repo = 1;
196+ // Number is the number of the merge request.
197+ int64 number = 2;
198+ // Mergeability is the new result.
199+ Mergeability mergeability = 3;
200+}
201+
187202 // MergeRequestClosed reports a merge request closed without merging.
188203 message MergeRequestClosed {
189204 // MergeRequest is the merge request after closing.
@@ -132,6 +132,9 @@ message Event {
132 // IssueSubmitted: an issue is awaiting moderation. Delivered only on the132 // IssueSubmitted: an issue is awaiting moderation. Delivered only on the
133 // "owner" topic, never on "home" or "repo:<name>", and carries no content.133 // "owner" topic, never on "home" or "repo:<name>", and carries no content.
134 IssueSubmitted issue_submitted = 21;134 IssueSubmitted issue_submitted = 21;
135+ // MergeRequestMergeability: the mergeability of an open merge request
136+ // changed.
137+ MergeRequestMergeability merge_request_mergeability = 22;
135 }138 }
136 }139 }
137 140
@@ -184,6 +187,18 @@ message MergeRequestMerged {
184 MergeRequest merge_request = 1;187 MergeRequest merge_request = 1;
185 }188 }
186 189
190+// MergeRequestMergeability reports the mergeability of an open merge request.
191+// It is published when the state changes, or when a check settles a result
192+// that readers had not seen yet (they saw CHECKING), not on every push.
193+message MergeRequestMergeability {
194+ // Repo is the name of the repository.
195+ string repo = 1;
196+ // Number is the number of the merge request.
197+ int64 number = 2;
198+ // Mergeability is the new result.
199+ Mergeability mergeability = 3;
200+}
201+
187 // MergeRequestClosed reports a merge request closed without merging.202 // MergeRequestClosed reports a merge request closed without merging.
188 message MergeRequestClosed {203 message MergeRequestClosed {
189 // MergeRequest is the merge request after closing.204 // MergeRequest is the merge request after closing.
M proto/ermite/merge_request.proto +58 -4
@@ -44,6 +44,50 @@ enum Verdict {
4444 VERDICT_CHANGES_REQUESTED = 2;
4545 }
4646
47+// MergeabilityState tells whether the head of an open merge request can be
48+// merged into its target.
49+enum MergeabilityState {
50+ // Not set.
51+ MERGEABILITY_STATE_UNSPECIFIED = 0;
52+ // The server has no result yet for the current tips of both branches. It
53+ // is replaced by another state when the check completes.
54+ MERGEABILITY_STATE_CHECKING = 1;
55+ // The target is an ancestor of the head: every mode can merge.
56+ MERGEABILITY_STATE_UP_TO_DATE = 2;
57+ // The target has commits the head lacks, but the head merges cleanly:
58+ // squash and merge commit can merge, fast-forward cannot.
59+ MERGEABILITY_STATE_BEHIND = 3;
60+ // The head does not merge cleanly into the target, or the branches share no
61+ // history: no mode can merge.
62+ MERGEABILITY_STATE_CONFLICT = 4;
63+}
64+
65+// Mergeability is the result of checking an open merge request against the
66+// tips of its branches.
67+message Mergeability {
68+ // State is the result.
69+ MergeabilityState state = 1;
70+ // TargetId is the commit the target branch pointed to when checked. Empty
71+ // while CHECKING.
72+ string target_id = 2;
73+ // HeadId is the commit the source branch pointed to when checked. Empty
74+ // while CHECKING.
75+ string head_id = 3;
76+ // Behind is the number of commits of the target that the head lacks. Set
77+ // only when state is BEHIND.
78+ int32 behind = 4;
79+ // BehindCapped says that Behind is a lower bound: the server stops counting
80+ // at 1,000.
81+ bool behind_capped = 5;
82+ // ConflictPaths are the paths that conflict, at most 20. Set only when
83+ // state is CONFLICT; empty when the branches share no history.
84+ repeated string conflict_paths = 6;
85+ // ConflictPathsTruncated says that more paths conflict than listed.
86+ bool conflict_paths_truncated = 7;
87+ // CheckedAt is when the server computed the result. Unset while CHECKING.
88+ google.protobuf.Timestamp checked_at = 8;
89+}
90+
4791 // MergeRequest asks to merge one branch of a repository into another branch
4892 // of the same repository. It is about a branch, not about who wrote it.
4993 message MergeRequest {
@@ -81,12 +125,19 @@ message MergeRequest {
81125 // merged or closed it is the head at that moment.
82126 string head_id = 11;
83127 // MergedCommitId is the id of the commit the target branch points to after
84- // the merge: the head for a fast-forward, the new commit for a squash.
128+ // the merge: the head for a fast-forward, the new commit for a squash or a
129+ // merge commit.
85130 // Empty unless state is MERGED.
86131 string merged_commit_id = 12;
87132 // MergeMode is how the merge request was merged. MERGE_MODE_UNSPECIFIED
88133 // unless state is MERGED.
89134 MergeMode merge_mode = 13;
135+ // Mergeability tells whether the head can be merged into the target. Set
136+ // while the merge request is OPEN, with state CHECKING until the server has
137+ // a result for the current tips; never set once merged or closed. It is a
138+ // hint: MergeMergeRequest checks again. Set only by servers with the
139+ // "merge_requests.mergeability" feature.
140+ Mergeability mergeability = 14;
90141 }
91142
92143 // Comment is a note on a merge request, either general or attached to a line
@@ -233,9 +284,12 @@ service MergeRequestService {
233284 // never merged unseen. Fails with invalid_argument if head_id is empty or
234285 // not a commit id, and with failed_precondition if the merge request is not
235286 // open, if the source branch no longer points to head_id ("branch moved,
236- // read again"), if the target is not an ancestor of the head (rebase and
237- // push again), if the mode is not allowed by RepoSettings, or if a check
238- // fails and RepoSettings.failing_checks_block is set. Merges of one
287+ // read again"), if the mode is fast-forward and the target is not an
288+ // ancestor of the head (rebase and push again, or merge with squash or
289+ // merge commit), if the mode is squash or merge commit and the head
290+ // conflicts with the target or shares no history with it (rebase and push
291+ // again), if the mode is not allowed by RepoSettings, or if a check fails
292+ // and RepoSettings.failing_checks_block is set. Merges of one
239293 // repository run one at a time. Repeating a call that succeeded fails with
240294 // failed_precondition (not open). On success the server publishes
241295 // MergeRequestMerged then Pushed for the target branch.
@@ -44,6 +44,50 @@ enum Verdict {
44 VERDICT_CHANGES_REQUESTED = 2;44 VERDICT_CHANGES_REQUESTED = 2;
45 }45 }
46 46
47+// MergeabilityState tells whether the head of an open merge request can be
48+// merged into its target.
49+enum MergeabilityState {
50+ // Not set.
51+ MERGEABILITY_STATE_UNSPECIFIED = 0;
52+ // The server has no result yet for the current tips of both branches. It
53+ // is replaced by another state when the check completes.
54+ MERGEABILITY_STATE_CHECKING = 1;
55+ // The target is an ancestor of the head: every mode can merge.
56+ MERGEABILITY_STATE_UP_TO_DATE = 2;
57+ // The target has commits the head lacks, but the head merges cleanly:
58+ // squash and merge commit can merge, fast-forward cannot.
59+ MERGEABILITY_STATE_BEHIND = 3;
60+ // The head does not merge cleanly into the target, or the branches share no
61+ // history: no mode can merge.
62+ MERGEABILITY_STATE_CONFLICT = 4;
63+}
64+
65+// Mergeability is the result of checking an open merge request against the
66+// tips of its branches.
67+message Mergeability {
68+ // State is the result.
69+ MergeabilityState state = 1;
70+ // TargetId is the commit the target branch pointed to when checked. Empty
71+ // while CHECKING.
72+ string target_id = 2;
73+ // HeadId is the commit the source branch pointed to when checked. Empty
74+ // while CHECKING.
75+ string head_id = 3;
76+ // Behind is the number of commits of the target that the head lacks. Set
77+ // only when state is BEHIND.
78+ int32 behind = 4;
79+ // BehindCapped says that Behind is a lower bound: the server stops counting
80+ // at 1,000.
81+ bool behind_capped = 5;
82+ // ConflictPaths are the paths that conflict, at most 20. Set only when
83+ // state is CONFLICT; empty when the branches share no history.
84+ repeated string conflict_paths = 6;
85+ // ConflictPathsTruncated says that more paths conflict than listed.
86+ bool conflict_paths_truncated = 7;
87+ // CheckedAt is when the server computed the result. Unset while CHECKING.
88+ google.protobuf.Timestamp checked_at = 8;
89+}
90+
47 // MergeRequest asks to merge one branch of a repository into another branch91 // MergeRequest asks to merge one branch of a repository into another branch
48 // of the same repository. It is about a branch, not about who wrote it.92 // of the same repository. It is about a branch, not about who wrote it.
49 message MergeRequest {93 message MergeRequest {
@@ -81,12 +125,19 @@ message MergeRequest {
81 // merged or closed it is the head at that moment.125 // merged or closed it is the head at that moment.
82 string head_id = 11;126 string head_id = 11;
83 // MergedCommitId is the id of the commit the target branch points to after127 // MergedCommitId is the id of the commit the target branch points to after
84- // the merge: the head for a fast-forward, the new commit for a squash.128+ // the merge: the head for a fast-forward, the new commit for a squash or a
129+ // merge commit.
85 // Empty unless state is MERGED.130 // Empty unless state is MERGED.
86 string merged_commit_id = 12;131 string merged_commit_id = 12;
87 // MergeMode is how the merge request was merged. MERGE_MODE_UNSPECIFIED132 // MergeMode is how the merge request was merged. MERGE_MODE_UNSPECIFIED
88 // unless state is MERGED.133 // unless state is MERGED.
89 MergeMode merge_mode = 13;134 MergeMode merge_mode = 13;
135+ // Mergeability tells whether the head can be merged into the target. Set
136+ // while the merge request is OPEN, with state CHECKING until the server has
137+ // a result for the current tips; never set once merged or closed. It is a
138+ // hint: MergeMergeRequest checks again. Set only by servers with the
139+ // "merge_requests.mergeability" feature.
140+ Mergeability mergeability = 14;
90 }141 }
91 142
92 // Comment is a note on a merge request, either general or attached to a line143 // Comment is a note on a merge request, either general or attached to a line
@@ -233,9 +284,12 @@ service MergeRequestService {
233 // never merged unseen. Fails with invalid_argument if head_id is empty or284 // never merged unseen. Fails with invalid_argument if head_id is empty or
234 // not a commit id, and with failed_precondition if the merge request is not285 // not a commit id, and with failed_precondition if the merge request is not
235 // open, if the source branch no longer points to head_id ("branch moved,286 // open, if the source branch no longer points to head_id ("branch moved,
236- // read again"), if the target is not an ancestor of the head (rebase and287+ // read again"), if the mode is fast-forward and the target is not an
237- // push again), if the mode is not allowed by RepoSettings, or if a check288+ // ancestor of the head (rebase and push again, or merge with squash or
238- // fails and RepoSettings.failing_checks_block is set. Merges of one289+ // merge commit), if the mode is squash or merge commit and the head
290+ // conflicts with the target or shares no history with it (rebase and push
291+ // again), if the mode is not allowed by RepoSettings, or if a check fails
292+ // and RepoSettings.failing_checks_block is set. Merges of one
239 // repository run one at a time. Repeating a call that succeeded fails with293 // repository run one at a time. Repeating a call that succeeded fails with
240 // failed_precondition (not open). On success the server publishes294 // failed_precondition (not open). On success the server publishes
241 // MergeRequestMerged then Pushed for the target branch.295 // MergeRequestMerged then Pushed for the target branch.
M proto/ermite/repo.proto +1 -1
@@ -38,7 +38,7 @@ message RepoSettings {
3838 // AllowedMergeModes are the modes with which a merge request of the
3939 // repository may be merged. It is never empty in a response and has no
4040 // duplicate. Both MERGE_MODE_FAST_FORWARD and MERGE_MODE_SQUASH are allowed
41- // by default. MERGE_MODE_UNSPECIFIED is rejected.
41+ // by default; MERGE_MODE_MERGE_COMMIT is allowed only when listed. MERGE_MODE_UNSPECIFIED is rejected.
4242 repeated MergeMode allowed_merge_modes = 1;
4343 // FailingChecksBlock says whether a merge request whose checks fail cannot be
4444 // merged. It is true at creation of the repository and always stored
@@ -38,7 +38,7 @@ message RepoSettings {
38 // AllowedMergeModes are the modes with which a merge request of the38 // AllowedMergeModes are the modes with which a merge request of the
39 // repository may be merged. It is never empty in a response and has no39 // repository may be merged. It is never empty in a response and has no
40 // duplicate. Both MERGE_MODE_FAST_FORWARD and MERGE_MODE_SQUASH are allowed40 // duplicate. Both MERGE_MODE_FAST_FORWARD and MERGE_MODE_SQUASH are allowed
41- // by default. MERGE_MODE_UNSPECIFIED is rejected.41+ // by default; MERGE_MODE_MERGE_COMMIT is allowed only when listed. MERGE_MODE_UNSPECIFIED is rejected.
42 repeated MergeMode allowed_merge_modes = 1;42 repeated MergeMode allowed_merge_modes = 1;
43 // FailingChecksBlock says whether a merge request whose checks fail cannot be43 // FailingChecksBlock says whether a merge request whose checks fail cannot be
44 // merged. It is true at creation of the repository and always stored44 // merged. It is true at creation of the repository and always stored
M proto/ermite/server.proto +5 -2
@@ -13,7 +13,7 @@ service ServerService {
1313 // it first to check compatibility.
1414 rpc GetVersion(GetVersionRequest) returns (GetVersionResponse);
1515 // GetSigningKey returns the public key with which the server signs the
16- // commits it creates (squash merges, see MergeMode). It needs no
16+ // commits it creates (squash and merge commits, see MergeMode). It needs no
1717 // authentication: the key is public, and anyone verifying a commit needs it.
1818 // Servers that implement it list "signing_key" in
1919 // GetVersionResponse.features.
@@ -57,7 +57,10 @@ message GetVersionResponse {
5757 // secrets, vars, environment, permissions and trusted fields and Run.trusted),
5858 // "ci.dispatch" (RunService.DispatchWorkflow), "ci.concurrency"
5959 // (CI_STATUS_PENDING and RunJob.concurrency_group), "ci.cache" (Job.cache)
60- // and "ci.artifacts" (JobArtifactService and ArtifactService).
60+ // and "ci.artifacts" (JobArtifactService and ArtifactService). The merge
61+ // request identifier "merge_requests.mergeability" covers
62+ // MergeRequest.mergeability, the MergeRequestMergeability event and
63+ // MERGE_MODE_MERGE_COMMIT.
6164 repeated string features = 2;
6265 }
6366
@@ -13,7 +13,7 @@ service ServerService {
13 // it first to check compatibility.13 // it first to check compatibility.
14 rpc GetVersion(GetVersionRequest) returns (GetVersionResponse);14 rpc GetVersion(GetVersionRequest) returns (GetVersionResponse);
15 // GetSigningKey returns the public key with which the server signs the15 // GetSigningKey returns the public key with which the server signs the
16- // commits it creates (squash merges, see MergeMode). It needs no16+ // commits it creates (squash and merge commits, see MergeMode). It needs no
17 // authentication: the key is public, and anyone verifying a commit needs it.17 // authentication: the key is public, and anyone verifying a commit needs it.
18 // Servers that implement it list "signing_key" in18 // Servers that implement it list "signing_key" in
19 // GetVersionResponse.features.19 // GetVersionResponse.features.
@@ -57,7 +57,10 @@ message GetVersionResponse {
57 // secrets, vars, environment, permissions and trusted fields and Run.trusted),57 // secrets, vars, environment, permissions and trusted fields and Run.trusted),
58 // "ci.dispatch" (RunService.DispatchWorkflow), "ci.concurrency"58 // "ci.dispatch" (RunService.DispatchWorkflow), "ci.concurrency"
59 // (CI_STATUS_PENDING and RunJob.concurrency_group), "ci.cache" (Job.cache)59 // (CI_STATUS_PENDING and RunJob.concurrency_group), "ci.cache" (Job.cache)
60- // and "ci.artifacts" (JobArtifactService and ArtifactService).60+ // and "ci.artifacts" (JobArtifactService and ArtifactService). The merge
61+ // request identifier "merge_requests.mergeability" covers
62+ // MergeRequest.mergeability, the MergeRequestMergeability event and
63+ // MERGE_MODE_MERGE_COMMIT.
61 repeated string features = 2;64 repeated string features = 2;
62 }65 }
63 66
M proto/ermite/types.proto +12 -3
@@ -40,9 +40,11 @@ message Commit {
4040 CommitVerification verification = 7;
4141 }
4242
43-// MergeMode is how a merge request is merged. Both modes need the target to
44-// be an ancestor of the head: a branch behind its target is rebased by its
45-// author and pushed again, the server never rebases nor creates merge commits.
43+// MergeMode is how a merge request is merged. Fast-forward needs the target
44+// to be an ancestor of the head. Squash and merge commit need the head to
45+// merge cleanly into the target, which holds when the branch is behind its
46+// target without conflict. The server never rebases: a branch that conflicts
47+// is rebased by its author and pushed again.
4648 enum MergeMode {
4749 // Not set. In MergeMergeRequestRequest.mode it means fast-forward. Rejected
4850 // in RepoSettings.allowed_merge_modes. Returned on a merge request that was
@@ -58,4 +60,11 @@ enum MergeMode {
5860 // title, " (!<number>)", a blank line and the list of the squashed commits'
5961 // summaries.
6062 MERGE_MODE_SQUASH = 2;
63+ // One new commit is created with two parents, the target tip then the head,
64+ // and the tree of the merge. It is signed by the server's key (see
65+ // ServerService.GetSigningKey); its author and committer are the server
66+ // identity. Its message is "Merge branch '<source>' into <target> (!<n>)",
67+ // a blank line and the title. The signatures of the branch's commits are
68+ // kept. Needs the "merge_requests.mergeability" feature.
69+ MERGE_MODE_MERGE_COMMIT = 3;
6170 }
@@ -40,9 +40,11 @@ message Commit {
40 CommitVerification verification = 7;40 CommitVerification verification = 7;
41 }41 }
42 42
43-// MergeMode is how a merge request is merged. Both modes need the target to43+// MergeMode is how a merge request is merged. Fast-forward needs the target
44-// be an ancestor of the head: a branch behind its target is rebased by its44+// to be an ancestor of the head. Squash and merge commit need the head to
45-// author and pushed again, the server never rebases nor creates merge commits.45+// merge cleanly into the target, which holds when the branch is behind its
46+// target without conflict. The server never rebases: a branch that conflicts
47+// is rebased by its author and pushed again.
46 enum MergeMode {48 enum MergeMode {
47 // Not set. In MergeMergeRequestRequest.mode it means fast-forward. Rejected49 // Not set. In MergeMergeRequestRequest.mode it means fast-forward. Rejected
48 // in RepoSettings.allowed_merge_modes. Returned on a merge request that was50 // in RepoSettings.allowed_merge_modes. Returned on a merge request that was
@@ -58,4 +60,11 @@ enum MergeMode {
58 // title, " (!<number>)", a blank line and the list of the squashed commits'60 // title, " (!<number>)", a blank line and the list of the squashed commits'
59 // summaries.61 // summaries.
60 MERGE_MODE_SQUASH = 2;62 MERGE_MODE_SQUASH = 2;
63+ // One new commit is created with two parents, the target tip then the head,
64+ // and the tree of the merge. It is signed by the server's key (see
65+ // ServerService.GetSigningKey); its author and committer are the server
66+ // identity. Its message is "Merge branch '<source>' into <target> (!<n>)",
67+ // a blank line and the title. The signatures of the branch's commits are
68+ // kept. Needs the "merge_requests.mergeability" feature.
69+ MERGE_MODE_MERGE_COMMIT = 3;
61 }70 }

Keyboard shortcuts

Single-key shortcuts are on. ctrl k and esc work whatever this says.

ctrl k :
go to a section, branch, tag, file or repository
?
this list
j k
move the row cursor down / up
enter
open the row under the cursor; on Files, a directory opens or closes in place
↑ ↓ ← → home end
in the file tree (focus on a row): previous / next row, close / open a directory or go to its parent / first entry, first / last row. They never open a file
l h
on Files: open a directory or a file / close a directory or go up to its parent, then to the parent page. Elsewhere: into the side panel (on a merge request, its files) / back to the content; there j k move between its controls
g g G
first / last row
/
filter the list; on Files, find a file anywhere in the repository (esc clears, enter opens the best match)
b
switch branch or tag
g s g f g c g b g m g i g r g a
tabs: summary, files, commits, branches & tags, merge requests, issues, releases, actions (when available)
g h
home
w
wide mode: use the whole width of the screen, or not (remembered)
y
copy a permalink pinned to the commit
d u x
diff: split / unified / collapse or expand all
e E
diff: the whole file in view / every file, with the lines the hunks hide
n
merge request: next note in the diff
esc
close a dialog, leave a field

Branches 2

Tags 18

↑↓ moveenter openesc close