detached b97dc86

#7 feat(proto): expose issue to merge request references on issues

state
merged · b97dc86 · fast-forward
branch
feat/issue-links → main
opened
bnema ·
updated

Additive changes for issue ↔ merge request links (needed by ermite feat/issue-mr-links):

  • Issue.closed_by_merge_request (10): the merge request whose merge closed the issue; 0 when open or closed by hand.
  • IssueReference message (number, title, state, closes).
  • GetIssueResponse.references (3): merge requests that mention the issue.
  • Feature issues.links documented in docs/services.md.

buf lint and buf breaking against main pass. After merge: tag v0.13.0.

CommitSubjectAuthorDateSignatureStatus
b97dc86feat(proto): expose issue to merge request references and closed_by_merge_request on issuesbriceGPG Verified

Checks 4

3 files · +269 -129
4/4
M docs/services.md +1 -1
@@ -6,7 +6,7 @@
66 | `GitService` | `ListRefs`, `GetTree`, `ListPaths`, `GetBlob` (streamed), `ListCommits`, `GetCommit` (structured diff), `ResolveRevision` |
77 | `TokenService` | `CreateToken` (secret shown once), `ListTokens`, `RevokeToken` |
88 | `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` each time a result is settled for new branch tips (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, merge requests naming the issue, `closed_by_merge_request`), `AddIssueComment`, `CloseIssue`, `ReopenIssue`; owner only: `ListPendingIssues`, `ApproveIssue`, `RejectIssue`. Features `issues`, `issues.links`. Issues share numbers with merge requests |
1010 | `SessionService` | `CreateLoginLink`, `SignOutEverywhere` (owner only) |
1111 | `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) |
@@ -6,7 +6,7 @@
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` (modes fast-forward, squash, merge commit), `MarkRead`. Open merge requests carry `mergeability` (up to date, behind, conflict, or checking) and `Watch` publishes `MergeRequestMergeability` each time a result is settled for new branch tips (feature `merge_requests.mergeability`) |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` each time a result is settled for new branch tips (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, merge requests naming the issue, `closed_by_merge_request`), `AddIssueComment`, `CloseIssue`, `ReopenIssue`; owner only: `ListPendingIssues`, `ApproveIssue`, `RejectIssue`. Features `issues`, `issues.links`. 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). Event 22: `merge_request_mergeability` |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) |
M gen/ermite/issue.pb.go +239 -128
@@ -107,9 +107,13 @@ type Issue struct {
107107 // UpdatedAt is when the issue last changed.
108108 UpdatedAt *timestamppb.Timestamp `protobuf:"bytes,8,opt,name=updated_at,json=updatedAt,proto3" json:"updated_at,omitempty"`
109109 // CommentCount is the number of comments on the issue.
110- CommentCount int32 `protobuf:"varint,9,opt,name=comment_count,json=commentCount,proto3" json:"comment_count,omitempty"`
111- unknownFields protoimpl.UnknownFields
112- sizeCache protoimpl.SizeCache
110+ CommentCount int32 `protobuf:"varint,9,opt,name=comment_count,json=commentCount,proto3" json:"comment_count,omitempty"`
111+ // ClosedByMergeRequest is the number of the merge request whose merge closed
112+ // the issue (a closing reference such as "Fixes #N"); 0 when the issue was
113+ // closed by hand or is open. Reset when the issue is reopened.
114+ ClosedByMergeRequest int64 `protobuf:"varint,10,opt,name=closed_by_merge_request,json=closedByMergeRequest,proto3" json:"closed_by_merge_request,omitempty"`
115+ unknownFields protoimpl.UnknownFields
116+ sizeCache protoimpl.SizeCache
113117 }
114118
115119 func (x *Issue) Reset() {
@@ -205,6 +209,88 @@ func (x *Issue) GetCommentCount() int32 {
205209 return 0
206210 }
207211
212+func (x *Issue) GetClosedByMergeRequest() int64 {
213+ if x != nil {
214+ return x.ClosedByMergeRequest
215+ }
216+ return 0
217+}
218+
219+// IssueReference is a merge request of the same repository that names the
220+// issue ("#N") in its title, description, notes or commit messages.
221+type IssueReference struct {
222+ state protoimpl.MessageState `protogen:"open.v1"`
223+ // Number is the number of the merge request.
224+ Number int64 `protobuf:"varint,1,opt,name=number,proto3" json:"number,omitempty"`
225+ // Title is the title of the merge request.
226+ Title string `protobuf:"bytes,2,opt,name=title,proto3" json:"title,omitempty"`
227+ // State is where the merge request is in its life.
228+ State MergeRequestState `protobuf:"varint,3,opt,name=state,proto3,enum=ermite.MergeRequestState" json:"state,omitempty"`
229+ // Closes says that a closing reference ("Fixes #N") names the issue:
230+ // merging the request closes it.
231+ Closes bool `protobuf:"varint,4,opt,name=closes,proto3" json:"closes,omitempty"`
232+ unknownFields protoimpl.UnknownFields
233+ sizeCache protoimpl.SizeCache
234+}
235+
236+func (x *IssueReference) Reset() {
237+ *x = IssueReference{}
238+ mi := &file_ermite_issue_proto_msgTypes[1]
239+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
240+ ms.StoreMessageInfo(mi)
241+}
242+
243+func (x *IssueReference) String() string {
244+ return protoimpl.X.MessageStringOf(x)
245+}
246+
247+func (*IssueReference) ProtoMessage() {}
248+
249+func (x *IssueReference) ProtoReflect() protoreflect.Message {
250+ mi := &file_ermite_issue_proto_msgTypes[1]
251+ if x != nil {
252+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
253+ if ms.LoadMessageInfo() == nil {
254+ ms.StoreMessageInfo(mi)
255+ }
256+ return ms
257+ }
258+ return mi.MessageOf(x)
259+}
260+
261+// Deprecated: Use IssueReference.ProtoReflect.Descriptor instead.
262+func (*IssueReference) Descriptor() ([]byte, []int) {
263+ return file_ermite_issue_proto_rawDescGZIP(), []int{1}
264+}
265+
266+func (x *IssueReference) GetNumber() int64 {
267+ if x != nil {
268+ return x.Number
269+ }
270+ return 0
271+}
272+
273+func (x *IssueReference) GetTitle() string {
274+ if x != nil {
275+ return x.Title
276+ }
277+ return ""
278+}
279+
280+func (x *IssueReference) GetState() MergeRequestState {
281+ if x != nil {
282+ return x.State
283+ }
284+ return MergeRequestState_MERGE_REQUEST_STATE_UNSPECIFIED
285+}
286+
287+func (x *IssueReference) GetCloses() bool {
288+ if x != nil {
289+ return x.Closes
290+ }
291+ return false
292+}
293+
208294 // IssueComment is a note on an issue.
209295 type IssueComment struct {
210296 state protoimpl.MessageState `protogen:"open.v1"`
@@ -222,7 +308,7 @@ type IssueComment struct {
222308
223309 func (x *IssueComment) Reset() {
224310 *x = IssueComment{}
225- mi := &file_ermite_issue_proto_msgTypes[1]
311+ mi := &file_ermite_issue_proto_msgTypes[2]
226312 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
227313 ms.StoreMessageInfo(mi)
228314 }
@@ -234,7 +320,7 @@ func (x *IssueComment) String() string {
234320 func (*IssueComment) ProtoMessage() {}
235321
236322 func (x *IssueComment) ProtoReflect() protoreflect.Message {
237- mi := &file_ermite_issue_proto_msgTypes[1]
323+ mi := &file_ermite_issue_proto_msgTypes[2]
238324 if x != nil {
239325 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
240326 if ms.LoadMessageInfo() == nil {
@@ -247,7 +333,7 @@ func (x *IssueComment) ProtoReflect() protoreflect.Message {
247333
248334 // Deprecated: Use IssueComment.ProtoReflect.Descriptor instead.
249335 func (*IssueComment) Descriptor() ([]byte, []int) {
250- return file_ermite_issue_proto_rawDescGZIP(), []int{1}
336+ return file_ermite_issue_proto_rawDescGZIP(), []int{2}
251337 }
252338
253339 func (x *IssueComment) GetId() string {
@@ -293,7 +379,7 @@ type CreateIssueRequest struct {
293379
294380 func (x *CreateIssueRequest) Reset() {
295381 *x = CreateIssueRequest{}
296- mi := &file_ermite_issue_proto_msgTypes[2]
382+ mi := &file_ermite_issue_proto_msgTypes[3]
297383 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
298384 ms.StoreMessageInfo(mi)
299385 }
@@ -305,7 +391,7 @@ func (x *CreateIssueRequest) String() string {
305391 func (*CreateIssueRequest) ProtoMessage() {}
306392
307393 func (x *CreateIssueRequest) ProtoReflect() protoreflect.Message {
308- mi := &file_ermite_issue_proto_msgTypes[2]
394+ mi := &file_ermite_issue_proto_msgTypes[3]
309395 if x != nil {
310396 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
311397 if ms.LoadMessageInfo() == nil {
@@ -318,7 +404,7 @@ func (x *CreateIssueRequest) ProtoReflect() protoreflect.Message {
318404
319405 // Deprecated: Use CreateIssueRequest.ProtoReflect.Descriptor instead.
320406 func (*CreateIssueRequest) Descriptor() ([]byte, []int) {
321- return file_ermite_issue_proto_rawDescGZIP(), []int{2}
407+ return file_ermite_issue_proto_rawDescGZIP(), []int{3}
322408 }
323409
324410 func (x *CreateIssueRequest) GetRepo() string {
@@ -353,7 +439,7 @@ type CreateIssueResponse struct {
353439
354440 func (x *CreateIssueResponse) Reset() {
355441 *x = CreateIssueResponse{}
356- mi := &file_ermite_issue_proto_msgTypes[3]
442+ mi := &file_ermite_issue_proto_msgTypes[4]
357443 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
358444 ms.StoreMessageInfo(mi)
359445 }
@@ -365,7 +451,7 @@ func (x *CreateIssueResponse) String() string {
365451 func (*CreateIssueResponse) ProtoMessage() {}
366452
367453 func (x *CreateIssueResponse) ProtoReflect() protoreflect.Message {
368- mi := &file_ermite_issue_proto_msgTypes[3]
454+ mi := &file_ermite_issue_proto_msgTypes[4]
369455 if x != nil {
370456 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
371457 if ms.LoadMessageInfo() == nil {
@@ -378,7 +464,7 @@ func (x *CreateIssueResponse) ProtoReflect() protoreflect.Message {
378464
379465 // Deprecated: Use CreateIssueResponse.ProtoReflect.Descriptor instead.
380466 func (*CreateIssueResponse) Descriptor() ([]byte, []int) {
381- return file_ermite_issue_proto_rawDescGZIP(), []int{3}
467+ return file_ermite_issue_proto_rawDescGZIP(), []int{4}
382468 }
383469
384470 func (x *CreateIssueResponse) GetIssue() *Issue {
@@ -408,7 +494,7 @@ type ListIssuesRequest struct {
408494
409495 func (x *ListIssuesRequest) Reset() {
410496 *x = ListIssuesRequest{}
411- mi := &file_ermite_issue_proto_msgTypes[4]
497+ mi := &file_ermite_issue_proto_msgTypes[5]
412498 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
413499 ms.StoreMessageInfo(mi)
414500 }
@@ -420,7 +506,7 @@ func (x *ListIssuesRequest) String() string {
420506 func (*ListIssuesRequest) ProtoMessage() {}
421507
422508 func (x *ListIssuesRequest) ProtoReflect() protoreflect.Message {
423- mi := &file_ermite_issue_proto_msgTypes[4]
509+ mi := &file_ermite_issue_proto_msgTypes[5]
424510 if x != nil {
425511 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
426512 if ms.LoadMessageInfo() == nil {
@@ -433,7 +519,7 @@ func (x *ListIssuesRequest) ProtoReflect() protoreflect.Message {
433519
434520 // Deprecated: Use ListIssuesRequest.ProtoReflect.Descriptor instead.
435521 func (*ListIssuesRequest) Descriptor() ([]byte, []int) {
436- return file_ermite_issue_proto_rawDescGZIP(), []int{4}
522+ return file_ermite_issue_proto_rawDescGZIP(), []int{5}
437523 }
438524
439525 func (x *ListIssuesRequest) GetRepo() string {
@@ -478,7 +564,7 @@ type ListIssuesResponse struct {
478564
479565 func (x *ListIssuesResponse) Reset() {
480566 *x = ListIssuesResponse{}
481- mi := &file_ermite_issue_proto_msgTypes[5]
567+ mi := &file_ermite_issue_proto_msgTypes[6]
482568 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
483569 ms.StoreMessageInfo(mi)
484570 }
@@ -490,7 +576,7 @@ func (x *ListIssuesResponse) String() string {
490576 func (*ListIssuesResponse) ProtoMessage() {}
491577
492578 func (x *ListIssuesResponse) ProtoReflect() protoreflect.Message {
493- mi := &file_ermite_issue_proto_msgTypes[5]
579+ mi := &file_ermite_issue_proto_msgTypes[6]
494580 if x != nil {
495581 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
496582 if ms.LoadMessageInfo() == nil {
@@ -503,7 +589,7 @@ func (x *ListIssuesResponse) ProtoReflect() protoreflect.Message {
503589
504590 // Deprecated: Use ListIssuesResponse.ProtoReflect.Descriptor instead.
505591 func (*ListIssuesResponse) Descriptor() ([]byte, []int) {
506- return file_ermite_issue_proto_rawDescGZIP(), []int{5}
592+ return file_ermite_issue_proto_rawDescGZIP(), []int{6}
507593 }
508594
509595 func (x *ListIssuesResponse) GetIssues() []*Issue {
@@ -533,7 +619,7 @@ type GetIssueRequest struct {
533619
534620 func (x *GetIssueRequest) Reset() {
535621 *x = GetIssueRequest{}
536- mi := &file_ermite_issue_proto_msgTypes[6]
622+ mi := &file_ermite_issue_proto_msgTypes[7]
537623 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
538624 ms.StoreMessageInfo(mi)
539625 }
@@ -545,7 +631,7 @@ func (x *GetIssueRequest) String() string {
545631 func (*GetIssueRequest) ProtoMessage() {}
546632
547633 func (x *GetIssueRequest) ProtoReflect() protoreflect.Message {
548- mi := &file_ermite_issue_proto_msgTypes[6]
634+ mi := &file_ermite_issue_proto_msgTypes[7]
549635 if x != nil {
550636 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
551637 if ms.LoadMessageInfo() == nil {
@@ -558,7 +644,7 @@ func (x *GetIssueRequest) ProtoReflect() protoreflect.Message {
558644
559645 // Deprecated: Use GetIssueRequest.ProtoReflect.Descriptor instead.
560646 func (*GetIssueRequest) Descriptor() ([]byte, []int) {
561- return file_ermite_issue_proto_rawDescGZIP(), []int{6}
647+ return file_ermite_issue_proto_rawDescGZIP(), []int{7}
562648 }
563649
564650 func (x *GetIssueRequest) GetRepo() string {
@@ -581,14 +667,17 @@ type GetIssueResponse struct {
581667 // Issue is the issue.
582668 Issue *Issue `protobuf:"bytes,1,opt,name=issue,proto3" json:"issue,omitempty"`
583669 // Comments are every comment of the issue, oldest first.
584- Comments []*IssueComment `protobuf:"bytes,2,rep,name=comments,proto3" json:"comments,omitempty"`
670+ Comments []*IssueComment `protobuf:"bytes,2,rep,name=comments,proto3" json:"comments,omitempty"`
671+ // References are the merge requests naming the issue, ascending by number,
672+ // at most 100.
673+ References []*IssueReference `protobuf:"bytes,3,rep,name=references,proto3" json:"references,omitempty"`
585674 unknownFields protoimpl.UnknownFields
586675 sizeCache protoimpl.SizeCache
587676 }
588677
589678 func (x *GetIssueResponse) Reset() {
590679 *x = GetIssueResponse{}
591- mi := &file_ermite_issue_proto_msgTypes[7]
680+ mi := &file_ermite_issue_proto_msgTypes[8]
592681 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
593682 ms.StoreMessageInfo(mi)
594683 }
@@ -600,7 +689,7 @@ func (x *GetIssueResponse) String() string {
600689 func (*GetIssueResponse) ProtoMessage() {}
601690
602691 func (x *GetIssueResponse) ProtoReflect() protoreflect.Message {
603- mi := &file_ermite_issue_proto_msgTypes[7]
692+ mi := &file_ermite_issue_proto_msgTypes[8]
604693 if x != nil {
605694 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
606695 if ms.LoadMessageInfo() == nil {
@@ -613,7 +702,7 @@ func (x *GetIssueResponse) ProtoReflect() protoreflect.Message {
613702
614703 // Deprecated: Use GetIssueResponse.ProtoReflect.Descriptor instead.
615704 func (*GetIssueResponse) Descriptor() ([]byte, []int) {
616- return file_ermite_issue_proto_rawDescGZIP(), []int{7}
705+ return file_ermite_issue_proto_rawDescGZIP(), []int{8}
617706 }
618707
619708 func (x *GetIssueResponse) GetIssue() *Issue {
@@ -630,6 +719,13 @@ func (x *GetIssueResponse) GetComments() []*IssueComment {
630719 return nil
631720 }
632721
722+func (x *GetIssueResponse) GetReferences() []*IssueReference {
723+ if x != nil {
724+ return x.References
725+ }
726+ return nil
727+}
728+
633729 // AddIssueCommentRequest describes the comment to add.
634730 type AddIssueCommentRequest struct {
635731 state protoimpl.MessageState `protogen:"open.v1"`
@@ -645,7 +741,7 @@ type AddIssueCommentRequest struct {
645741
646742 func (x *AddIssueCommentRequest) Reset() {
647743 *x = AddIssueCommentRequest{}
648- mi := &file_ermite_issue_proto_msgTypes[8]
744+ mi := &file_ermite_issue_proto_msgTypes[9]
649745 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
650746 ms.StoreMessageInfo(mi)
651747 }
@@ -657,7 +753,7 @@ func (x *AddIssueCommentRequest) String() string {
657753 func (*AddIssueCommentRequest) ProtoMessage() {}
658754
659755 func (x *AddIssueCommentRequest) ProtoReflect() protoreflect.Message {
660- mi := &file_ermite_issue_proto_msgTypes[8]
756+ mi := &file_ermite_issue_proto_msgTypes[9]
661757 if x != nil {
662758 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
663759 if ms.LoadMessageInfo() == nil {
@@ -670,7 +766,7 @@ func (x *AddIssueCommentRequest) ProtoReflect() protoreflect.Message {
670766
671767 // Deprecated: Use AddIssueCommentRequest.ProtoReflect.Descriptor instead.
672768 func (*AddIssueCommentRequest) Descriptor() ([]byte, []int) {
673- return file_ermite_issue_proto_rawDescGZIP(), []int{8}
769+ return file_ermite_issue_proto_rawDescGZIP(), []int{9}
674770 }
675771
676772 func (x *AddIssueCommentRequest) GetRepo() string {
@@ -705,7 +801,7 @@ type AddIssueCommentResponse struct {
705801
706802 func (x *AddIssueCommentResponse) Reset() {
707803 *x = AddIssueCommentResponse{}
708- mi := &file_ermite_issue_proto_msgTypes[9]
804+ mi := &file_ermite_issue_proto_msgTypes[10]
709805 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
710806 ms.StoreMessageInfo(mi)
711807 }
@@ -717,7 +813,7 @@ func (x *AddIssueCommentResponse) String() string {
717813 func (*AddIssueCommentResponse) ProtoMessage() {}
718814
719815 func (x *AddIssueCommentResponse) ProtoReflect() protoreflect.Message {
720- mi := &file_ermite_issue_proto_msgTypes[9]
816+ mi := &file_ermite_issue_proto_msgTypes[10]
721817 if x != nil {
722818 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
723819 if ms.LoadMessageInfo() == nil {
@@ -730,7 +826,7 @@ func (x *AddIssueCommentResponse) ProtoReflect() protoreflect.Message {
730826
731827 // Deprecated: Use AddIssueCommentResponse.ProtoReflect.Descriptor instead.
732828 func (*AddIssueCommentResponse) Descriptor() ([]byte, []int) {
733- return file_ermite_issue_proto_rawDescGZIP(), []int{9}
829+ return file_ermite_issue_proto_rawDescGZIP(), []int{10}
734830 }
735831
736832 func (x *AddIssueCommentResponse) GetComment() *IssueComment {
@@ -753,7 +849,7 @@ type CloseIssueRequest struct {
753849
754850 func (x *CloseIssueRequest) Reset() {
755851 *x = CloseIssueRequest{}
756- mi := &file_ermite_issue_proto_msgTypes[10]
852+ mi := &file_ermite_issue_proto_msgTypes[11]
757853 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
758854 ms.StoreMessageInfo(mi)
759855 }
@@ -765,7 +861,7 @@ func (x *CloseIssueRequest) String() string {
765861 func (*CloseIssueRequest) ProtoMessage() {}
766862
767863 func (x *CloseIssueRequest) ProtoReflect() protoreflect.Message {
768- mi := &file_ermite_issue_proto_msgTypes[10]
864+ mi := &file_ermite_issue_proto_msgTypes[11]
769865 if x != nil {
770866 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
771867 if ms.LoadMessageInfo() == nil {
@@ -778,7 +874,7 @@ func (x *CloseIssueRequest) ProtoReflect() protoreflect.Message {
778874
779875 // Deprecated: Use CloseIssueRequest.ProtoReflect.Descriptor instead.
780876 func (*CloseIssueRequest) Descriptor() ([]byte, []int) {
781- return file_ermite_issue_proto_rawDescGZIP(), []int{10}
877+ return file_ermite_issue_proto_rawDescGZIP(), []int{11}
782878 }
783879
784880 func (x *CloseIssueRequest) GetRepo() string {
@@ -806,7 +902,7 @@ type CloseIssueResponse struct {
806902
807903 func (x *CloseIssueResponse) Reset() {
808904 *x = CloseIssueResponse{}
809- mi := &file_ermite_issue_proto_msgTypes[11]
905+ mi := &file_ermite_issue_proto_msgTypes[12]
810906 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
811907 ms.StoreMessageInfo(mi)
812908 }
@@ -818,7 +914,7 @@ func (x *CloseIssueResponse) String() string {
818914 func (*CloseIssueResponse) ProtoMessage() {}
819915
820916 func (x *CloseIssueResponse) ProtoReflect() protoreflect.Message {
821- mi := &file_ermite_issue_proto_msgTypes[11]
917+ mi := &file_ermite_issue_proto_msgTypes[12]
822918 if x != nil {
823919 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
824920 if ms.LoadMessageInfo() == nil {
@@ -831,7 +927,7 @@ func (x *CloseIssueResponse) ProtoReflect() protoreflect.Message {
831927
832928 // Deprecated: Use CloseIssueResponse.ProtoReflect.Descriptor instead.
833929 func (*CloseIssueResponse) Descriptor() ([]byte, []int) {
834- return file_ermite_issue_proto_rawDescGZIP(), []int{11}
930+ return file_ermite_issue_proto_rawDescGZIP(), []int{12}
835931 }
836932
837933 func (x *CloseIssueResponse) GetIssue() *Issue {
@@ -854,7 +950,7 @@ type ReopenIssueRequest struct {
854950
855951 func (x *ReopenIssueRequest) Reset() {
856952 *x = ReopenIssueRequest{}
857- mi := &file_ermite_issue_proto_msgTypes[12]
953+ mi := &file_ermite_issue_proto_msgTypes[13]
858954 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
859955 ms.StoreMessageInfo(mi)
860956 }
@@ -866,7 +962,7 @@ func (x *ReopenIssueRequest) String() string {
866962 func (*ReopenIssueRequest) ProtoMessage() {}
867963
868964 func (x *ReopenIssueRequest) ProtoReflect() protoreflect.Message {
869- mi := &file_ermite_issue_proto_msgTypes[12]
965+ mi := &file_ermite_issue_proto_msgTypes[13]
870966 if x != nil {
871967 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
872968 if ms.LoadMessageInfo() == nil {
@@ -879,7 +975,7 @@ func (x *ReopenIssueRequest) ProtoReflect() protoreflect.Message {
879975
880976 // Deprecated: Use ReopenIssueRequest.ProtoReflect.Descriptor instead.
881977 func (*ReopenIssueRequest) Descriptor() ([]byte, []int) {
882- return file_ermite_issue_proto_rawDescGZIP(), []int{12}
978+ return file_ermite_issue_proto_rawDescGZIP(), []int{13}
883979 }
884980
885981 func (x *ReopenIssueRequest) GetRepo() string {
@@ -907,7 +1003,7 @@ type ReopenIssueResponse struct {
9071003
9081004 func (x *ReopenIssueResponse) Reset() {
9091005 *x = ReopenIssueResponse{}
910- mi := &file_ermite_issue_proto_msgTypes[13]
1006+ mi := &file_ermite_issue_proto_msgTypes[14]
9111007 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
9121008 ms.StoreMessageInfo(mi)
9131009 }
@@ -919,7 +1015,7 @@ func (x *ReopenIssueResponse) String() string {
9191015 func (*ReopenIssueResponse) ProtoMessage() {}
9201016
9211017 func (x *ReopenIssueResponse) ProtoReflect() protoreflect.Message {
922- mi := &file_ermite_issue_proto_msgTypes[13]
1018+ mi := &file_ermite_issue_proto_msgTypes[14]
9231019 if x != nil {
9241020 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
9251021 if ms.LoadMessageInfo() == nil {
@@ -932,7 +1028,7 @@ func (x *ReopenIssueResponse) ProtoReflect() protoreflect.Message {
9321028
9331029 // Deprecated: Use ReopenIssueResponse.ProtoReflect.Descriptor instead.
9341030 func (*ReopenIssueResponse) Descriptor() ([]byte, []int) {
935- return file_ermite_issue_proto_rawDescGZIP(), []int{13}
1031+ return file_ermite_issue_proto_rawDescGZIP(), []int{14}
9361032 }
9371033
9381034 func (x *ReopenIssueResponse) GetIssue() *Issue {
@@ -965,7 +1061,7 @@ type PendingIssue struct {
9651061
9661062 func (x *PendingIssue) Reset() {
9671063 *x = PendingIssue{}
968- mi := &file_ermite_issue_proto_msgTypes[14]
1064+ mi := &file_ermite_issue_proto_msgTypes[15]
9691065 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
9701066 ms.StoreMessageInfo(mi)
9711067 }
@@ -977,7 +1073,7 @@ func (x *PendingIssue) String() string {
9771073 func (*PendingIssue) ProtoMessage() {}
9781074
9791075 func (x *PendingIssue) ProtoReflect() protoreflect.Message {
980- mi := &file_ermite_issue_proto_msgTypes[14]
1076+ mi := &file_ermite_issue_proto_msgTypes[15]
9811077 if x != nil {
9821078 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
9831079 if ms.LoadMessageInfo() == nil {
@@ -990,7 +1086,7 @@ func (x *PendingIssue) ProtoReflect() protoreflect.Message {
9901086
9911087 // Deprecated: Use PendingIssue.ProtoReflect.Descriptor instead.
9921088 func (*PendingIssue) Descriptor() ([]byte, []int) {
993- return file_ermite_issue_proto_rawDescGZIP(), []int{14}
1089+ return file_ermite_issue_proto_rawDescGZIP(), []int{15}
9941090 }
9951091
9961092 func (x *PendingIssue) GetId() string {
@@ -1052,7 +1148,7 @@ type ListPendingIssuesRequest struct {
10521148
10531149 func (x *ListPendingIssuesRequest) Reset() {
10541150 *x = ListPendingIssuesRequest{}
1055- mi := &file_ermite_issue_proto_msgTypes[15]
1151+ mi := &file_ermite_issue_proto_msgTypes[16]
10561152 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
10571153 ms.StoreMessageInfo(mi)
10581154 }
@@ -1064,7 +1160,7 @@ func (x *ListPendingIssuesRequest) String() string {
10641160 func (*ListPendingIssuesRequest) ProtoMessage() {}
10651161
10661162 func (x *ListPendingIssuesRequest) ProtoReflect() protoreflect.Message {
1067- mi := &file_ermite_issue_proto_msgTypes[15]
1163+ mi := &file_ermite_issue_proto_msgTypes[16]
10681164 if x != nil {
10691165 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
10701166 if ms.LoadMessageInfo() == nil {
@@ -1077,7 +1173,7 @@ func (x *ListPendingIssuesRequest) ProtoReflect() protoreflect.Message {
10771173
10781174 // Deprecated: Use ListPendingIssuesRequest.ProtoReflect.Descriptor instead.
10791175 func (*ListPendingIssuesRequest) Descriptor() ([]byte, []int) {
1080- return file_ermite_issue_proto_rawDescGZIP(), []int{15}
1176+ return file_ermite_issue_proto_rawDescGZIP(), []int{16}
10811177 }
10821178
10831179 func (x *ListPendingIssuesRequest) GetRepo() string {
@@ -1115,7 +1211,7 @@ type ListPendingIssuesResponse struct {
11151211
11161212 func (x *ListPendingIssuesResponse) Reset() {
11171213 *x = ListPendingIssuesResponse{}
1118- mi := &file_ermite_issue_proto_msgTypes[16]
1214+ mi := &file_ermite_issue_proto_msgTypes[17]
11191215 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
11201216 ms.StoreMessageInfo(mi)
11211217 }
@@ -1127,7 +1223,7 @@ func (x *ListPendingIssuesResponse) String() string {
11271223 func (*ListPendingIssuesResponse) ProtoMessage() {}
11281224
11291225 func (x *ListPendingIssuesResponse) ProtoReflect() protoreflect.Message {
1130- mi := &file_ermite_issue_proto_msgTypes[16]
1226+ mi := &file_ermite_issue_proto_msgTypes[17]
11311227 if x != nil {
11321228 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
11331229 if ms.LoadMessageInfo() == nil {
@@ -1140,7 +1236,7 @@ func (x *ListPendingIssuesResponse) ProtoReflect() protoreflect.Message {
11401236
11411237 // Deprecated: Use ListPendingIssuesResponse.ProtoReflect.Descriptor instead.
11421238 func (*ListPendingIssuesResponse) Descriptor() ([]byte, []int) {
1143- return file_ermite_issue_proto_rawDescGZIP(), []int{16}
1239+ return file_ermite_issue_proto_rawDescGZIP(), []int{17}
11441240 }
11451241
11461242 func (x *ListPendingIssuesResponse) GetIssues() []*PendingIssue {
@@ -1170,7 +1266,7 @@ type ApproveIssueRequest struct {
11701266
11711267 func (x *ApproveIssueRequest) Reset() {
11721268 *x = ApproveIssueRequest{}
1173- mi := &file_ermite_issue_proto_msgTypes[17]
1269+ mi := &file_ermite_issue_proto_msgTypes[18]
11741270 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
11751271 ms.StoreMessageInfo(mi)
11761272 }
@@ -1182,7 +1278,7 @@ func (x *ApproveIssueRequest) String() string {
11821278 func (*ApproveIssueRequest) ProtoMessage() {}
11831279
11841280 func (x *ApproveIssueRequest) ProtoReflect() protoreflect.Message {
1185- mi := &file_ermite_issue_proto_msgTypes[17]
1281+ mi := &file_ermite_issue_proto_msgTypes[18]
11861282 if x != nil {
11871283 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
11881284 if ms.LoadMessageInfo() == nil {
@@ -1195,7 +1291,7 @@ func (x *ApproveIssueRequest) ProtoReflect() protoreflect.Message {
11951291
11961292 // Deprecated: Use ApproveIssueRequest.ProtoReflect.Descriptor instead.
11971293 func (*ApproveIssueRequest) Descriptor() ([]byte, []int) {
1198- return file_ermite_issue_proto_rawDescGZIP(), []int{17}
1294+ return file_ermite_issue_proto_rawDescGZIP(), []int{18}
11991295 }
12001296
12011297 func (x *ApproveIssueRequest) GetRepo() string {
@@ -1224,7 +1320,7 @@ type ApproveIssueResponse struct {
12241320
12251321 func (x *ApproveIssueResponse) Reset() {
12261322 *x = ApproveIssueResponse{}
1227- mi := &file_ermite_issue_proto_msgTypes[18]
1323+ mi := &file_ermite_issue_proto_msgTypes[19]
12281324 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
12291325 ms.StoreMessageInfo(mi)
12301326 }
@@ -1236,7 +1332,7 @@ func (x *ApproveIssueResponse) String() string {
12361332 func (*ApproveIssueResponse) ProtoMessage() {}
12371333
12381334 func (x *ApproveIssueResponse) ProtoReflect() protoreflect.Message {
1239- mi := &file_ermite_issue_proto_msgTypes[18]
1335+ mi := &file_ermite_issue_proto_msgTypes[19]
12401336 if x != nil {
12411337 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
12421338 if ms.LoadMessageInfo() == nil {
@@ -1249,7 +1345,7 @@ func (x *ApproveIssueResponse) ProtoReflect() protoreflect.Message {
12491345
12501346 // Deprecated: Use ApproveIssueResponse.ProtoReflect.Descriptor instead.
12511347 func (*ApproveIssueResponse) Descriptor() ([]byte, []int) {
1252- return file_ermite_issue_proto_rawDescGZIP(), []int{18}
1348+ return file_ermite_issue_proto_rawDescGZIP(), []int{19}
12531349 }
12541350
12551351 func (x *ApproveIssueResponse) GetIssue() *Issue {
@@ -1274,7 +1370,7 @@ type RejectIssueRequest struct {
12741370
12751371 func (x *RejectIssueRequest) Reset() {
12761372 *x = RejectIssueRequest{}
1277- mi := &file_ermite_issue_proto_msgTypes[19]
1373+ mi := &file_ermite_issue_proto_msgTypes[20]
12781374 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
12791375 ms.StoreMessageInfo(mi)
12801376 }
@@ -1286,7 +1382,7 @@ func (x *RejectIssueRequest) String() string {
12861382 func (*RejectIssueRequest) ProtoMessage() {}
12871383
12881384 func (x *RejectIssueRequest) ProtoReflect() protoreflect.Message {
1289- mi := &file_ermite_issue_proto_msgTypes[19]
1385+ mi := &file_ermite_issue_proto_msgTypes[20]
12901386 if x != nil {
12911387 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
12921388 if ms.LoadMessageInfo() == nil {
@@ -1299,7 +1395,7 @@ func (x *RejectIssueRequest) ProtoReflect() protoreflect.Message {
12991395
13001396 // Deprecated: Use RejectIssueRequest.ProtoReflect.Descriptor instead.
13011397 func (*RejectIssueRequest) Descriptor() ([]byte, []int) {
1302- return file_ermite_issue_proto_rawDescGZIP(), []int{19}
1398+ return file_ermite_issue_proto_rawDescGZIP(), []int{20}
13031399 }
13041400
13051401 func (x *RejectIssueRequest) GetRepo() string {
@@ -1332,7 +1428,7 @@ type RejectIssueResponse struct {
13321428
13331429 func (x *RejectIssueResponse) Reset() {
13341430 *x = RejectIssueResponse{}
1335- mi := &file_ermite_issue_proto_msgTypes[20]
1431+ mi := &file_ermite_issue_proto_msgTypes[21]
13361432 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
13371433 ms.StoreMessageInfo(mi)
13381434 }
@@ -1344,7 +1440,7 @@ func (x *RejectIssueResponse) String() string {
13441440 func (*RejectIssueResponse) ProtoMessage() {}
13451441
13461442 func (x *RejectIssueResponse) ProtoReflect() protoreflect.Message {
1347- mi := &file_ermite_issue_proto_msgTypes[20]
1443+ mi := &file_ermite_issue_proto_msgTypes[21]
13481444 if x != nil {
13491445 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
13501446 if ms.LoadMessageInfo() == nil {
@@ -1357,14 +1453,14 @@ func (x *RejectIssueResponse) ProtoReflect() protoreflect.Message {
13571453
13581454 // Deprecated: Use RejectIssueResponse.ProtoReflect.Descriptor instead.
13591455 func (*RejectIssueResponse) Descriptor() ([]byte, []int) {
1360- return file_ermite_issue_proto_rawDescGZIP(), []int{20}
1456+ return file_ermite_issue_proto_rawDescGZIP(), []int{21}
13611457 }
13621458
13631459 var File_ermite_issue_proto protoreflect.FileDescriptor
13641460
13651461 const file_ermite_issue_proto_rawDesc = "" +
13661462 "\n" +
1367- "\x12ermite/issue.proto\x12\x06ermite\x1a\x1fgoogle/protobuf/timestamp.proto\"\xba\x02\n" +
1463+ "\x12ermite/issue.proto\x12\x06ermite\x1a\x1aermite/merge_request.proto\x1a\x1fgoogle/protobuf/timestamp.proto\"\xf1\x02\n" +
13681464 "\x05Issue\x12\x12\n" +
13691465 "\x04repo\x18\x01 \x01(\tR\x04repo\x12\x16\n" +
13701466 "\x06number\x18\x02 \x01(\x03R\x06number\x12\x14\n" +
@@ -1376,7 +1472,14 @@ const file_ermite_issue_proto_rawDesc = "" +
13761472 "created_at\x18\a \x01(\v2\x1a.google.protobuf.TimestampR\tcreatedAt\x129\n" +
13771473 "\n" +
13781474 "updated_at\x18\b \x01(\v2\x1a.google.protobuf.TimestampR\tupdatedAt\x12#\n" +
1379- "\rcomment_count\x18\t \x01(\x05R\fcommentCount\"\x85\x01\n" +
1475+ "\rcomment_count\x18\t \x01(\x05R\fcommentCount\x125\n" +
1476+ "\x17closed_by_merge_request\x18\n" +
1477+ " \x01(\x03R\x14closedByMergeRequest\"\x87\x01\n" +
1478+ "\x0eIssueReference\x12\x16\n" +
1479+ "\x06number\x18\x01 \x01(\x03R\x06number\x12\x14\n" +
1480+ "\x05title\x18\x02 \x01(\tR\x05title\x12/\n" +
1481+ "\x05state\x18\x03 \x01(\x0e2\x19.ermite.MergeRequestStateR\x05state\x12\x16\n" +
1482+ "\x06closes\x18\x04 \x01(\bR\x06closes\"\x85\x01\n" +
13801483 "\fIssueComment\x12\x0e\n" +
13811484 "\x02id\x18\x01 \x01(\tR\x02id\x12\x16\n" +
13821485 "\x06author\x18\x02 \x01(\tR\x06author\x12\x12\n" +
@@ -1400,10 +1503,13 @@ const file_ermite_issue_proto_rawDesc = "" +
14001503 "\x0fnext_page_token\x18\x02 \x01(\tR\rnextPageToken\"=\n" +
14011504 "\x0fGetIssueRequest\x12\x12\n" +
14021505 "\x04repo\x18\x01 \x01(\tR\x04repo\x12\x16\n" +
1403- "\x06number\x18\x02 \x01(\x03R\x06number\"i\n" +
1506+ "\x06number\x18\x02 \x01(\x03R\x06number\"\xa1\x01\n" +
14041507 "\x10GetIssueResponse\x12#\n" +
14051508 "\x05issue\x18\x01 \x01(\v2\r.ermite.IssueR\x05issue\x120\n" +
1406- "\bcomments\x18\x02 \x03(\v2\x14.ermite.IssueCommentR\bcomments\"X\n" +
1509+ "\bcomments\x18\x02 \x03(\v2\x14.ermite.IssueCommentR\bcomments\x126\n" +
1510+ "\n" +
1511+ "references\x18\x03 \x03(\v2\x16.ermite.IssueReferenceR\n" +
1512+ "references\"X\n" +
14071513 "\x16AddIssueCommentRequest\x12\x12\n" +
14081514 "\x04repo\x18\x01 \x01(\tR\x04repo\x12\x16\n" +
14091515 "\x06number\x18\x02 \x01(\x03R\x06number\x12\x12\n" +
@@ -1481,71 +1587,75 @@ func file_ermite_issue_proto_rawDescGZIP() []byte {
14811587 }
14821588
14831589 var file_ermite_issue_proto_enumTypes = make([]protoimpl.EnumInfo, 1)
1484-var file_ermite_issue_proto_msgTypes = make([]protoimpl.MessageInfo, 21)
1590+var file_ermite_issue_proto_msgTypes = make([]protoimpl.MessageInfo, 22)
14851591 var file_ermite_issue_proto_goTypes = []any{
14861592 (IssueState)(0), // 0: ermite.IssueState
14871593 (*Issue)(nil), // 1: ermite.Issue
1488- (*IssueComment)(nil), // 2: ermite.IssueComment
1489- (*CreateIssueRequest)(nil), // 3: ermite.CreateIssueRequest
1490- (*CreateIssueResponse)(nil), // 4: ermite.CreateIssueResponse
1491- (*ListIssuesRequest)(nil), // 5: ermite.ListIssuesRequest
1492- (*ListIssuesResponse)(nil), // 6: ermite.ListIssuesResponse
1493- (*GetIssueRequest)(nil), // 7: ermite.GetIssueRequest
1494- (*GetIssueResponse)(nil), // 8: ermite.GetIssueResponse
1495- (*AddIssueCommentRequest)(nil), // 9: ermite.AddIssueCommentRequest
1496- (*AddIssueCommentResponse)(nil), // 10: ermite.AddIssueCommentResponse
1497- (*CloseIssueRequest)(nil), // 11: ermite.CloseIssueRequest
1498- (*CloseIssueResponse)(nil), // 12: ermite.CloseIssueResponse
1499- (*ReopenIssueRequest)(nil), // 13: ermite.ReopenIssueRequest
1500- (*ReopenIssueResponse)(nil), // 14: ermite.ReopenIssueResponse
1501- (*PendingIssue)(nil), // 15: ermite.PendingIssue
1502- (*ListPendingIssuesRequest)(nil), // 16: ermite.ListPendingIssuesRequest
1503- (*ListPendingIssuesResponse)(nil), // 17: ermite.ListPendingIssuesResponse
1504- (*ApproveIssueRequest)(nil), // 18: ermite.ApproveIssueRequest
1505- (*ApproveIssueResponse)(nil), // 19: ermite.ApproveIssueResponse
1506- (*RejectIssueRequest)(nil), // 20: ermite.RejectIssueRequest
1507- (*RejectIssueResponse)(nil), // 21: ermite.RejectIssueResponse
1508- (*timestamppb.Timestamp)(nil), // 22: google.protobuf.Timestamp
1594+ (*IssueReference)(nil), // 2: ermite.IssueReference
1595+ (*IssueComment)(nil), // 3: ermite.IssueComment
1596+ (*CreateIssueRequest)(nil), // 4: ermite.CreateIssueRequest
1597+ (*CreateIssueResponse)(nil), // 5: ermite.CreateIssueResponse
1598+ (*ListIssuesRequest)(nil), // 6: ermite.ListIssuesRequest
1599+ (*ListIssuesResponse)(nil), // 7: ermite.ListIssuesResponse
1600+ (*GetIssueRequest)(nil), // 8: ermite.GetIssueRequest
1601+ (*GetIssueResponse)(nil), // 9: ermite.GetIssueResponse
1602+ (*AddIssueCommentRequest)(nil), // 10: ermite.AddIssueCommentRequest
1603+ (*AddIssueCommentResponse)(nil), // 11: ermite.AddIssueCommentResponse
1604+ (*CloseIssueRequest)(nil), // 12: ermite.CloseIssueRequest
1605+ (*CloseIssueResponse)(nil), // 13: ermite.CloseIssueResponse
1606+ (*ReopenIssueRequest)(nil), // 14: ermite.ReopenIssueRequest
1607+ (*ReopenIssueResponse)(nil), // 15: ermite.ReopenIssueResponse
1608+ (*PendingIssue)(nil), // 16: ermite.PendingIssue
1609+ (*ListPendingIssuesRequest)(nil), // 17: ermite.ListPendingIssuesRequest
1610+ (*ListPendingIssuesResponse)(nil), // 18: ermite.ListPendingIssuesResponse
1611+ (*ApproveIssueRequest)(nil), // 19: ermite.ApproveIssueRequest
1612+ (*ApproveIssueResponse)(nil), // 20: ermite.ApproveIssueResponse
1613+ (*RejectIssueRequest)(nil), // 21: ermite.RejectIssueRequest
1614+ (*RejectIssueResponse)(nil), // 22: ermite.RejectIssueResponse
1615+ (*timestamppb.Timestamp)(nil), // 23: google.protobuf.Timestamp
1616+ (MergeRequestState)(0), // 24: ermite.MergeRequestState
15091617 }
15101618 var file_ermite_issue_proto_depIdxs = []int32{
15111619 0, // 0: ermite.Issue.state:type_name -> ermite.IssueState
1512- 22, // 1: ermite.Issue.created_at:type_name -> google.protobuf.Timestamp
1513- 22, // 2: ermite.Issue.updated_at:type_name -> google.protobuf.Timestamp
1514- 22, // 3: ermite.IssueComment.created_at:type_name -> google.protobuf.Timestamp
1515- 1, // 4: ermite.CreateIssueResponse.issue:type_name -> ermite.Issue
1516- 0, // 5: ermite.ListIssuesRequest.state:type_name -> ermite.IssueState
1517- 1, // 6: ermite.ListIssuesResponse.issues:type_name -> ermite.Issue
1518- 1, // 7: ermite.GetIssueResponse.issue:type_name -> ermite.Issue
1519- 2, // 8: ermite.GetIssueResponse.comments:type_name -> ermite.IssueComment
1520- 2, // 9: ermite.AddIssueCommentResponse.comment:type_name -> ermite.IssueComment
1521- 1, // 10: ermite.CloseIssueResponse.issue:type_name -> ermite.Issue
1522- 1, // 11: ermite.ReopenIssueResponse.issue:type_name -> ermite.Issue
1523- 22, // 12: ermite.PendingIssue.created_at:type_name -> google.protobuf.Timestamp
1524- 15, // 13: ermite.ListPendingIssuesResponse.issues:type_name -> ermite.PendingIssue
1525- 1, // 14: ermite.ApproveIssueResponse.issue:type_name -> ermite.Issue
1526- 3, // 15: ermite.IssueService.CreateIssue:input_type -> ermite.CreateIssueRequest
1527- 5, // 16: ermite.IssueService.ListIssues:input_type -> ermite.ListIssuesRequest
1528- 7, // 17: ermite.IssueService.GetIssue:input_type -> ermite.GetIssueRequest
1529- 9, // 18: ermite.IssueService.AddIssueComment:input_type -> ermite.AddIssueCommentRequest
1530- 11, // 19: ermite.IssueService.CloseIssue:input_type -> ermite.CloseIssueRequest
1531- 13, // 20: ermite.IssueService.ReopenIssue:input_type -> ermite.ReopenIssueRequest
1532- 16, // 21: ermite.IssueService.ListPendingIssues:input_type -> ermite.ListPendingIssuesRequest
1533- 18, // 22: ermite.IssueService.ApproveIssue:input_type -> ermite.ApproveIssueRequest
1534- 20, // 23: ermite.IssueService.RejectIssue:input_type -> ermite.RejectIssueRequest
1535- 4, // 24: ermite.IssueService.CreateIssue:output_type -> ermite.CreateIssueResponse
1536- 6, // 25: ermite.IssueService.ListIssues:output_type -> ermite.ListIssuesResponse
1537- 8, // 26: ermite.IssueService.GetIssue:output_type -> ermite.GetIssueResponse
1538- 10, // 27: ermite.IssueService.AddIssueComment:output_type -> ermite.AddIssueCommentResponse
1539- 12, // 28: ermite.IssueService.CloseIssue:output_type -> ermite.CloseIssueResponse
1540- 14, // 29: ermite.IssueService.ReopenIssue:output_type -> ermite.ReopenIssueResponse
1541- 17, // 30: ermite.IssueService.ListPendingIssues:output_type -> ermite.ListPendingIssuesResponse
1542- 19, // 31: ermite.IssueService.ApproveIssue:output_type -> ermite.ApproveIssueResponse
1543- 21, // 32: ermite.IssueService.RejectIssue:output_type -> ermite.RejectIssueResponse
1544- 24, // [24:33] is the sub-list for method output_type
1545- 15, // [15:24] is the sub-list for method input_type
1546- 15, // [15:15] is the sub-list for extension type_name
1547- 15, // [15:15] is the sub-list for extension extendee
1548- 0, // [0:15] is the sub-list for field type_name
1620+ 23, // 1: ermite.Issue.created_at:type_name -> google.protobuf.Timestamp
1621+ 23, // 2: ermite.Issue.updated_at:type_name -> google.protobuf.Timestamp
1622+ 24, // 3: ermite.IssueReference.state:type_name -> ermite.MergeRequestState
1623+ 23, // 4: ermite.IssueComment.created_at:type_name -> google.protobuf.Timestamp
1624+ 1, // 5: ermite.CreateIssueResponse.issue:type_name -> ermite.Issue
1625+ 0, // 6: ermite.ListIssuesRequest.state:type_name -> ermite.IssueState
1626+ 1, // 7: ermite.ListIssuesResponse.issues:type_name -> ermite.Issue
1627+ 1, // 8: ermite.GetIssueResponse.issue:type_name -> ermite.Issue
1628+ 3, // 9: ermite.GetIssueResponse.comments:type_name -> ermite.IssueComment
1629+ 2, // 10: ermite.GetIssueResponse.references:type_name -> ermite.IssueReference
1630+ 3, // 11: ermite.AddIssueCommentResponse.comment:type_name -> ermite.IssueComment
1631+ 1, // 12: ermite.CloseIssueResponse.issue:type_name -> ermite.Issue
1632+ 1, // 13: ermite.ReopenIssueResponse.issue:type_name -> ermite.Issue
1633+ 23, // 14: ermite.PendingIssue.created_at:type_name -> google.protobuf.Timestamp
1634+ 16, // 15: ermite.ListPendingIssuesResponse.issues:type_name -> ermite.PendingIssue
1635+ 1, // 16: ermite.ApproveIssueResponse.issue:type_name -> ermite.Issue
1636+ 4, // 17: ermite.IssueService.CreateIssue:input_type -> ermite.CreateIssueRequest
1637+ 6, // 18: ermite.IssueService.ListIssues:input_type -> ermite.ListIssuesRequest
1638+ 8, // 19: ermite.IssueService.GetIssue:input_type -> ermite.GetIssueRequest
1639+ 10, // 20: ermite.IssueService.AddIssueComment:input_type -> ermite.AddIssueCommentRequest
1640+ 12, // 21: ermite.IssueService.CloseIssue:input_type -> ermite.CloseIssueRequest
1641+ 14, // 22: ermite.IssueService.ReopenIssue:input_type -> ermite.ReopenIssueRequest
1642+ 17, // 23: ermite.IssueService.ListPendingIssues:input_type -> ermite.ListPendingIssuesRequest
1643+ 19, // 24: ermite.IssueService.ApproveIssue:input_type -> ermite.ApproveIssueRequest
1644+ 21, // 25: ermite.IssueService.RejectIssue:input_type -> ermite.RejectIssueRequest
1645+ 5, // 26: ermite.IssueService.CreateIssue:output_type -> ermite.CreateIssueResponse
1646+ 7, // 27: ermite.IssueService.ListIssues:output_type -> ermite.ListIssuesResponse
1647+ 9, // 28: ermite.IssueService.GetIssue:output_type -> ermite.GetIssueResponse
1648+ 11, // 29: ermite.IssueService.AddIssueComment:output_type -> ermite.AddIssueCommentResponse
1649+ 13, // 30: ermite.IssueService.CloseIssue:output_type -> ermite.CloseIssueResponse
1650+ 15, // 31: ermite.IssueService.ReopenIssue:output_type -> ermite.ReopenIssueResponse
1651+ 18, // 32: ermite.IssueService.ListPendingIssues:output_type -> ermite.ListPendingIssuesResponse
1652+ 20, // 33: ermite.IssueService.ApproveIssue:output_type -> ermite.ApproveIssueResponse
1653+ 22, // 34: ermite.IssueService.RejectIssue:output_type -> ermite.RejectIssueResponse
1654+ 26, // [26:35] is the sub-list for method output_type
1655+ 17, // [17:26] is the sub-list for method input_type
1656+ 17, // [17:17] is the sub-list for extension type_name
1657+ 17, // [17:17] is the sub-list for extension extendee
1658+ 0, // [0:17] is the sub-list for field type_name
15491659 }
15501660
15511661 func init() { file_ermite_issue_proto_init() }
@@ -1553,13 +1663,14 @@ func file_ermite_issue_proto_init() {
15531663 if File_ermite_issue_proto != nil {
15541664 return
15551665 }
1666+ file_ermite_merge_request_proto_init()
15561667 type x struct{}
15571668 out := protoimpl.TypeBuilder{
15581669 File: protoimpl.DescBuilder{
15591670 GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
15601671 RawDescriptor: unsafe.Slice(unsafe.StringData(file_ermite_issue_proto_rawDesc), len(file_ermite_issue_proto_rawDesc)),
15611672 NumEnums: 1,
1562- NumMessages: 21,
1673+ NumMessages: 22,
15631674 NumExtensions: 0,
15641675 NumServices: 1,
15651676 },
@@ -107,9 +107,13 @@ type Issue struct {
107 // UpdatedAt is when the issue last changed.107 // UpdatedAt is when the issue last changed.
108 UpdatedAt *timestamppb.Timestamp `protobuf:"bytes,8,opt,name=updated_at,json=updatedAt,proto3" json:"updated_at,omitempty"`108 UpdatedAt *timestamppb.Timestamp `protobuf:"bytes,8,opt,name=updated_at,json=updatedAt,proto3" json:"updated_at,omitempty"`
109 // CommentCount is the number of comments on the issue.109 // CommentCount is the number of comments on the issue.
110- CommentCount int32 `protobuf:"varint,9,opt,name=comment_count,json=commentCount,proto3" json:"comment_count,omitempty"`110+ CommentCount int32 `protobuf:"varint,9,opt,name=comment_count,json=commentCount,proto3" json:"comment_count,omitempty"`
111- unknownFields protoimpl.UnknownFields111+ // ClosedByMergeRequest is the number of the merge request whose merge closed
112- sizeCache protoimpl.SizeCache112+ // the issue (a closing reference such as "Fixes #N"); 0 when the issue was
113+ // closed by hand or is open. Reset when the issue is reopened.
114+ ClosedByMergeRequest int64 `protobuf:"varint,10,opt,name=closed_by_merge_request,json=closedByMergeRequest,proto3" json:"closed_by_merge_request,omitempty"`
115+ unknownFields protoimpl.UnknownFields
116+ sizeCache protoimpl.SizeCache
113 }117 }
114 118
115 func (x *Issue) Reset() {119 func (x *Issue) Reset() {
@@ -205,6 +209,88 @@ func (x *Issue) GetCommentCount() int32 {
205 return 0209 return 0
206 }210 }
207 211
212+func (x *Issue) GetClosedByMergeRequest() int64 {
213+ if x != nil {
214+ return x.ClosedByMergeRequest
215+ }
216+ return 0
217+}
218+
219+// IssueReference is a merge request of the same repository that names the
220+// issue ("#N") in its title, description, notes or commit messages.
221+type IssueReference struct {
222+ state protoimpl.MessageState `protogen:"open.v1"`
223+ // Number is the number of the merge request.
224+ Number int64 `protobuf:"varint,1,opt,name=number,proto3" json:"number,omitempty"`
225+ // Title is the title of the merge request.
226+ Title string `protobuf:"bytes,2,opt,name=title,proto3" json:"title,omitempty"`
227+ // State is where the merge request is in its life.
228+ State MergeRequestState `protobuf:"varint,3,opt,name=state,proto3,enum=ermite.MergeRequestState" json:"state,omitempty"`
229+ // Closes says that a closing reference ("Fixes #N") names the issue:
230+ // merging the request closes it.
231+ Closes bool `protobuf:"varint,4,opt,name=closes,proto3" json:"closes,omitempty"`
232+ unknownFields protoimpl.UnknownFields
233+ sizeCache protoimpl.SizeCache
234+}
235+
236+func (x *IssueReference) Reset() {
237+ *x = IssueReference{}
238+ mi := &file_ermite_issue_proto_msgTypes[1]
239+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
240+ ms.StoreMessageInfo(mi)
241+}
242+
243+func (x *IssueReference) String() string {
244+ return protoimpl.X.MessageStringOf(x)
245+}
246+
247+func (*IssueReference) ProtoMessage() {}
248+
249+func (x *IssueReference) ProtoReflect() protoreflect.Message {
250+ mi := &file_ermite_issue_proto_msgTypes[1]
251+ if x != nil {
252+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
253+ if ms.LoadMessageInfo() == nil {
254+ ms.StoreMessageInfo(mi)
255+ }
256+ return ms
257+ }
258+ return mi.MessageOf(x)
259+}
260+
261+// Deprecated: Use IssueReference.ProtoReflect.Descriptor instead.
262+func (*IssueReference) Descriptor() ([]byte, []int) {
263+ return file_ermite_issue_proto_rawDescGZIP(), []int{1}
264+}
265+
266+func (x *IssueReference) GetNumber() int64 {
267+ if x != nil {
268+ return x.Number
269+ }
270+ return 0
271+}
272+
273+func (x *IssueReference) GetTitle() string {
274+ if x != nil {
275+ return x.Title
276+ }
277+ return ""
278+}
279+
280+func (x *IssueReference) GetState() MergeRequestState {
281+ if x != nil {
282+ return x.State
283+ }
284+ return MergeRequestState_MERGE_REQUEST_STATE_UNSPECIFIED
285+}
286+
287+func (x *IssueReference) GetCloses() bool {
288+ if x != nil {
289+ return x.Closes
290+ }
291+ return false
292+}
293+
208 // IssueComment is a note on an issue.294 // IssueComment is a note on an issue.
209 type IssueComment struct {295 type IssueComment struct {
210 state protoimpl.MessageState `protogen:"open.v1"`296 state protoimpl.MessageState `protogen:"open.v1"`
@@ -222,7 +308,7 @@ type IssueComment struct {
222 308
223 func (x *IssueComment) Reset() {309 func (x *IssueComment) Reset() {
224 *x = IssueComment{}310 *x = IssueComment{}
225- mi := &file_ermite_issue_proto_msgTypes[1]311+ mi := &file_ermite_issue_proto_msgTypes[2]
226 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))312 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
227 ms.StoreMessageInfo(mi)313 ms.StoreMessageInfo(mi)
228 }314 }
@@ -234,7 +320,7 @@ func (x *IssueComment) String() string {
234 func (*IssueComment) ProtoMessage() {}320 func (*IssueComment) ProtoMessage() {}
235 321
236 func (x *IssueComment) ProtoReflect() protoreflect.Message {322 func (x *IssueComment) ProtoReflect() protoreflect.Message {
237- mi := &file_ermite_issue_proto_msgTypes[1]323+ mi := &file_ermite_issue_proto_msgTypes[2]
238 if x != nil {324 if x != nil {
239 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))325 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
240 if ms.LoadMessageInfo() == nil {326 if ms.LoadMessageInfo() == nil {
@@ -247,7 +333,7 @@ func (x *IssueComment) ProtoReflect() protoreflect.Message {
247 333
248 // Deprecated: Use IssueComment.ProtoReflect.Descriptor instead.334 // Deprecated: Use IssueComment.ProtoReflect.Descriptor instead.
249 func (*IssueComment) Descriptor() ([]byte, []int) {335 func (*IssueComment) Descriptor() ([]byte, []int) {
250- return file_ermite_issue_proto_rawDescGZIP(), []int{1}336+ return file_ermite_issue_proto_rawDescGZIP(), []int{2}
251 }337 }
252 338
253 func (x *IssueComment) GetId() string {339 func (x *IssueComment) GetId() string {
@@ -293,7 +379,7 @@ type CreateIssueRequest struct {
293 379
294 func (x *CreateIssueRequest) Reset() {380 func (x *CreateIssueRequest) Reset() {
295 *x = CreateIssueRequest{}381 *x = CreateIssueRequest{}
296- mi := &file_ermite_issue_proto_msgTypes[2]382+ mi := &file_ermite_issue_proto_msgTypes[3]
297 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))383 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
298 ms.StoreMessageInfo(mi)384 ms.StoreMessageInfo(mi)
299 }385 }
@@ -305,7 +391,7 @@ func (x *CreateIssueRequest) String() string {
305 func (*CreateIssueRequest) ProtoMessage() {}391 func (*CreateIssueRequest) ProtoMessage() {}
306 392
307 func (x *CreateIssueRequest) ProtoReflect() protoreflect.Message {393 func (x *CreateIssueRequest) ProtoReflect() protoreflect.Message {
308- mi := &file_ermite_issue_proto_msgTypes[2]394+ mi := &file_ermite_issue_proto_msgTypes[3]
309 if x != nil {395 if x != nil {
310 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))396 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
311 if ms.LoadMessageInfo() == nil {397 if ms.LoadMessageInfo() == nil {
@@ -318,7 +404,7 @@ func (x *CreateIssueRequest) ProtoReflect() protoreflect.Message {
318 404
319 // Deprecated: Use CreateIssueRequest.ProtoReflect.Descriptor instead.405 // Deprecated: Use CreateIssueRequest.ProtoReflect.Descriptor instead.
320 func (*CreateIssueRequest) Descriptor() ([]byte, []int) {406 func (*CreateIssueRequest) Descriptor() ([]byte, []int) {
321- return file_ermite_issue_proto_rawDescGZIP(), []int{2}407+ return file_ermite_issue_proto_rawDescGZIP(), []int{3}
322 }408 }
323 409
324 func (x *CreateIssueRequest) GetRepo() string {410 func (x *CreateIssueRequest) GetRepo() string {
@@ -353,7 +439,7 @@ type CreateIssueResponse struct {
353 439
354 func (x *CreateIssueResponse) Reset() {440 func (x *CreateIssueResponse) Reset() {
355 *x = CreateIssueResponse{}441 *x = CreateIssueResponse{}
356- mi := &file_ermite_issue_proto_msgTypes[3]442+ mi := &file_ermite_issue_proto_msgTypes[4]
357 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))443 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
358 ms.StoreMessageInfo(mi)444 ms.StoreMessageInfo(mi)
359 }445 }
@@ -365,7 +451,7 @@ func (x *CreateIssueResponse) String() string {
365 func (*CreateIssueResponse) ProtoMessage() {}451 func (*CreateIssueResponse) ProtoMessage() {}
366 452
367 func (x *CreateIssueResponse) ProtoReflect() protoreflect.Message {453 func (x *CreateIssueResponse) ProtoReflect() protoreflect.Message {
368- mi := &file_ermite_issue_proto_msgTypes[3]454+ mi := &file_ermite_issue_proto_msgTypes[4]
369 if x != nil {455 if x != nil {
370 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))456 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
371 if ms.LoadMessageInfo() == nil {457 if ms.LoadMessageInfo() == nil {
@@ -378,7 +464,7 @@ func (x *CreateIssueResponse) ProtoReflect() protoreflect.Message {
378 464
379 // Deprecated: Use CreateIssueResponse.ProtoReflect.Descriptor instead.465 // Deprecated: Use CreateIssueResponse.ProtoReflect.Descriptor instead.
380 func (*CreateIssueResponse) Descriptor() ([]byte, []int) {466 func (*CreateIssueResponse) Descriptor() ([]byte, []int) {
381- return file_ermite_issue_proto_rawDescGZIP(), []int{3}467+ return file_ermite_issue_proto_rawDescGZIP(), []int{4}
382 }468 }
383 469
384 func (x *CreateIssueResponse) GetIssue() *Issue {470 func (x *CreateIssueResponse) GetIssue() *Issue {
@@ -408,7 +494,7 @@ type ListIssuesRequest struct {
408 494
409 func (x *ListIssuesRequest) Reset() {495 func (x *ListIssuesRequest) Reset() {
410 *x = ListIssuesRequest{}496 *x = ListIssuesRequest{}
411- mi := &file_ermite_issue_proto_msgTypes[4]497+ mi := &file_ermite_issue_proto_msgTypes[5]
412 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))498 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
413 ms.StoreMessageInfo(mi)499 ms.StoreMessageInfo(mi)
414 }500 }
@@ -420,7 +506,7 @@ func (x *ListIssuesRequest) String() string {
420 func (*ListIssuesRequest) ProtoMessage() {}506 func (*ListIssuesRequest) ProtoMessage() {}
421 507
422 func (x *ListIssuesRequest) ProtoReflect() protoreflect.Message {508 func (x *ListIssuesRequest) ProtoReflect() protoreflect.Message {
423- mi := &file_ermite_issue_proto_msgTypes[4]509+ mi := &file_ermite_issue_proto_msgTypes[5]
424 if x != nil {510 if x != nil {
425 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))511 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
426 if ms.LoadMessageInfo() == nil {512 if ms.LoadMessageInfo() == nil {
@@ -433,7 +519,7 @@ func (x *ListIssuesRequest) ProtoReflect() protoreflect.Message {
433 519
434 // Deprecated: Use ListIssuesRequest.ProtoReflect.Descriptor instead.520 // Deprecated: Use ListIssuesRequest.ProtoReflect.Descriptor instead.
435 func (*ListIssuesRequest) Descriptor() ([]byte, []int) {521 func (*ListIssuesRequest) Descriptor() ([]byte, []int) {
436- return file_ermite_issue_proto_rawDescGZIP(), []int{4}522+ return file_ermite_issue_proto_rawDescGZIP(), []int{5}
437 }523 }
438 524
439 func (x *ListIssuesRequest) GetRepo() string {525 func (x *ListIssuesRequest) GetRepo() string {
@@ -478,7 +564,7 @@ type ListIssuesResponse struct {
478 564
479 func (x *ListIssuesResponse) Reset() {565 func (x *ListIssuesResponse) Reset() {
480 *x = ListIssuesResponse{}566 *x = ListIssuesResponse{}
481- mi := &file_ermite_issue_proto_msgTypes[5]567+ mi := &file_ermite_issue_proto_msgTypes[6]
482 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))568 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
483 ms.StoreMessageInfo(mi)569 ms.StoreMessageInfo(mi)
484 }570 }
@@ -490,7 +576,7 @@ func (x *ListIssuesResponse) String() string {
490 func (*ListIssuesResponse) ProtoMessage() {}576 func (*ListIssuesResponse) ProtoMessage() {}
491 577
492 func (x *ListIssuesResponse) ProtoReflect() protoreflect.Message {578 func (x *ListIssuesResponse) ProtoReflect() protoreflect.Message {
493- mi := &file_ermite_issue_proto_msgTypes[5]579+ mi := &file_ermite_issue_proto_msgTypes[6]
494 if x != nil {580 if x != nil {
495 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))581 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
496 if ms.LoadMessageInfo() == nil {582 if ms.LoadMessageInfo() == nil {
@@ -503,7 +589,7 @@ func (x *ListIssuesResponse) ProtoReflect() protoreflect.Message {
503 589
504 // Deprecated: Use ListIssuesResponse.ProtoReflect.Descriptor instead.590 // Deprecated: Use ListIssuesResponse.ProtoReflect.Descriptor instead.
505 func (*ListIssuesResponse) Descriptor() ([]byte, []int) {591 func (*ListIssuesResponse) Descriptor() ([]byte, []int) {
506- return file_ermite_issue_proto_rawDescGZIP(), []int{5}592+ return file_ermite_issue_proto_rawDescGZIP(), []int{6}
507 }593 }
508 594
509 func (x *ListIssuesResponse) GetIssues() []*Issue {595 func (x *ListIssuesResponse) GetIssues() []*Issue {
@@ -533,7 +619,7 @@ type GetIssueRequest struct {
533 619
534 func (x *GetIssueRequest) Reset() {620 func (x *GetIssueRequest) Reset() {
535 *x = GetIssueRequest{}621 *x = GetIssueRequest{}
536- mi := &file_ermite_issue_proto_msgTypes[6]622+ mi := &file_ermite_issue_proto_msgTypes[7]
537 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))623 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
538 ms.StoreMessageInfo(mi)624 ms.StoreMessageInfo(mi)
539 }625 }
@@ -545,7 +631,7 @@ func (x *GetIssueRequest) String() string {
545 func (*GetIssueRequest) ProtoMessage() {}631 func (*GetIssueRequest) ProtoMessage() {}
546 632
547 func (x *GetIssueRequest) ProtoReflect() protoreflect.Message {633 func (x *GetIssueRequest) ProtoReflect() protoreflect.Message {
548- mi := &file_ermite_issue_proto_msgTypes[6]634+ mi := &file_ermite_issue_proto_msgTypes[7]
549 if x != nil {635 if x != nil {
550 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))636 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
551 if ms.LoadMessageInfo() == nil {637 if ms.LoadMessageInfo() == nil {
@@ -558,7 +644,7 @@ func (x *GetIssueRequest) ProtoReflect() protoreflect.Message {
558 644
559 // Deprecated: Use GetIssueRequest.ProtoReflect.Descriptor instead.645 // Deprecated: Use GetIssueRequest.ProtoReflect.Descriptor instead.
560 func (*GetIssueRequest) Descriptor() ([]byte, []int) {646 func (*GetIssueRequest) Descriptor() ([]byte, []int) {
561- return file_ermite_issue_proto_rawDescGZIP(), []int{6}647+ return file_ermite_issue_proto_rawDescGZIP(), []int{7}
562 }648 }
563 649
564 func (x *GetIssueRequest) GetRepo() string {650 func (x *GetIssueRequest) GetRepo() string {
@@ -581,14 +667,17 @@ type GetIssueResponse struct {
581 // Issue is the issue.667 // Issue is the issue.
582 Issue *Issue `protobuf:"bytes,1,opt,name=issue,proto3" json:"issue,omitempty"`668 Issue *Issue `protobuf:"bytes,1,opt,name=issue,proto3" json:"issue,omitempty"`
583 // Comments are every comment of the issue, oldest first.669 // Comments are every comment of the issue, oldest first.
584- Comments []*IssueComment `protobuf:"bytes,2,rep,name=comments,proto3" json:"comments,omitempty"`670+ Comments []*IssueComment `protobuf:"bytes,2,rep,name=comments,proto3" json:"comments,omitempty"`
671+ // References are the merge requests naming the issue, ascending by number,
672+ // at most 100.
673+ References []*IssueReference `protobuf:"bytes,3,rep,name=references,proto3" json:"references,omitempty"`
585 unknownFields protoimpl.UnknownFields674 unknownFields protoimpl.UnknownFields
586 sizeCache protoimpl.SizeCache675 sizeCache protoimpl.SizeCache
587 }676 }
588 677
589 func (x *GetIssueResponse) Reset() {678 func (x *GetIssueResponse) Reset() {
590 *x = GetIssueResponse{}679 *x = GetIssueResponse{}
591- mi := &file_ermite_issue_proto_msgTypes[7]680+ mi := &file_ermite_issue_proto_msgTypes[8]
592 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))681 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
593 ms.StoreMessageInfo(mi)682 ms.StoreMessageInfo(mi)
594 }683 }
@@ -600,7 +689,7 @@ func (x *GetIssueResponse) String() string {
600 func (*GetIssueResponse) ProtoMessage() {}689 func (*GetIssueResponse) ProtoMessage() {}
601 690
602 func (x *GetIssueResponse) ProtoReflect() protoreflect.Message {691 func (x *GetIssueResponse) ProtoReflect() protoreflect.Message {
603- mi := &file_ermite_issue_proto_msgTypes[7]692+ mi := &file_ermite_issue_proto_msgTypes[8]
604 if x != nil {693 if x != nil {
605 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))694 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
606 if ms.LoadMessageInfo() == nil {695 if ms.LoadMessageInfo() == nil {
@@ -613,7 +702,7 @@ func (x *GetIssueResponse) ProtoReflect() protoreflect.Message {
613 702
614 // Deprecated: Use GetIssueResponse.ProtoReflect.Descriptor instead.703 // Deprecated: Use GetIssueResponse.ProtoReflect.Descriptor instead.
615 func (*GetIssueResponse) Descriptor() ([]byte, []int) {704 func (*GetIssueResponse) Descriptor() ([]byte, []int) {
616- return file_ermite_issue_proto_rawDescGZIP(), []int{7}705+ return file_ermite_issue_proto_rawDescGZIP(), []int{8}
617 }706 }
618 707
619 func (x *GetIssueResponse) GetIssue() *Issue {708 func (x *GetIssueResponse) GetIssue() *Issue {
@@ -630,6 +719,13 @@ func (x *GetIssueResponse) GetComments() []*IssueComment {
630 return nil719 return nil
631 }720 }
632 721
722+func (x *GetIssueResponse) GetReferences() []*IssueReference {
723+ if x != nil {
724+ return x.References
725+ }
726+ return nil
727+}
728+
633 // AddIssueCommentRequest describes the comment to add.729 // AddIssueCommentRequest describes the comment to add.
634 type AddIssueCommentRequest struct {730 type AddIssueCommentRequest struct {
635 state protoimpl.MessageState `protogen:"open.v1"`731 state protoimpl.MessageState `protogen:"open.v1"`
@@ -645,7 +741,7 @@ type AddIssueCommentRequest struct {
645 741
646 func (x *AddIssueCommentRequest) Reset() {742 func (x *AddIssueCommentRequest) Reset() {
647 *x = AddIssueCommentRequest{}743 *x = AddIssueCommentRequest{}
648- mi := &file_ermite_issue_proto_msgTypes[8]744+ mi := &file_ermite_issue_proto_msgTypes[9]
649 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))745 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
650 ms.StoreMessageInfo(mi)746 ms.StoreMessageInfo(mi)
651 }747 }
@@ -657,7 +753,7 @@ func (x *AddIssueCommentRequest) String() string {
657 func (*AddIssueCommentRequest) ProtoMessage() {}753 func (*AddIssueCommentRequest) ProtoMessage() {}
658 754
659 func (x *AddIssueCommentRequest) ProtoReflect() protoreflect.Message {755 func (x *AddIssueCommentRequest) ProtoReflect() protoreflect.Message {
660- mi := &file_ermite_issue_proto_msgTypes[8]756+ mi := &file_ermite_issue_proto_msgTypes[9]
661 if x != nil {757 if x != nil {
662 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))758 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
663 if ms.LoadMessageInfo() == nil {759 if ms.LoadMessageInfo() == nil {
@@ -670,7 +766,7 @@ func (x *AddIssueCommentRequest) ProtoReflect() protoreflect.Message {
670 766
671 // Deprecated: Use AddIssueCommentRequest.ProtoReflect.Descriptor instead.767 // Deprecated: Use AddIssueCommentRequest.ProtoReflect.Descriptor instead.
672 func (*AddIssueCommentRequest) Descriptor() ([]byte, []int) {768 func (*AddIssueCommentRequest) Descriptor() ([]byte, []int) {
673- return file_ermite_issue_proto_rawDescGZIP(), []int{8}769+ return file_ermite_issue_proto_rawDescGZIP(), []int{9}
674 }770 }
675 771
676 func (x *AddIssueCommentRequest) GetRepo() string {772 func (x *AddIssueCommentRequest) GetRepo() string {
@@ -705,7 +801,7 @@ type AddIssueCommentResponse struct {
705 801
706 func (x *AddIssueCommentResponse) Reset() {802 func (x *AddIssueCommentResponse) Reset() {
707 *x = AddIssueCommentResponse{}803 *x = AddIssueCommentResponse{}
708- mi := &file_ermite_issue_proto_msgTypes[9]804+ mi := &file_ermite_issue_proto_msgTypes[10]
709 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))805 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
710 ms.StoreMessageInfo(mi)806 ms.StoreMessageInfo(mi)
711 }807 }
@@ -717,7 +813,7 @@ func (x *AddIssueCommentResponse) String() string {
717 func (*AddIssueCommentResponse) ProtoMessage() {}813 func (*AddIssueCommentResponse) ProtoMessage() {}
718 814
719 func (x *AddIssueCommentResponse) ProtoReflect() protoreflect.Message {815 func (x *AddIssueCommentResponse) ProtoReflect() protoreflect.Message {
720- mi := &file_ermite_issue_proto_msgTypes[9]816+ mi := &file_ermite_issue_proto_msgTypes[10]
721 if x != nil {817 if x != nil {
722 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))818 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
723 if ms.LoadMessageInfo() == nil {819 if ms.LoadMessageInfo() == nil {
@@ -730,7 +826,7 @@ func (x *AddIssueCommentResponse) ProtoReflect() protoreflect.Message {
730 826
731 // Deprecated: Use AddIssueCommentResponse.ProtoReflect.Descriptor instead.827 // Deprecated: Use AddIssueCommentResponse.ProtoReflect.Descriptor instead.
732 func (*AddIssueCommentResponse) Descriptor() ([]byte, []int) {828 func (*AddIssueCommentResponse) Descriptor() ([]byte, []int) {
733- return file_ermite_issue_proto_rawDescGZIP(), []int{9}829+ return file_ermite_issue_proto_rawDescGZIP(), []int{10}
734 }830 }
735 831
736 func (x *AddIssueCommentResponse) GetComment() *IssueComment {832 func (x *AddIssueCommentResponse) GetComment() *IssueComment {
@@ -753,7 +849,7 @@ type CloseIssueRequest struct {
753 849
754 func (x *CloseIssueRequest) Reset() {850 func (x *CloseIssueRequest) Reset() {
755 *x = CloseIssueRequest{}851 *x = CloseIssueRequest{}
756- mi := &file_ermite_issue_proto_msgTypes[10]852+ mi := &file_ermite_issue_proto_msgTypes[11]
757 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))853 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
758 ms.StoreMessageInfo(mi)854 ms.StoreMessageInfo(mi)
759 }855 }
@@ -765,7 +861,7 @@ func (x *CloseIssueRequest) String() string {
765 func (*CloseIssueRequest) ProtoMessage() {}861 func (*CloseIssueRequest) ProtoMessage() {}
766 862
767 func (x *CloseIssueRequest) ProtoReflect() protoreflect.Message {863 func (x *CloseIssueRequest) ProtoReflect() protoreflect.Message {
768- mi := &file_ermite_issue_proto_msgTypes[10]864+ mi := &file_ermite_issue_proto_msgTypes[11]
769 if x != nil {865 if x != nil {
770 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))866 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
771 if ms.LoadMessageInfo() == nil {867 if ms.LoadMessageInfo() == nil {
@@ -778,7 +874,7 @@ func (x *CloseIssueRequest) ProtoReflect() protoreflect.Message {
778 874
779 // Deprecated: Use CloseIssueRequest.ProtoReflect.Descriptor instead.875 // Deprecated: Use CloseIssueRequest.ProtoReflect.Descriptor instead.
780 func (*CloseIssueRequest) Descriptor() ([]byte, []int) {876 func (*CloseIssueRequest) Descriptor() ([]byte, []int) {
781- return file_ermite_issue_proto_rawDescGZIP(), []int{10}877+ return file_ermite_issue_proto_rawDescGZIP(), []int{11}
782 }878 }
783 879
784 func (x *CloseIssueRequest) GetRepo() string {880 func (x *CloseIssueRequest) GetRepo() string {
@@ -806,7 +902,7 @@ type CloseIssueResponse struct {
806 902
807 func (x *CloseIssueResponse) Reset() {903 func (x *CloseIssueResponse) Reset() {
808 *x = CloseIssueResponse{}904 *x = CloseIssueResponse{}
809- mi := &file_ermite_issue_proto_msgTypes[11]905+ mi := &file_ermite_issue_proto_msgTypes[12]
810 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))906 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
811 ms.StoreMessageInfo(mi)907 ms.StoreMessageInfo(mi)
812 }908 }
@@ -818,7 +914,7 @@ func (x *CloseIssueResponse) String() string {
818 func (*CloseIssueResponse) ProtoMessage() {}914 func (*CloseIssueResponse) ProtoMessage() {}
819 915
820 func (x *CloseIssueResponse) ProtoReflect() protoreflect.Message {916 func (x *CloseIssueResponse) ProtoReflect() protoreflect.Message {
821- mi := &file_ermite_issue_proto_msgTypes[11]917+ mi := &file_ermite_issue_proto_msgTypes[12]
822 if x != nil {918 if x != nil {
823 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))919 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
824 if ms.LoadMessageInfo() == nil {920 if ms.LoadMessageInfo() == nil {
@@ -831,7 +927,7 @@ func (x *CloseIssueResponse) ProtoReflect() protoreflect.Message {
831 927
832 // Deprecated: Use CloseIssueResponse.ProtoReflect.Descriptor instead.928 // Deprecated: Use CloseIssueResponse.ProtoReflect.Descriptor instead.
833 func (*CloseIssueResponse) Descriptor() ([]byte, []int) {929 func (*CloseIssueResponse) Descriptor() ([]byte, []int) {
834- return file_ermite_issue_proto_rawDescGZIP(), []int{11}930+ return file_ermite_issue_proto_rawDescGZIP(), []int{12}
835 }931 }
836 932
837 func (x *CloseIssueResponse) GetIssue() *Issue {933 func (x *CloseIssueResponse) GetIssue() *Issue {
@@ -854,7 +950,7 @@ type ReopenIssueRequest struct {
854 950
855 func (x *ReopenIssueRequest) Reset() {951 func (x *ReopenIssueRequest) Reset() {
856 *x = ReopenIssueRequest{}952 *x = ReopenIssueRequest{}
857- mi := &file_ermite_issue_proto_msgTypes[12]953+ mi := &file_ermite_issue_proto_msgTypes[13]
858 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))954 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
859 ms.StoreMessageInfo(mi)955 ms.StoreMessageInfo(mi)
860 }956 }
@@ -866,7 +962,7 @@ func (x *ReopenIssueRequest) String() string {
866 func (*ReopenIssueRequest) ProtoMessage() {}962 func (*ReopenIssueRequest) ProtoMessage() {}
867 963
868 func (x *ReopenIssueRequest) ProtoReflect() protoreflect.Message {964 func (x *ReopenIssueRequest) ProtoReflect() protoreflect.Message {
869- mi := &file_ermite_issue_proto_msgTypes[12]965+ mi := &file_ermite_issue_proto_msgTypes[13]
870 if x != nil {966 if x != nil {
871 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))967 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
872 if ms.LoadMessageInfo() == nil {968 if ms.LoadMessageInfo() == nil {
@@ -879,7 +975,7 @@ func (x *ReopenIssueRequest) ProtoReflect() protoreflect.Message {
879 975
880 // Deprecated: Use ReopenIssueRequest.ProtoReflect.Descriptor instead.976 // Deprecated: Use ReopenIssueRequest.ProtoReflect.Descriptor instead.
881 func (*ReopenIssueRequest) Descriptor() ([]byte, []int) {977 func (*ReopenIssueRequest) Descriptor() ([]byte, []int) {
882- return file_ermite_issue_proto_rawDescGZIP(), []int{12}978+ return file_ermite_issue_proto_rawDescGZIP(), []int{13}
883 }979 }
884 980
885 func (x *ReopenIssueRequest) GetRepo() string {981 func (x *ReopenIssueRequest) GetRepo() string {
@@ -907,7 +1003,7 @@ type ReopenIssueResponse struct {
907 1003
908 func (x *ReopenIssueResponse) Reset() {1004 func (x *ReopenIssueResponse) Reset() {
909 *x = ReopenIssueResponse{}1005 *x = ReopenIssueResponse{}
910- mi := &file_ermite_issue_proto_msgTypes[13]1006+ mi := &file_ermite_issue_proto_msgTypes[14]
911 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))1007 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
912 ms.StoreMessageInfo(mi)1008 ms.StoreMessageInfo(mi)
913 }1009 }
@@ -919,7 +1015,7 @@ func (x *ReopenIssueResponse) String() string {
919 func (*ReopenIssueResponse) ProtoMessage() {}1015 func (*ReopenIssueResponse) ProtoMessage() {}
920 1016
921 func (x *ReopenIssueResponse) ProtoReflect() protoreflect.Message {1017 func (x *ReopenIssueResponse) ProtoReflect() protoreflect.Message {
922- mi := &file_ermite_issue_proto_msgTypes[13]1018+ mi := &file_ermite_issue_proto_msgTypes[14]
923 if x != nil {1019 if x != nil {
924 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))1020 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
925 if ms.LoadMessageInfo() == nil {1021 if ms.LoadMessageInfo() == nil {
@@ -932,7 +1028,7 @@ func (x *ReopenIssueResponse) ProtoReflect() protoreflect.Message {
932 1028
933 // Deprecated: Use ReopenIssueResponse.ProtoReflect.Descriptor instead.1029 // Deprecated: Use ReopenIssueResponse.ProtoReflect.Descriptor instead.
934 func (*ReopenIssueResponse) Descriptor() ([]byte, []int) {1030 func (*ReopenIssueResponse) Descriptor() ([]byte, []int) {
935- return file_ermite_issue_proto_rawDescGZIP(), []int{13}1031+ return file_ermite_issue_proto_rawDescGZIP(), []int{14}
936 }1032 }
937 1033
938 func (x *ReopenIssueResponse) GetIssue() *Issue {1034 func (x *ReopenIssueResponse) GetIssue() *Issue {
@@ -965,7 +1061,7 @@ type PendingIssue struct {
965 1061
966 func (x *PendingIssue) Reset() {1062 func (x *PendingIssue) Reset() {
967 *x = PendingIssue{}1063 *x = PendingIssue{}
968- mi := &file_ermite_issue_proto_msgTypes[14]1064+ mi := &file_ermite_issue_proto_msgTypes[15]
969 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))1065 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
970 ms.StoreMessageInfo(mi)1066 ms.StoreMessageInfo(mi)
971 }1067 }
@@ -977,7 +1073,7 @@ func (x *PendingIssue) String() string {
977 func (*PendingIssue) ProtoMessage() {}1073 func (*PendingIssue) ProtoMessage() {}
978 1074
979 func (x *PendingIssue) ProtoReflect() protoreflect.Message {1075 func (x *PendingIssue) ProtoReflect() protoreflect.Message {
980- mi := &file_ermite_issue_proto_msgTypes[14]1076+ mi := &file_ermite_issue_proto_msgTypes[15]
981 if x != nil {1077 if x != nil {
982 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))1078 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
983 if ms.LoadMessageInfo() == nil {1079 if ms.LoadMessageInfo() == nil {
@@ -990,7 +1086,7 @@ func (x *PendingIssue) ProtoReflect() protoreflect.Message {
990 1086
991 // Deprecated: Use PendingIssue.ProtoReflect.Descriptor instead.1087 // Deprecated: Use PendingIssue.ProtoReflect.Descriptor instead.
992 func (*PendingIssue) Descriptor() ([]byte, []int) {1088 func (*PendingIssue) Descriptor() ([]byte, []int) {
993- return file_ermite_issue_proto_rawDescGZIP(), []int{14}1089+ return file_ermite_issue_proto_rawDescGZIP(), []int{15}
994 }1090 }
995 1091
996 func (x *PendingIssue) GetId() string {1092 func (x *PendingIssue) GetId() string {
@@ -1052,7 +1148,7 @@ type ListPendingIssuesRequest struct {
1052 1148
1053 func (x *ListPendingIssuesRequest) Reset() {1149 func (x *ListPendingIssuesRequest) Reset() {
1054 *x = ListPendingIssuesRequest{}1150 *x = ListPendingIssuesRequest{}
1055- mi := &file_ermite_issue_proto_msgTypes[15]1151+ mi := &file_ermite_issue_proto_msgTypes[16]
1056 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))1152 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
1057 ms.StoreMessageInfo(mi)1153 ms.StoreMessageInfo(mi)
1058 }1154 }
@@ -1064,7 +1160,7 @@ func (x *ListPendingIssuesRequest) String() string {
1064 func (*ListPendingIssuesRequest) ProtoMessage() {}1160 func (*ListPendingIssuesRequest) ProtoMessage() {}
1065 1161
1066 func (x *ListPendingIssuesRequest) ProtoReflect() protoreflect.Message {1162 func (x *ListPendingIssuesRequest) ProtoReflect() protoreflect.Message {
1067- mi := &file_ermite_issue_proto_msgTypes[15]1163+ mi := &file_ermite_issue_proto_msgTypes[16]
1068 if x != nil {1164 if x != nil {
1069 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))1165 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
1070 if ms.LoadMessageInfo() == nil {1166 if ms.LoadMessageInfo() == nil {
@@ -1077,7 +1173,7 @@ func (x *ListPendingIssuesRequest) ProtoReflect() protoreflect.Message {
1077 1173
1078 // Deprecated: Use ListPendingIssuesRequest.ProtoReflect.Descriptor instead.1174 // Deprecated: Use ListPendingIssuesRequest.ProtoReflect.Descriptor instead.
1079 func (*ListPendingIssuesRequest) Descriptor() ([]byte, []int) {1175 func (*ListPendingIssuesRequest) Descriptor() ([]byte, []int) {
1080- return file_ermite_issue_proto_rawDescGZIP(), []int{15}1176+ return file_ermite_issue_proto_rawDescGZIP(), []int{16}
1081 }1177 }
1082 1178
1083 func (x *ListPendingIssuesRequest) GetRepo() string {1179 func (x *ListPendingIssuesRequest) GetRepo() string {
@@ -1115,7 +1211,7 @@ type ListPendingIssuesResponse struct {
1115 1211
1116 func (x *ListPendingIssuesResponse) Reset() {1212 func (x *ListPendingIssuesResponse) Reset() {
1117 *x = ListPendingIssuesResponse{}1213 *x = ListPendingIssuesResponse{}
1118- mi := &file_ermite_issue_proto_msgTypes[16]1214+ mi := &file_ermite_issue_proto_msgTypes[17]
1119 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))1215 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
1120 ms.StoreMessageInfo(mi)1216 ms.StoreMessageInfo(mi)
1121 }1217 }
@@ -1127,7 +1223,7 @@ func (x *ListPendingIssuesResponse) String() string {
1127 func (*ListPendingIssuesResponse) ProtoMessage() {}1223 func (*ListPendingIssuesResponse) ProtoMessage() {}
1128 1224
1129 func (x *ListPendingIssuesResponse) ProtoReflect() protoreflect.Message {1225 func (x *ListPendingIssuesResponse) ProtoReflect() protoreflect.Message {
1130- mi := &file_ermite_issue_proto_msgTypes[16]1226+ mi := &file_ermite_issue_proto_msgTypes[17]
1131 if x != nil {1227 if x != nil {
1132 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))1228 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
1133 if ms.LoadMessageInfo() == nil {1229 if ms.LoadMessageInfo() == nil {
@@ -1140,7 +1236,7 @@ func (x *ListPendingIssuesResponse) ProtoReflect() protoreflect.Message {
1140 1236
1141 // Deprecated: Use ListPendingIssuesResponse.ProtoReflect.Descriptor instead.1237 // Deprecated: Use ListPendingIssuesResponse.ProtoReflect.Descriptor instead.
1142 func (*ListPendingIssuesResponse) Descriptor() ([]byte, []int) {1238 func (*ListPendingIssuesResponse) Descriptor() ([]byte, []int) {
1143- return file_ermite_issue_proto_rawDescGZIP(), []int{16}1239+ return file_ermite_issue_proto_rawDescGZIP(), []int{17}
1144 }1240 }
1145 1241
1146 func (x *ListPendingIssuesResponse) GetIssues() []*PendingIssue {1242 func (x *ListPendingIssuesResponse) GetIssues() []*PendingIssue {
@@ -1170,7 +1266,7 @@ type ApproveIssueRequest struct {
1170 1266
1171 func (x *ApproveIssueRequest) Reset() {1267 func (x *ApproveIssueRequest) Reset() {
1172 *x = ApproveIssueRequest{}1268 *x = ApproveIssueRequest{}
1173- mi := &file_ermite_issue_proto_msgTypes[17]1269+ mi := &file_ermite_issue_proto_msgTypes[18]
1174 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))1270 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
1175 ms.StoreMessageInfo(mi)1271 ms.StoreMessageInfo(mi)
1176 }1272 }
@@ -1182,7 +1278,7 @@ func (x *ApproveIssueRequest) String() string {
1182 func (*ApproveIssueRequest) ProtoMessage() {}1278 func (*ApproveIssueRequest) ProtoMessage() {}
1183 1279
1184 func (x *ApproveIssueRequest) ProtoReflect() protoreflect.Message {1280 func (x *ApproveIssueRequest) ProtoReflect() protoreflect.Message {
1185- mi := &file_ermite_issue_proto_msgTypes[17]1281+ mi := &file_ermite_issue_proto_msgTypes[18]
1186 if x != nil {1282 if x != nil {
1187 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))1283 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
1188 if ms.LoadMessageInfo() == nil {1284 if ms.LoadMessageInfo() == nil {
@@ -1195,7 +1291,7 @@ func (x *ApproveIssueRequest) ProtoReflect() protoreflect.Message {
1195 1291
1196 // Deprecated: Use ApproveIssueRequest.ProtoReflect.Descriptor instead.1292 // Deprecated: Use ApproveIssueRequest.ProtoReflect.Descriptor instead.
1197 func (*ApproveIssueRequest) Descriptor() ([]byte, []int) {1293 func (*ApproveIssueRequest) Descriptor() ([]byte, []int) {
1198- return file_ermite_issue_proto_rawDescGZIP(), []int{17}1294+ return file_ermite_issue_proto_rawDescGZIP(), []int{18}
1199 }1295 }
1200 1296
1201 func (x *ApproveIssueRequest) GetRepo() string {1297 func (x *ApproveIssueRequest) GetRepo() string {
@@ -1224,7 +1320,7 @@ type ApproveIssueResponse struct {
1224 1320
1225 func (x *ApproveIssueResponse) Reset() {1321 func (x *ApproveIssueResponse) Reset() {
1226 *x = ApproveIssueResponse{}1322 *x = ApproveIssueResponse{}
1227- mi := &file_ermite_issue_proto_msgTypes[18]1323+ mi := &file_ermite_issue_proto_msgTypes[19]
1228 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))1324 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
1229 ms.StoreMessageInfo(mi)1325 ms.StoreMessageInfo(mi)
1230 }1326 }
@@ -1236,7 +1332,7 @@ func (x *ApproveIssueResponse) String() string {
1236 func (*ApproveIssueResponse) ProtoMessage() {}1332 func (*ApproveIssueResponse) ProtoMessage() {}
1237 1333
1238 func (x *ApproveIssueResponse) ProtoReflect() protoreflect.Message {1334 func (x *ApproveIssueResponse) ProtoReflect() protoreflect.Message {
1239- mi := &file_ermite_issue_proto_msgTypes[18]1335+ mi := &file_ermite_issue_proto_msgTypes[19]
1240 if x != nil {1336 if x != nil {
1241 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))1337 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
1242 if ms.LoadMessageInfo() == nil {1338 if ms.LoadMessageInfo() == nil {
@@ -1249,7 +1345,7 @@ func (x *ApproveIssueResponse) ProtoReflect() protoreflect.Message {
1249 1345
1250 // Deprecated: Use ApproveIssueResponse.ProtoReflect.Descriptor instead.1346 // Deprecated: Use ApproveIssueResponse.ProtoReflect.Descriptor instead.
1251 func (*ApproveIssueResponse) Descriptor() ([]byte, []int) {1347 func (*ApproveIssueResponse) Descriptor() ([]byte, []int) {
1252- return file_ermite_issue_proto_rawDescGZIP(), []int{18}1348+ return file_ermite_issue_proto_rawDescGZIP(), []int{19}
1253 }1349 }
1254 1350
1255 func (x *ApproveIssueResponse) GetIssue() *Issue {1351 func (x *ApproveIssueResponse) GetIssue() *Issue {
@@ -1274,7 +1370,7 @@ type RejectIssueRequest struct {
1274 1370
1275 func (x *RejectIssueRequest) Reset() {1371 func (x *RejectIssueRequest) Reset() {
1276 *x = RejectIssueRequest{}1372 *x = RejectIssueRequest{}
1277- mi := &file_ermite_issue_proto_msgTypes[19]1373+ mi := &file_ermite_issue_proto_msgTypes[20]
1278 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))1374 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
1279 ms.StoreMessageInfo(mi)1375 ms.StoreMessageInfo(mi)
1280 }1376 }
@@ -1286,7 +1382,7 @@ func (x *RejectIssueRequest) String() string {
1286 func (*RejectIssueRequest) ProtoMessage() {}1382 func (*RejectIssueRequest) ProtoMessage() {}
1287 1383
1288 func (x *RejectIssueRequest) ProtoReflect() protoreflect.Message {1384 func (x *RejectIssueRequest) ProtoReflect() protoreflect.Message {
1289- mi := &file_ermite_issue_proto_msgTypes[19]1385+ mi := &file_ermite_issue_proto_msgTypes[20]
1290 if x != nil {1386 if x != nil {
1291 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))1387 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
1292 if ms.LoadMessageInfo() == nil {1388 if ms.LoadMessageInfo() == nil {
@@ -1299,7 +1395,7 @@ func (x *RejectIssueRequest) ProtoReflect() protoreflect.Message {
1299 1395
1300 // Deprecated: Use RejectIssueRequest.ProtoReflect.Descriptor instead.1396 // Deprecated: Use RejectIssueRequest.ProtoReflect.Descriptor instead.
1301 func (*RejectIssueRequest) Descriptor() ([]byte, []int) {1397 func (*RejectIssueRequest) Descriptor() ([]byte, []int) {
1302- return file_ermite_issue_proto_rawDescGZIP(), []int{19}1398+ return file_ermite_issue_proto_rawDescGZIP(), []int{20}
1303 }1399 }
1304 1400
1305 func (x *RejectIssueRequest) GetRepo() string {1401 func (x *RejectIssueRequest) GetRepo() string {
@@ -1332,7 +1428,7 @@ type RejectIssueResponse struct {
1332 1428
1333 func (x *RejectIssueResponse) Reset() {1429 func (x *RejectIssueResponse) Reset() {
1334 *x = RejectIssueResponse{}1430 *x = RejectIssueResponse{}
1335- mi := &file_ermite_issue_proto_msgTypes[20]1431+ mi := &file_ermite_issue_proto_msgTypes[21]
1336 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))1432 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
1337 ms.StoreMessageInfo(mi)1433 ms.StoreMessageInfo(mi)
1338 }1434 }
@@ -1344,7 +1440,7 @@ func (x *RejectIssueResponse) String() string {
1344 func (*RejectIssueResponse) ProtoMessage() {}1440 func (*RejectIssueResponse) ProtoMessage() {}
1345 1441
1346 func (x *RejectIssueResponse) ProtoReflect() protoreflect.Message {1442 func (x *RejectIssueResponse) ProtoReflect() protoreflect.Message {
1347- mi := &file_ermite_issue_proto_msgTypes[20]1443+ mi := &file_ermite_issue_proto_msgTypes[21]
1348 if x != nil {1444 if x != nil {
1349 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))1445 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
1350 if ms.LoadMessageInfo() == nil {1446 if ms.LoadMessageInfo() == nil {
@@ -1357,14 +1453,14 @@ func (x *RejectIssueResponse) ProtoReflect() protoreflect.Message {
1357 1453
1358 // Deprecated: Use RejectIssueResponse.ProtoReflect.Descriptor instead.1454 // Deprecated: Use RejectIssueResponse.ProtoReflect.Descriptor instead.
1359 func (*RejectIssueResponse) Descriptor() ([]byte, []int) {1455 func (*RejectIssueResponse) Descriptor() ([]byte, []int) {
1360- return file_ermite_issue_proto_rawDescGZIP(), []int{20}1456+ return file_ermite_issue_proto_rawDescGZIP(), []int{21}
1361 }1457 }
1362 1458
1363 var File_ermite_issue_proto protoreflect.FileDescriptor1459 var File_ermite_issue_proto protoreflect.FileDescriptor
1364 1460
1365 const file_ermite_issue_proto_rawDesc = "" +1461 const file_ermite_issue_proto_rawDesc = "" +
1366 "\n" +1462 "\n" +
1367- "\x12ermite/issue.proto\x12\x06ermite\x1a\x1fgoogle/protobuf/timestamp.proto\"\xba\x02\n" +1463+ "\x12ermite/issue.proto\x12\x06ermite\x1a\x1aermite/merge_request.proto\x1a\x1fgoogle/protobuf/timestamp.proto\"\xf1\x02\n" +
1368 "\x05Issue\x12\x12\n" +1464 "\x05Issue\x12\x12\n" +
1369 "\x04repo\x18\x01 \x01(\tR\x04repo\x12\x16\n" +1465 "\x04repo\x18\x01 \x01(\tR\x04repo\x12\x16\n" +
1370 "\x06number\x18\x02 \x01(\x03R\x06number\x12\x14\n" +1466 "\x06number\x18\x02 \x01(\x03R\x06number\x12\x14\n" +
@@ -1376,7 +1472,14 @@ const file_ermite_issue_proto_rawDesc = "" +
1376 "created_at\x18\a \x01(\v2\x1a.google.protobuf.TimestampR\tcreatedAt\x129\n" +1472 "created_at\x18\a \x01(\v2\x1a.google.protobuf.TimestampR\tcreatedAt\x129\n" +
1377 "\n" +1473 "\n" +
1378 "updated_at\x18\b \x01(\v2\x1a.google.protobuf.TimestampR\tupdatedAt\x12#\n" +1474 "updated_at\x18\b \x01(\v2\x1a.google.protobuf.TimestampR\tupdatedAt\x12#\n" +
1379- "\rcomment_count\x18\t \x01(\x05R\fcommentCount\"\x85\x01\n" +1475+ "\rcomment_count\x18\t \x01(\x05R\fcommentCount\x125\n" +
1476+ "\x17closed_by_merge_request\x18\n" +
1477+ " \x01(\x03R\x14closedByMergeRequest\"\x87\x01\n" +
1478+ "\x0eIssueReference\x12\x16\n" +
1479+ "\x06number\x18\x01 \x01(\x03R\x06number\x12\x14\n" +
1480+ "\x05title\x18\x02 \x01(\tR\x05title\x12/\n" +
1481+ "\x05state\x18\x03 \x01(\x0e2\x19.ermite.MergeRequestStateR\x05state\x12\x16\n" +
1482+ "\x06closes\x18\x04 \x01(\bR\x06closes\"\x85\x01\n" +
1380 "\fIssueComment\x12\x0e\n" +1483 "\fIssueComment\x12\x0e\n" +
1381 "\x02id\x18\x01 \x01(\tR\x02id\x12\x16\n" +1484 "\x02id\x18\x01 \x01(\tR\x02id\x12\x16\n" +
1382 "\x06author\x18\x02 \x01(\tR\x06author\x12\x12\n" +1485 "\x06author\x18\x02 \x01(\tR\x06author\x12\x12\n" +
@@ -1400,10 +1503,13 @@ const file_ermite_issue_proto_rawDesc = "" +
1400 "\x0fnext_page_token\x18\x02 \x01(\tR\rnextPageToken\"=\n" +1503 "\x0fnext_page_token\x18\x02 \x01(\tR\rnextPageToken\"=\n" +
1401 "\x0fGetIssueRequest\x12\x12\n" +1504 "\x0fGetIssueRequest\x12\x12\n" +
1402 "\x04repo\x18\x01 \x01(\tR\x04repo\x12\x16\n" +1505 "\x04repo\x18\x01 \x01(\tR\x04repo\x12\x16\n" +
1403- "\x06number\x18\x02 \x01(\x03R\x06number\"i\n" +1506+ "\x06number\x18\x02 \x01(\x03R\x06number\"\xa1\x01\n" +
1404 "\x10GetIssueResponse\x12#\n" +1507 "\x10GetIssueResponse\x12#\n" +
1405 "\x05issue\x18\x01 \x01(\v2\r.ermite.IssueR\x05issue\x120\n" +1508 "\x05issue\x18\x01 \x01(\v2\r.ermite.IssueR\x05issue\x120\n" +
1406- "\bcomments\x18\x02 \x03(\v2\x14.ermite.IssueCommentR\bcomments\"X\n" +1509+ "\bcomments\x18\x02 \x03(\v2\x14.ermite.IssueCommentR\bcomments\x126\n" +
1510+ "\n" +
1511+ "references\x18\x03 \x03(\v2\x16.ermite.IssueReferenceR\n" +
1512+ "references\"X\n" +
1407 "\x16AddIssueCommentRequest\x12\x12\n" +1513 "\x16AddIssueCommentRequest\x12\x12\n" +
1408 "\x04repo\x18\x01 \x01(\tR\x04repo\x12\x16\n" +1514 "\x04repo\x18\x01 \x01(\tR\x04repo\x12\x16\n" +
1409 "\x06number\x18\x02 \x01(\x03R\x06number\x12\x12\n" +1515 "\x06number\x18\x02 \x01(\x03R\x06number\x12\x12\n" +
@@ -1481,71 +1587,75 @@ func file_ermite_issue_proto_rawDescGZIP() []byte {
1481 }1587 }
1482 1588
1483 var file_ermite_issue_proto_enumTypes = make([]protoimpl.EnumInfo, 1)1589 var file_ermite_issue_proto_enumTypes = make([]protoimpl.EnumInfo, 1)
1484-var file_ermite_issue_proto_msgTypes = make([]protoimpl.MessageInfo, 21)1590+var file_ermite_issue_proto_msgTypes = make([]protoimpl.MessageInfo, 22)
1485 var file_ermite_issue_proto_goTypes = []any{1591 var file_ermite_issue_proto_goTypes = []any{
1486 (IssueState)(0), // 0: ermite.IssueState1592 (IssueState)(0), // 0: ermite.IssueState
1487 (*Issue)(nil), // 1: ermite.Issue1593 (*Issue)(nil), // 1: ermite.Issue
1488- (*IssueComment)(nil), // 2: ermite.IssueComment1594+ (*IssueReference)(nil), // 2: ermite.IssueReference
1489- (*CreateIssueRequest)(nil), // 3: ermite.CreateIssueRequest1595+ (*IssueComment)(nil), // 3: ermite.IssueComment
1490- (*CreateIssueResponse)(nil), // 4: ermite.CreateIssueResponse1596+ (*CreateIssueRequest)(nil), // 4: ermite.CreateIssueRequest
1491- (*ListIssuesRequest)(nil), // 5: ermite.ListIssuesRequest1597+ (*CreateIssueResponse)(nil), // 5: ermite.CreateIssueResponse
1492- (*ListIssuesResponse)(nil), // 6: ermite.ListIssuesResponse1598+ (*ListIssuesRequest)(nil), // 6: ermite.ListIssuesRequest
1493- (*GetIssueRequest)(nil), // 7: ermite.GetIssueRequest1599+ (*ListIssuesResponse)(nil), // 7: ermite.ListIssuesResponse
1494- (*GetIssueResponse)(nil), // 8: ermite.GetIssueResponse1600+ (*GetIssueRequest)(nil), // 8: ermite.GetIssueRequest
1495- (*AddIssueCommentRequest)(nil), // 9: ermite.AddIssueCommentRequest1601+ (*GetIssueResponse)(nil), // 9: ermite.GetIssueResponse
1496- (*AddIssueCommentResponse)(nil), // 10: ermite.AddIssueCommentResponse1602+ (*AddIssueCommentRequest)(nil), // 10: ermite.AddIssueCommentRequest
1497- (*CloseIssueRequest)(nil), // 11: ermite.CloseIssueRequest1603+ (*AddIssueCommentResponse)(nil), // 11: ermite.AddIssueCommentResponse
1498- (*CloseIssueResponse)(nil), // 12: ermite.CloseIssueResponse1604+ (*CloseIssueRequest)(nil), // 12: ermite.CloseIssueRequest
1499- (*ReopenIssueRequest)(nil), // 13: ermite.ReopenIssueRequest1605+ (*CloseIssueResponse)(nil), // 13: ermite.CloseIssueResponse
1500- (*ReopenIssueResponse)(nil), // 14: ermite.ReopenIssueResponse1606+ (*ReopenIssueRequest)(nil), // 14: ermite.ReopenIssueRequest
1501- (*PendingIssue)(nil), // 15: ermite.PendingIssue1607+ (*ReopenIssueResponse)(nil), // 15: ermite.ReopenIssueResponse
1502- (*ListPendingIssuesRequest)(nil), // 16: ermite.ListPendingIssuesRequest1608+ (*PendingIssue)(nil), // 16: ermite.PendingIssue
1503- (*ListPendingIssuesResponse)(nil), // 17: ermite.ListPendingIssuesResponse1609+ (*ListPendingIssuesRequest)(nil), // 17: ermite.ListPendingIssuesRequest
1504- (*ApproveIssueRequest)(nil), // 18: ermite.ApproveIssueRequest1610+ (*ListPendingIssuesResponse)(nil), // 18: ermite.ListPendingIssuesResponse
1505- (*ApproveIssueResponse)(nil), // 19: ermite.ApproveIssueResponse1611+ (*ApproveIssueRequest)(nil), // 19: ermite.ApproveIssueRequest
1506- (*RejectIssueRequest)(nil), // 20: ermite.RejectIssueRequest1612+ (*ApproveIssueResponse)(nil), // 20: ermite.ApproveIssueResponse
1507- (*RejectIssueResponse)(nil), // 21: ermite.RejectIssueResponse1613+ (*RejectIssueRequest)(nil), // 21: ermite.RejectIssueRequest
1508- (*timestamppb.Timestamp)(nil), // 22: google.protobuf.Timestamp1614+ (*RejectIssueResponse)(nil), // 22: ermite.RejectIssueResponse
1615+ (*timestamppb.Timestamp)(nil), // 23: google.protobuf.Timestamp
1616+ (MergeRequestState)(0), // 24: ermite.MergeRequestState
1509 }1617 }
1510 var file_ermite_issue_proto_depIdxs = []int32{1618 var file_ermite_issue_proto_depIdxs = []int32{
1511 0, // 0: ermite.Issue.state:type_name -> ermite.IssueState1619 0, // 0: ermite.Issue.state:type_name -> ermite.IssueState
1512- 22, // 1: ermite.Issue.created_at:type_name -> google.protobuf.Timestamp1620+ 23, // 1: ermite.Issue.created_at:type_name -> google.protobuf.Timestamp
1513- 22, // 2: ermite.Issue.updated_at:type_name -> google.protobuf.Timestamp1621+ 23, // 2: ermite.Issue.updated_at:type_name -> google.protobuf.Timestamp
1514- 22, // 3: ermite.IssueComment.created_at:type_name -> google.protobuf.Timestamp1622+ 24, // 3: ermite.IssueReference.state:type_name -> ermite.MergeRequestState
1515- 1, // 4: ermite.CreateIssueResponse.issue:type_name -> ermite.Issue1623+ 23, // 4: ermite.IssueComment.created_at:type_name -> google.protobuf.Timestamp
1516- 0, // 5: ermite.ListIssuesRequest.state:type_name -> ermite.IssueState1624+ 1, // 5: ermite.CreateIssueResponse.issue:type_name -> ermite.Issue
1517- 1, // 6: ermite.ListIssuesResponse.issues:type_name -> ermite.Issue1625+ 0, // 6: ermite.ListIssuesRequest.state:type_name -> ermite.IssueState
1518- 1, // 7: ermite.GetIssueResponse.issue:type_name -> ermite.Issue1626+ 1, // 7: ermite.ListIssuesResponse.issues:type_name -> ermite.Issue
1519- 2, // 8: ermite.GetIssueResponse.comments:type_name -> ermite.IssueComment1627+ 1, // 8: ermite.GetIssueResponse.issue:type_name -> ermite.Issue
1520- 2, // 9: ermite.AddIssueCommentResponse.comment:type_name -> ermite.IssueComment1628+ 3, // 9: ermite.GetIssueResponse.comments:type_name -> ermite.IssueComment
1521- 1, // 10: ermite.CloseIssueResponse.issue:type_name -> ermite.Issue1629+ 2, // 10: ermite.GetIssueResponse.references:type_name -> ermite.IssueReference
1522- 1, // 11: ermite.ReopenIssueResponse.issue:type_name -> ermite.Issue1630+ 3, // 11: ermite.AddIssueCommentResponse.comment:type_name -> ermite.IssueComment
1523- 22, // 12: ermite.PendingIssue.created_at:type_name -> google.protobuf.Timestamp1631+ 1, // 12: ermite.CloseIssueResponse.issue:type_name -> ermite.Issue
1524- 15, // 13: ermite.ListPendingIssuesResponse.issues:type_name -> ermite.PendingIssue1632+ 1, // 13: ermite.ReopenIssueResponse.issue:type_name -> ermite.Issue
1525- 1, // 14: ermite.ApproveIssueResponse.issue:type_name -> ermite.Issue1633+ 23, // 14: ermite.PendingIssue.created_at:type_name -> google.protobuf.Timestamp
1526- 3, // 15: ermite.IssueService.CreateIssue:input_type -> ermite.CreateIssueRequest1634+ 16, // 15: ermite.ListPendingIssuesResponse.issues:type_name -> ermite.PendingIssue
1527- 5, // 16: ermite.IssueService.ListIssues:input_type -> ermite.ListIssuesRequest1635+ 1, // 16: ermite.ApproveIssueResponse.issue:type_name -> ermite.Issue
1528- 7, // 17: ermite.IssueService.GetIssue:input_type -> ermite.GetIssueRequest1636+ 4, // 17: ermite.IssueService.CreateIssue:input_type -> ermite.CreateIssueRequest
1529- 9, // 18: ermite.IssueService.AddIssueComment:input_type -> ermite.AddIssueCommentRequest1637+ 6, // 18: ermite.IssueService.ListIssues:input_type -> ermite.ListIssuesRequest
1530- 11, // 19: ermite.IssueService.CloseIssue:input_type -> ermite.CloseIssueRequest1638+ 8, // 19: ermite.IssueService.GetIssue:input_type -> ermite.GetIssueRequest
1531- 13, // 20: ermite.IssueService.ReopenIssue:input_type -> ermite.ReopenIssueRequest1639+ 10, // 20: ermite.IssueService.AddIssueComment:input_type -> ermite.AddIssueCommentRequest
1532- 16, // 21: ermite.IssueService.ListPendingIssues:input_type -> ermite.ListPendingIssuesRequest1640+ 12, // 21: ermite.IssueService.CloseIssue:input_type -> ermite.CloseIssueRequest
1533- 18, // 22: ermite.IssueService.ApproveIssue:input_type -> ermite.ApproveIssueRequest1641+ 14, // 22: ermite.IssueService.ReopenIssue:input_type -> ermite.ReopenIssueRequest
1534- 20, // 23: ermite.IssueService.RejectIssue:input_type -> ermite.RejectIssueRequest1642+ 17, // 23: ermite.IssueService.ListPendingIssues:input_type -> ermite.ListPendingIssuesRequest
1535- 4, // 24: ermite.IssueService.CreateIssue:output_type -> ermite.CreateIssueResponse1643+ 19, // 24: ermite.IssueService.ApproveIssue:input_type -> ermite.ApproveIssueRequest
1536- 6, // 25: ermite.IssueService.ListIssues:output_type -> ermite.ListIssuesResponse1644+ 21, // 25: ermite.IssueService.RejectIssue:input_type -> ermite.RejectIssueRequest
1537- 8, // 26: ermite.IssueService.GetIssue:output_type -> ermite.GetIssueResponse1645+ 5, // 26: ermite.IssueService.CreateIssue:output_type -> ermite.CreateIssueResponse
1538- 10, // 27: ermite.IssueService.AddIssueComment:output_type -> ermite.AddIssueCommentResponse1646+ 7, // 27: ermite.IssueService.ListIssues:output_type -> ermite.ListIssuesResponse
1539- 12, // 28: ermite.IssueService.CloseIssue:output_type -> ermite.CloseIssueResponse1647+ 9, // 28: ermite.IssueService.GetIssue:output_type -> ermite.GetIssueResponse
1540- 14, // 29: ermite.IssueService.ReopenIssue:output_type -> ermite.ReopenIssueResponse1648+ 11, // 29: ermite.IssueService.AddIssueComment:output_type -> ermite.AddIssueCommentResponse
1541- 17, // 30: ermite.IssueService.ListPendingIssues:output_type -> ermite.ListPendingIssuesResponse1649+ 13, // 30: ermite.IssueService.CloseIssue:output_type -> ermite.CloseIssueResponse
1542- 19, // 31: ermite.IssueService.ApproveIssue:output_type -> ermite.ApproveIssueResponse1650+ 15, // 31: ermite.IssueService.ReopenIssue:output_type -> ermite.ReopenIssueResponse
1543- 21, // 32: ermite.IssueService.RejectIssue:output_type -> ermite.RejectIssueResponse1651+ 18, // 32: ermite.IssueService.ListPendingIssues:output_type -> ermite.ListPendingIssuesResponse
1544- 24, // [24:33] is the sub-list for method output_type1652+ 20, // 33: ermite.IssueService.ApproveIssue:output_type -> ermite.ApproveIssueResponse
1545- 15, // [15:24] is the sub-list for method input_type1653+ 22, // 34: ermite.IssueService.RejectIssue:output_type -> ermite.RejectIssueResponse
1546- 15, // [15:15] is the sub-list for extension type_name1654+ 26, // [26:35] is the sub-list for method output_type
1547- 15, // [15:15] is the sub-list for extension extendee1655+ 17, // [17:26] is the sub-list for method input_type
1548- 0, // [0:15] is the sub-list for field type_name1656+ 17, // [17:17] is the sub-list for extension type_name
1657+ 17, // [17:17] is the sub-list for extension extendee
1658+ 0, // [0:17] is the sub-list for field type_name
1549 }1659 }
1550 1660
1551 func init() { file_ermite_issue_proto_init() }1661 func init() { file_ermite_issue_proto_init() }
@@ -1553,13 +1663,14 @@ func file_ermite_issue_proto_init() {
1553 if File_ermite_issue_proto != nil {1663 if File_ermite_issue_proto != nil {
1554 return1664 return
1555 }1665 }
1666+ file_ermite_merge_request_proto_init()
1556 type x struct{}1667 type x struct{}
1557 out := protoimpl.TypeBuilder{1668 out := protoimpl.TypeBuilder{
1558 File: protoimpl.DescBuilder{1669 File: protoimpl.DescBuilder{
1559 GoPackagePath: reflect.TypeOf(x{}).PkgPath(),1670 GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
1560 RawDescriptor: unsafe.Slice(unsafe.StringData(file_ermite_issue_proto_rawDesc), len(file_ermite_issue_proto_rawDesc)),1671 RawDescriptor: unsafe.Slice(unsafe.StringData(file_ermite_issue_proto_rawDesc), len(file_ermite_issue_proto_rawDesc)),
1561 NumEnums: 1,1672 NumEnums: 1,
1562- NumMessages: 21,1673+ NumMessages: 22,
1563 NumExtensions: 0,1674 NumExtensions: 0,
1564 NumServices: 1,1675 NumServices: 1,
1565 },1676 },
M proto/ermite/issue.proto +29 -0
@@ -4,6 +4,7 @@ syntax = "proto3";
44
55 package ermite;
66
7+import "ermite/merge_request.proto";
78 import "google/protobuf/timestamp.proto";
89
910 // IssueState is where an issue is in its life.
@@ -44,6 +45,24 @@ message Issue {
4445 google.protobuf.Timestamp updated_at = 8;
4546 // CommentCount is the number of comments on the issue.
4647 int32 comment_count = 9;
48+ // ClosedByMergeRequest is the number of the merge request whose merge closed
49+ // the issue (a closing reference such as "Fixes #N"); 0 when the issue was
50+ // closed by hand or is open. Reset when the issue is reopened.
51+ int64 closed_by_merge_request = 10;
52+}
53+
54+// IssueReference is a merge request of the same repository that names the
55+// issue ("#N") in its title, description, notes or commit messages.
56+message IssueReference {
57+ // Number is the number of the merge request.
58+ int64 number = 1;
59+ // Title is the title of the merge request.
60+ string title = 2;
61+ // State is where the merge request is in its life.
62+ MergeRequestState state = 3;
63+ // Closes says that a closing reference ("Fixes #N") names the issue:
64+ // merging the request closes it.
65+ bool closes = 4;
4766 }
4867
4968 // IssueComment is a note on an issue.
@@ -73,6 +92,13 @@ message IssueComment {
7392 // unauthenticated, one with an insufficient scope gets permission_denied, and
7493 // one that cannot read the repository gets not_found.
7594 //
95+// A closing reference ("Fixes #N", "Closes #N", "Resolves #N") in the title,
96+// description or commit messages of a merge request closes the issue when the
97+// request is merged, and only then; the issue.closed event and Issue carry
98+// closed_by_merge_request. Servers that report these links (GetIssueResponse.
99+// references, Issue.closed_by_merge_request) list "issues.links" in
100+// GetVersionResponse.features; older servers leave them empty.
101+//
76102 // Text fields are normalized to NFC and stripped of control and Unicode
77103 // bidirectional characters (line breaks and tabs stay in bodies and comments).
78104 // The title is one line of 1 to 120 code points; body and comment text are at
@@ -167,6 +193,9 @@ message GetIssueResponse {
167193 Issue issue = 1;
168194 // Comments are every comment of the issue, oldest first.
169195 repeated IssueComment comments = 2;
196+ // References are the merge requests naming the issue, ascending by number,
197+ // at most 100.
198+ repeated IssueReference references = 3;
170199 }
171200
172201 // AddIssueCommentRequest describes the comment to add.
@@ -4,6 +4,7 @@ syntax = "proto3";
4 4
5 package ermite;5 package ermite;
6 6
7+import "ermite/merge_request.proto";
7 import "google/protobuf/timestamp.proto";8 import "google/protobuf/timestamp.proto";
8 9
9 // IssueState is where an issue is in its life.10 // IssueState is where an issue is in its life.
@@ -44,6 +45,24 @@ message Issue {
44 google.protobuf.Timestamp updated_at = 8;45 google.protobuf.Timestamp updated_at = 8;
45 // CommentCount is the number of comments on the issue.46 // CommentCount is the number of comments on the issue.
46 int32 comment_count = 9;47 int32 comment_count = 9;
48+ // ClosedByMergeRequest is the number of the merge request whose merge closed
49+ // the issue (a closing reference such as "Fixes #N"); 0 when the issue was
50+ // closed by hand or is open. Reset when the issue is reopened.
51+ int64 closed_by_merge_request = 10;
52+}
53+
54+// IssueReference is a merge request of the same repository that names the
55+// issue ("#N") in its title, description, notes or commit messages.
56+message IssueReference {
57+ // Number is the number of the merge request.
58+ int64 number = 1;
59+ // Title is the title of the merge request.
60+ string title = 2;
61+ // State is where the merge request is in its life.
62+ MergeRequestState state = 3;
63+ // Closes says that a closing reference ("Fixes #N") names the issue:
64+ // merging the request closes it.
65+ bool closes = 4;
47 }66 }
48 67
49 // IssueComment is a note on an issue.68 // IssueComment is a note on an issue.
@@ -73,6 +92,13 @@ message IssueComment {
73 // unauthenticated, one with an insufficient scope gets permission_denied, and92 // unauthenticated, one with an insufficient scope gets permission_denied, and
74 // one that cannot read the repository gets not_found.93 // one that cannot read the repository gets not_found.
75 //94 //
95+// A closing reference ("Fixes #N", "Closes #N", "Resolves #N") in the title,
96+// description or commit messages of a merge request closes the issue when the
97+// request is merged, and only then; the issue.closed event and Issue carry
98+// closed_by_merge_request. Servers that report these links (GetIssueResponse.
99+// references, Issue.closed_by_merge_request) list "issues.links" in
100+// GetVersionResponse.features; older servers leave them empty.
101+//
76 // Text fields are normalized to NFC and stripped of control and Unicode102 // Text fields are normalized to NFC and stripped of control and Unicode
77 // bidirectional characters (line breaks and tabs stay in bodies and comments).103 // bidirectional characters (line breaks and tabs stay in bodies and comments).
78 // The title is one line of 1 to 120 code points; body and comment text are at104 // The title is one line of 1 to 120 code points; body and comment text are at
@@ -167,6 +193,9 @@ message GetIssueResponse {
167 Issue issue = 1;193 Issue issue = 1;
168 // Comments are every comment of the issue, oldest first.194 // Comments are every comment of the issue, oldest first.
169 repeated IssueComment comments = 2;195 repeated IssueComment comments = 2;
196+ // References are the merge requests naming the issue, ascending by number,
197+ // at most 100.
198+ repeated IssueReference references = 3;
170 }199 }
171 200
172 // AddIssueCommentRequest describes the comment to add.201 // AddIssueCommentRequest describes the comment to add.

Comments0 open / 0

no comments yet.

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
l
merge request: the list of files (j k move, enter opens, esc back)
M
merge request: the merge menu; there 1–3 pick the mode, D deletes the branch, enter merges
R
merge request: mark the head read
esc
close a dialog, leave a field

Branches 2

Tags 18

↑↓ moveenter openesc close