detached b394bb8

Merge 81ede3b81040f2594180d0ca4f180a63b2cea9fd into ffa9a5ed3b92f780404c89cbe9288e74108a1ed0

commit
b394bb84e4b109668771066a112438ab8df26154
author
ermite · · 2026-10-22 18:34 UTC
merge of
ffa9a5e + 81ede3b · diff against the first parent
signature
unsigned
10 files · +1123 -390
M docs/services.md +2 -2
@@ -6,9 +6,9 @@
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`, `MarkReady`, `MergeMergeRequest` (modes fast-forward, squash, merge commit), `MarkRead`, `EnableAutoMerge`, `CancelAutoMerge` (merge by itself once a check passed on the head and all its runs are complete; setting `allow_auto_merge`, `MergeRequest.auto_merge`, events `MergeRequestAutoMergeEnabled` and `MergeRequestAutoMergeCancelled`, `MergeRequestMerged.auto`; feature `merge_requests.auto_merge`). 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, 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 |
9+| `IssueService` | `CreateIssue`, `ListIssues`, `GetIssue` (comments, merge requests naming the issue, history events, `closed_by_merge_request`), `AddIssueComment`, `CloseIssue`, `ResolveIssue`, `ReopenIssue`; owner only: `ListPendingIssues`, `ApproveIssue`, `RejectIssue`. States `OPEN`, `CLOSED`, `RESOLVED`; `ResolveIssue` needs `issue:write`. Features `issues`, `issues.links`, `issues.resolve`. Issues share numbers with merge requests |
1010 | `SessionService` | `CreateLoginLink`, `SignOutEverywhere` (owner only) |
11-| `EventService` | `Watch` (streamed, resumable). Topics `home`, `repo:<name>` and `owner` (owner rights only). Events 17–21: `issue_opened`, `issue_closed`, `issue_reopened`, `issue_commented`, and `issue_submitted` (only on `owner`, no content). 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`. Event 31: `issue_resolved` |
1212 | `ServerService` | `GetVersion` (version and features), `GetSigningKey`, `RotateOIDCKey` (owner only) |
1313 | `TrustedKeyService` | `ListTrustedKeys`, `AddTrustedKey` and `RemoveTrustedKey` (owner only). `Commit.verification` carries the result of the check (feature `commit_signatures`) |
1414 | `RunService` | `ListRuns`, `GetRun`, `GetJob`, `GetJobLog` (streamed, follow), `ListAnnotations`, `GetStepSummaries`, `CancelRun`, `RerunRun`, `DispatchWorkflow`, `ListWorkflows`, `DisableWorkflow`, `EnableWorkflow`, `ListChecks`, `ListRunners`, `RemoveRunner` |
@@ -6,9 +6,9 @@
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`, `MarkReady`, `MergeMergeRequest` (modes fast-forward, squash, merge commit), `MarkRead`, `EnableAutoMerge`, `CancelAutoMerge` (merge by itself once a check passed on the head and all its runs are complete; setting `allow_auto_merge`, `MergeRequest.auto_merge`, events `MergeRequestAutoMergeEnabled` and `MergeRequestAutoMergeCancelled`, `MergeRequestMerged.auto`; feature `merge_requests.auto_merge`). 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`, `MarkReady`, `MergeMergeRequest` (modes fast-forward, squash, merge commit), `MarkRead`, `EnableAutoMerge`, `CancelAutoMerge` (merge by itself once a check passed on the head and all its runs are complete; setting `allow_auto_merge`, `MergeRequest.auto_merge`, events `MergeRequestAutoMergeEnabled` and `MergeRequestAutoMergeCancelled`, `MergeRequestMerged.auto`; feature `merge_requests.auto_merge`). 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, 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 |9+| `IssueService` | `CreateIssue`, `ListIssues`, `GetIssue` (comments, merge requests naming the issue, history events, `closed_by_merge_request`), `AddIssueComment`, `CloseIssue`, `ResolveIssue`, `ReopenIssue`; owner only: `ListPendingIssues`, `ApproveIssue`, `RejectIssue`. States `OPEN`, `CLOSED`, `RESOLVED`; `ResolveIssue` needs `issue:write`. Features `issues`, `issues.links`, `issues.resolve`. 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`. Event 31: `issue_resolved` |
12 | `ServerService` | `GetVersion` (version and features), `GetSigningKey`, `RotateOIDCKey` (owner only) |12 | `ServerService` | `GetVersion` (version and features), `GetSigningKey`, `RotateOIDCKey` (owner only) |
13 | `TrustedKeyService` | `ListTrustedKeys`, `AddTrustedKey` and `RemoveTrustedKey` (owner only). `Commit.verification` carries the result of the check (feature `commit_signatures`) |13 | `TrustedKeyService` | `ListTrustedKeys`, `AddTrustedKey` and `RemoveTrustedKey` (owner only). `Commit.verification` carries the result of the check (feature `commit_signatures`) |
14 | `RunService` | `ListRuns`, `GetRun`, `GetJob`, `GetJobLog` (streamed, follow), `ListAnnotations`, `GetStepSummaries`, `CancelRun`, `RerunRun`, `DispatchWorkflow`, `ListWorkflows`, `DisableWorkflow`, `EnableWorkflow`, `ListChecks`, `ListRunners`, `RemoveRunner` |14 | `RunService` | `ListRuns`, `GetRun`, `GetJob`, `GetJobLog` (streamed, follow), `ListAnnotations`, `GetStepSummaries`, `CancelRun`, `RerunRun`, `DispatchWorkflow`, `ListWorkflows`, `DisableWorkflow`, `EnableWorkflow`, `ListChecks`, `ListRunners`, `RemoveRunner` |
M gen/ermite/ermiteconnect/event.connect.go +8 -6
@@ -49,9 +49,10 @@ type EventServiceClient interface {
4949 // for merge requests, merge_request_opened, merge_request_merged,
5050 // merge_request_closed, comment_added, comment_edited, comment_deleted and
5151 // comment_resolved (a thread resolved or reopened); for issues, issue_opened,
52- // issue_closed, issue_reopened and issue_commented, and issue_submitted. Each
53- // one is delivered on the "repo:<name>" topic of its repository and on
54- // "home", subject to the visibility of the repository, except
52+ // issue_closed, issue_resolved, issue_reopened and issue_commented, and
53+ // issue_submitted. Each one is delivered on the "repo:<name>" topic of its
54+ // repository and on "home", subject to the visibility of the repository,
55+ // except
5556 // issue_submitted: it is delivered only on the "owner" topic, never on
5657 // "home" or "repo:<name>", and carries no content (see IssueSubmitted).
5758 //
@@ -125,9 +126,10 @@ type EventServiceHandler interface {
125126 // for merge requests, merge_request_opened, merge_request_merged,
126127 // merge_request_closed, comment_added, comment_edited, comment_deleted and
127128 // comment_resolved (a thread resolved or reopened); for issues, issue_opened,
128- // issue_closed, issue_reopened and issue_commented, and issue_submitted. Each
129- // one is delivered on the "repo:<name>" topic of its repository and on
130- // "home", subject to the visibility of the repository, except
129+ // issue_closed, issue_resolved, issue_reopened and issue_commented, and
130+ // issue_submitted. Each one is delivered on the "repo:<name>" topic of its
131+ // repository and on "home", subject to the visibility of the repository,
132+ // except
131133 // issue_submitted: it is delivered only on the "owner" topic, never on
132134 // "home" or "repo:<name>", and carries no content (see IssueSubmitted).
133135 //
@@ -49,9 +49,10 @@ type EventServiceClient interface {
49 // for merge requests, merge_request_opened, merge_request_merged,49 // for merge requests, merge_request_opened, merge_request_merged,
50 // merge_request_closed, comment_added, comment_edited, comment_deleted and50 // merge_request_closed, comment_added, comment_edited, comment_deleted and
51 // comment_resolved (a thread resolved or reopened); for issues, issue_opened,51 // comment_resolved (a thread resolved or reopened); for issues, issue_opened,
52- // issue_closed, issue_reopened and issue_commented, and issue_submitted. Each52+ // issue_closed, issue_resolved, issue_reopened and issue_commented, and
53- // one is delivered on the "repo:<name>" topic of its repository and on53+ // issue_submitted. Each one is delivered on the "repo:<name>" topic of its
54- // "home", subject to the visibility of the repository, except54+ // repository and on "home", subject to the visibility of the repository,
55+ // except
55 // issue_submitted: it is delivered only on the "owner" topic, never on56 // issue_submitted: it is delivered only on the "owner" topic, never on
56 // "home" or "repo:<name>", and carries no content (see IssueSubmitted).57 // "home" or "repo:<name>", and carries no content (see IssueSubmitted).
57 //58 //
@@ -125,9 +126,10 @@ type EventServiceHandler interface {
125 // for merge requests, merge_request_opened, merge_request_merged,126 // for merge requests, merge_request_opened, merge_request_merged,
126 // merge_request_closed, comment_added, comment_edited, comment_deleted and127 // merge_request_closed, comment_added, comment_edited, comment_deleted and
127 // comment_resolved (a thread resolved or reopened); for issues, issue_opened,128 // comment_resolved (a thread resolved or reopened); for issues, issue_opened,
128- // issue_closed, issue_reopened and issue_commented, and issue_submitted. Each129+ // issue_closed, issue_resolved, issue_reopened and issue_commented, and
129- // one is delivered on the "repo:<name>" topic of its repository and on130+ // issue_submitted. Each one is delivered on the "repo:<name>" topic of its
130- // "home", subject to the visibility of the repository, except131+ // repository and on "home", subject to the visibility of the repository,
132+ // except
131 // issue_submitted: it is delivered only on the "owner" topic, never on133 // issue_submitted: it is delivered only on the "owner" topic, never on
132 // "home" or "repo:<name>", and carries no content (see IssueSubmitted).134 // "home" or "repo:<name>", and carries no content (see IssueSubmitted).
133 //135 //
M gen/ermite/ermiteconnect/issue.connect.go +35 -2
@@ -47,6 +47,9 @@ const (
4747 IssueServiceAddIssueCommentProcedure = "/ermite.IssueService/AddIssueComment"
4848 // IssueServiceCloseIssueProcedure is the fully-qualified name of the IssueService's CloseIssue RPC.
4949 IssueServiceCloseIssueProcedure = "/ermite.IssueService/CloseIssue"
50+ // IssueServiceResolveIssueProcedure is the fully-qualified name of the IssueService's ResolveIssue
51+ // RPC.
52+ IssueServiceResolveIssueProcedure = "/ermite.IssueService/ResolveIssue"
5053 // IssueServiceReopenIssueProcedure is the fully-qualified name of the IssueService's ReopenIssue
5154 // RPC.
5255 IssueServiceReopenIssueProcedure = "/ermite.IssueService/ReopenIssue"
@@ -73,7 +76,10 @@ type IssueServiceClient interface {
7376 AddIssueComment(context.Context, *connect.Request[ermite.AddIssueCommentRequest]) (*connect.Response[ermite.AddIssueCommentResponse], error)
7477 // CloseIssue closes an issue. Needs the issue:write scope.
7578 CloseIssue(context.Context, *connect.Request[ermite.CloseIssueRequest]) (*connect.Response[ermite.CloseIssueResponse], error)
76- // ReopenIssue reopens an issue. Needs the issue:write scope.
79+ // ResolveIssue marks an open issue as resolved. Needs the issue:write scope.
80+ ResolveIssue(context.Context, *connect.Request[ermite.ResolveIssueRequest]) (*connect.Response[ermite.ResolveIssueResponse], error)
81+ // ReopenIssue reopens a closed or resolved issue. Needs the issue:write
82+ // scope.
7783 ReopenIssue(context.Context, *connect.Request[ermite.ReopenIssueRequest]) (*connect.Response[ermite.ReopenIssueResponse], error)
7884 // ListPendingIssues lists issues awaiting moderation, oldest first. Owner
7985 // rights only; anyone else gets NOT_FOUND.
@@ -127,6 +133,12 @@ func NewIssueServiceClient(httpClient connect.HTTPClient, baseURL string, opts .
127133 connect.WithSchema(issueServiceMethods.ByName("CloseIssue")),
128134 connect.WithClientOptions(opts...),
129135 ),
136+ resolveIssue: connect.NewClient[ermite.ResolveIssueRequest, ermite.ResolveIssueResponse](
137+ httpClient,
138+ baseURL+IssueServiceResolveIssueProcedure,
139+ connect.WithSchema(issueServiceMethods.ByName("ResolveIssue")),
140+ connect.WithClientOptions(opts...),
141+ ),
130142 reopenIssue: connect.NewClient[ermite.ReopenIssueRequest, ermite.ReopenIssueResponse](
131143 httpClient,
132144 baseURL+IssueServiceReopenIssueProcedure,
@@ -161,6 +173,7 @@ type issueServiceClient struct {
161173 getIssue *connect.Client[ermite.GetIssueRequest, ermite.GetIssueResponse]
162174 addIssueComment *connect.Client[ermite.AddIssueCommentRequest, ermite.AddIssueCommentResponse]
163175 closeIssue *connect.Client[ermite.CloseIssueRequest, ermite.CloseIssueResponse]
176+ resolveIssue *connect.Client[ermite.ResolveIssueRequest, ermite.ResolveIssueResponse]
164177 reopenIssue *connect.Client[ermite.ReopenIssueRequest, ermite.ReopenIssueResponse]
165178 listPendingIssues *connect.Client[ermite.ListPendingIssuesRequest, ermite.ListPendingIssuesResponse]
166179 approveIssue *connect.Client[ermite.ApproveIssueRequest, ermite.ApproveIssueResponse]
@@ -192,6 +205,11 @@ func (c *issueServiceClient) CloseIssue(ctx context.Context, req *connect.Reques
192205 return c.closeIssue.CallUnary(ctx, req)
193206 }
194207
208+// ResolveIssue calls ermite.IssueService.ResolveIssue.
209+func (c *issueServiceClient) ResolveIssue(ctx context.Context, req *connect.Request[ermite.ResolveIssueRequest]) (*connect.Response[ermite.ResolveIssueResponse], error) {
210+ return c.resolveIssue.CallUnary(ctx, req)
211+}
212+
195213 // ReopenIssue calls ermite.IssueService.ReopenIssue.
196214 func (c *issueServiceClient) ReopenIssue(ctx context.Context, req *connect.Request[ermite.ReopenIssueRequest]) (*connect.Response[ermite.ReopenIssueResponse], error) {
197215 return c.reopenIssue.CallUnary(ctx, req)
@@ -224,7 +242,10 @@ type IssueServiceHandler interface {
224242 AddIssueComment(context.Context, *connect.Request[ermite.AddIssueCommentRequest]) (*connect.Response[ermite.AddIssueCommentResponse], error)
225243 // CloseIssue closes an issue. Needs the issue:write scope.
226244 CloseIssue(context.Context, *connect.Request[ermite.CloseIssueRequest]) (*connect.Response[ermite.CloseIssueResponse], error)
227- // ReopenIssue reopens an issue. Needs the issue:write scope.
245+ // ResolveIssue marks an open issue as resolved. Needs the issue:write scope.
246+ ResolveIssue(context.Context, *connect.Request[ermite.ResolveIssueRequest]) (*connect.Response[ermite.ResolveIssueResponse], error)
247+ // ReopenIssue reopens a closed or resolved issue. Needs the issue:write
248+ // scope.
228249 ReopenIssue(context.Context, *connect.Request[ermite.ReopenIssueRequest]) (*connect.Response[ermite.ReopenIssueResponse], error)
229250 // ListPendingIssues lists issues awaiting moderation, oldest first. Owner
230251 // rights only; anyone else gets NOT_FOUND.
@@ -274,6 +295,12 @@ func NewIssueServiceHandler(svc IssueServiceHandler, opts ...connect.HandlerOpti
274295 connect.WithSchema(issueServiceMethods.ByName("CloseIssue")),
275296 connect.WithHandlerOptions(opts...),
276297 )
298+ issueServiceResolveIssueHandler := connect.NewUnaryHandler(
299+ IssueServiceResolveIssueProcedure,
300+ svc.ResolveIssue,
301+ connect.WithSchema(issueServiceMethods.ByName("ResolveIssue")),
302+ connect.WithHandlerOptions(opts...),
303+ )
277304 issueServiceReopenIssueHandler := connect.NewUnaryHandler(
278305 IssueServiceReopenIssueProcedure,
279306 svc.ReopenIssue,
@@ -310,6 +337,8 @@ func NewIssueServiceHandler(svc IssueServiceHandler, opts ...connect.HandlerOpti
310337 issueServiceAddIssueCommentHandler.ServeHTTP(w, r)
311338 case IssueServiceCloseIssueProcedure:
312339 issueServiceCloseIssueHandler.ServeHTTP(w, r)
340+ case IssueServiceResolveIssueProcedure:
341+ issueServiceResolveIssueHandler.ServeHTTP(w, r)
313342 case IssueServiceReopenIssueProcedure:
314343 issueServiceReopenIssueHandler.ServeHTTP(w, r)
315344 case IssueServiceListPendingIssuesProcedure:
@@ -347,6 +376,10 @@ func (UnimplementedIssueServiceHandler) CloseIssue(context.Context, *connect.Req
347376 return nil, connect.NewError(connect.CodeUnimplemented, errors.New("ermite.IssueService.CloseIssue is not implemented"))
348377 }
349378
379+func (UnimplementedIssueServiceHandler) ResolveIssue(context.Context, *connect.Request[ermite.ResolveIssueRequest]) (*connect.Response[ermite.ResolveIssueResponse], error) {
380+ return nil, connect.NewError(connect.CodeUnimplemented, errors.New("ermite.IssueService.ResolveIssue is not implemented"))
381+}
382+
350383 func (UnimplementedIssueServiceHandler) ReopenIssue(context.Context, *connect.Request[ermite.ReopenIssueRequest]) (*connect.Response[ermite.ReopenIssueResponse], error) {
351384 return nil, connect.NewError(connect.CodeUnimplemented, errors.New("ermite.IssueService.ReopenIssue is not implemented"))
352385 }
@@ -47,6 +47,9 @@ const (
47 IssueServiceAddIssueCommentProcedure = "/ermite.IssueService/AddIssueComment"47 IssueServiceAddIssueCommentProcedure = "/ermite.IssueService/AddIssueComment"
48 // IssueServiceCloseIssueProcedure is the fully-qualified name of the IssueService's CloseIssue RPC.48 // IssueServiceCloseIssueProcedure is the fully-qualified name of the IssueService's CloseIssue RPC.
49 IssueServiceCloseIssueProcedure = "/ermite.IssueService/CloseIssue"49 IssueServiceCloseIssueProcedure = "/ermite.IssueService/CloseIssue"
50+ // IssueServiceResolveIssueProcedure is the fully-qualified name of the IssueService's ResolveIssue
51+ // RPC.
52+ IssueServiceResolveIssueProcedure = "/ermite.IssueService/ResolveIssue"
50 // IssueServiceReopenIssueProcedure is the fully-qualified name of the IssueService's ReopenIssue53 // IssueServiceReopenIssueProcedure is the fully-qualified name of the IssueService's ReopenIssue
51 // RPC.54 // RPC.
52 IssueServiceReopenIssueProcedure = "/ermite.IssueService/ReopenIssue"55 IssueServiceReopenIssueProcedure = "/ermite.IssueService/ReopenIssue"
@@ -73,7 +76,10 @@ type IssueServiceClient interface {
73 AddIssueComment(context.Context, *connect.Request[ermite.AddIssueCommentRequest]) (*connect.Response[ermite.AddIssueCommentResponse], error)76 AddIssueComment(context.Context, *connect.Request[ermite.AddIssueCommentRequest]) (*connect.Response[ermite.AddIssueCommentResponse], error)
74 // CloseIssue closes an issue. Needs the issue:write scope.77 // CloseIssue closes an issue. Needs the issue:write scope.
75 CloseIssue(context.Context, *connect.Request[ermite.CloseIssueRequest]) (*connect.Response[ermite.CloseIssueResponse], error)78 CloseIssue(context.Context, *connect.Request[ermite.CloseIssueRequest]) (*connect.Response[ermite.CloseIssueResponse], error)
76- // ReopenIssue reopens an issue. Needs the issue:write scope.79+ // ResolveIssue marks an open issue as resolved. Needs the issue:write scope.
80+ ResolveIssue(context.Context, *connect.Request[ermite.ResolveIssueRequest]) (*connect.Response[ermite.ResolveIssueResponse], error)
81+ // ReopenIssue reopens a closed or resolved issue. Needs the issue:write
82+ // scope.
77 ReopenIssue(context.Context, *connect.Request[ermite.ReopenIssueRequest]) (*connect.Response[ermite.ReopenIssueResponse], error)83 ReopenIssue(context.Context, *connect.Request[ermite.ReopenIssueRequest]) (*connect.Response[ermite.ReopenIssueResponse], error)
78 // ListPendingIssues lists issues awaiting moderation, oldest first. Owner84 // ListPendingIssues lists issues awaiting moderation, oldest first. Owner
79 // rights only; anyone else gets NOT_FOUND.85 // rights only; anyone else gets NOT_FOUND.
@@ -127,6 +133,12 @@ func NewIssueServiceClient(httpClient connect.HTTPClient, baseURL string, opts .
127 connect.WithSchema(issueServiceMethods.ByName("CloseIssue")),133 connect.WithSchema(issueServiceMethods.ByName("CloseIssue")),
128 connect.WithClientOptions(opts...),134 connect.WithClientOptions(opts...),
129 ),135 ),
136+ resolveIssue: connect.NewClient[ermite.ResolveIssueRequest, ermite.ResolveIssueResponse](
137+ httpClient,
138+ baseURL+IssueServiceResolveIssueProcedure,
139+ connect.WithSchema(issueServiceMethods.ByName("ResolveIssue")),
140+ connect.WithClientOptions(opts...),
141+ ),
130 reopenIssue: connect.NewClient[ermite.ReopenIssueRequest, ermite.ReopenIssueResponse](142 reopenIssue: connect.NewClient[ermite.ReopenIssueRequest, ermite.ReopenIssueResponse](
131 httpClient,143 httpClient,
132 baseURL+IssueServiceReopenIssueProcedure,144 baseURL+IssueServiceReopenIssueProcedure,
@@ -161,6 +173,7 @@ type issueServiceClient struct {
161 getIssue *connect.Client[ermite.GetIssueRequest, ermite.GetIssueResponse]173 getIssue *connect.Client[ermite.GetIssueRequest, ermite.GetIssueResponse]
162 addIssueComment *connect.Client[ermite.AddIssueCommentRequest, ermite.AddIssueCommentResponse]174 addIssueComment *connect.Client[ermite.AddIssueCommentRequest, ermite.AddIssueCommentResponse]
163 closeIssue *connect.Client[ermite.CloseIssueRequest, ermite.CloseIssueResponse]175 closeIssue *connect.Client[ermite.CloseIssueRequest, ermite.CloseIssueResponse]
176+ resolveIssue *connect.Client[ermite.ResolveIssueRequest, ermite.ResolveIssueResponse]
164 reopenIssue *connect.Client[ermite.ReopenIssueRequest, ermite.ReopenIssueResponse]177 reopenIssue *connect.Client[ermite.ReopenIssueRequest, ermite.ReopenIssueResponse]
165 listPendingIssues *connect.Client[ermite.ListPendingIssuesRequest, ermite.ListPendingIssuesResponse]178 listPendingIssues *connect.Client[ermite.ListPendingIssuesRequest, ermite.ListPendingIssuesResponse]
166 approveIssue *connect.Client[ermite.ApproveIssueRequest, ermite.ApproveIssueResponse]179 approveIssue *connect.Client[ermite.ApproveIssueRequest, ermite.ApproveIssueResponse]
@@ -192,6 +205,11 @@ func (c *issueServiceClient) CloseIssue(ctx context.Context, req *connect.Reques
192 return c.closeIssue.CallUnary(ctx, req)205 return c.closeIssue.CallUnary(ctx, req)
193 }206 }
194 207
208+// ResolveIssue calls ermite.IssueService.ResolveIssue.
209+func (c *issueServiceClient) ResolveIssue(ctx context.Context, req *connect.Request[ermite.ResolveIssueRequest]) (*connect.Response[ermite.ResolveIssueResponse], error) {
210+ return c.resolveIssue.CallUnary(ctx, req)
211+}
212+
195 // ReopenIssue calls ermite.IssueService.ReopenIssue.213 // ReopenIssue calls ermite.IssueService.ReopenIssue.
196 func (c *issueServiceClient) ReopenIssue(ctx context.Context, req *connect.Request[ermite.ReopenIssueRequest]) (*connect.Response[ermite.ReopenIssueResponse], error) {214 func (c *issueServiceClient) ReopenIssue(ctx context.Context, req *connect.Request[ermite.ReopenIssueRequest]) (*connect.Response[ermite.ReopenIssueResponse], error) {
197 return c.reopenIssue.CallUnary(ctx, req)215 return c.reopenIssue.CallUnary(ctx, req)
@@ -224,7 +242,10 @@ type IssueServiceHandler interface {
224 AddIssueComment(context.Context, *connect.Request[ermite.AddIssueCommentRequest]) (*connect.Response[ermite.AddIssueCommentResponse], error)242 AddIssueComment(context.Context, *connect.Request[ermite.AddIssueCommentRequest]) (*connect.Response[ermite.AddIssueCommentResponse], error)
225 // CloseIssue closes an issue. Needs the issue:write scope.243 // CloseIssue closes an issue. Needs the issue:write scope.
226 CloseIssue(context.Context, *connect.Request[ermite.CloseIssueRequest]) (*connect.Response[ermite.CloseIssueResponse], error)244 CloseIssue(context.Context, *connect.Request[ermite.CloseIssueRequest]) (*connect.Response[ermite.CloseIssueResponse], error)
227- // ReopenIssue reopens an issue. Needs the issue:write scope.245+ // ResolveIssue marks an open issue as resolved. Needs the issue:write scope.
246+ ResolveIssue(context.Context, *connect.Request[ermite.ResolveIssueRequest]) (*connect.Response[ermite.ResolveIssueResponse], error)
247+ // ReopenIssue reopens a closed or resolved issue. Needs the issue:write
248+ // scope.
228 ReopenIssue(context.Context, *connect.Request[ermite.ReopenIssueRequest]) (*connect.Response[ermite.ReopenIssueResponse], error)249 ReopenIssue(context.Context, *connect.Request[ermite.ReopenIssueRequest]) (*connect.Response[ermite.ReopenIssueResponse], error)
229 // ListPendingIssues lists issues awaiting moderation, oldest first. Owner250 // ListPendingIssues lists issues awaiting moderation, oldest first. Owner
230 // rights only; anyone else gets NOT_FOUND.251 // rights only; anyone else gets NOT_FOUND.
@@ -274,6 +295,12 @@ func NewIssueServiceHandler(svc IssueServiceHandler, opts ...connect.HandlerOpti
274 connect.WithSchema(issueServiceMethods.ByName("CloseIssue")),295 connect.WithSchema(issueServiceMethods.ByName("CloseIssue")),
275 connect.WithHandlerOptions(opts...),296 connect.WithHandlerOptions(opts...),
276 )297 )
298+ issueServiceResolveIssueHandler := connect.NewUnaryHandler(
299+ IssueServiceResolveIssueProcedure,
300+ svc.ResolveIssue,
301+ connect.WithSchema(issueServiceMethods.ByName("ResolveIssue")),
302+ connect.WithHandlerOptions(opts...),
303+ )
277 issueServiceReopenIssueHandler := connect.NewUnaryHandler(304 issueServiceReopenIssueHandler := connect.NewUnaryHandler(
278 IssueServiceReopenIssueProcedure,305 IssueServiceReopenIssueProcedure,
279 svc.ReopenIssue,306 svc.ReopenIssue,
@@ -310,6 +337,8 @@ func NewIssueServiceHandler(svc IssueServiceHandler, opts ...connect.HandlerOpti
310 issueServiceAddIssueCommentHandler.ServeHTTP(w, r)337 issueServiceAddIssueCommentHandler.ServeHTTP(w, r)
311 case IssueServiceCloseIssueProcedure:338 case IssueServiceCloseIssueProcedure:
312 issueServiceCloseIssueHandler.ServeHTTP(w, r)339 issueServiceCloseIssueHandler.ServeHTTP(w, r)
340+ case IssueServiceResolveIssueProcedure:
341+ issueServiceResolveIssueHandler.ServeHTTP(w, r)
313 case IssueServiceReopenIssueProcedure:342 case IssueServiceReopenIssueProcedure:
314 issueServiceReopenIssueHandler.ServeHTTP(w, r)343 issueServiceReopenIssueHandler.ServeHTTP(w, r)
315 case IssueServiceListPendingIssuesProcedure:344 case IssueServiceListPendingIssuesProcedure:
@@ -347,6 +376,10 @@ func (UnimplementedIssueServiceHandler) CloseIssue(context.Context, *connect.Req
347 return nil, connect.NewError(connect.CodeUnimplemented, errors.New("ermite.IssueService.CloseIssue is not implemented"))376 return nil, connect.NewError(connect.CodeUnimplemented, errors.New("ermite.IssueService.CloseIssue is not implemented"))
348 }377 }
349 378
379+func (UnimplementedIssueServiceHandler) ResolveIssue(context.Context, *connect.Request[ermite.ResolveIssueRequest]) (*connect.Response[ermite.ResolveIssueResponse], error) {
380+ return nil, connect.NewError(connect.CodeUnimplemented, errors.New("ermite.IssueService.ResolveIssue is not implemented"))
381+}
382+
350 func (UnimplementedIssueServiceHandler) ReopenIssue(context.Context, *connect.Request[ermite.ReopenIssueRequest]) (*connect.Response[ermite.ReopenIssueResponse], error) {383 func (UnimplementedIssueServiceHandler) ReopenIssue(context.Context, *connect.Request[ermite.ReopenIssueRequest]) (*connect.Response[ermite.ReopenIssueResponse], error) {
351 return nil, connect.NewError(connect.CodeUnimplemented, errors.New("ermite.IssueService.ReopenIssue is not implemented"))384 return nil, connect.NewError(connect.CodeUnimplemented, errors.New("ermite.IssueService.ReopenIssue is not implemented"))
352 }385 }
M gen/ermite/event.pb.go +175 -103 generated file: collapsed
M gen/ermite/issue.pb.go +216 -83
@@ -33,10 +33,14 @@ const (
3333 IssueState_ISSUE_STATE_UNSPECIFIED IssueState = 0
3434 // The issue is open.
3535 IssueState_ISSUE_STATE_OPEN IssueState = 1
36- // The issue is closed.
36+ // The issue is closed without being resolved (won't fix, duplicate, ...).
3737 IssueState_ISSUE_STATE_CLOSED IssueState = 2
3838 // Reserved for later use: awaiting moderation, owner-only.
3939 IssueState_ISSUE_STATE_PENDING IssueState = 3
40+ // The issue was fixed: by the merge of a merge request with a closing
41+ // reference, or by hand (ResolveIssue). CLOSED means closed without being
42+ // resolved.
43+ IssueState_ISSUE_STATE_RESOLVED IssueState = 4
4044 )
4145
4246 // Enum value maps for IssueState.
@@ -46,12 +50,14 @@ var (
4650 1: "ISSUE_STATE_OPEN",
4751 2: "ISSUE_STATE_CLOSED",
4852 3: "ISSUE_STATE_PENDING",
53+ 4: "ISSUE_STATE_RESOLVED",
4954 }
5055 IssueState_value = map[string]int32{
5156 "ISSUE_STATE_UNSPECIFIED": 0,
5257 "ISSUE_STATE_OPEN": 1,
5358 "ISSUE_STATE_CLOSED": 2,
5459 "ISSUE_STATE_PENDING": 3,
60+ "ISSUE_STATE_RESOLVED": 4,
5561 }
5662 )
5763
@@ -108,9 +114,10 @@ type Issue struct {
108114 UpdatedAt *timestamppb.Timestamp `protobuf:"bytes,8,opt,name=updated_at,json=updatedAt,proto3" json:"updated_at,omitempty"`
109115 // CommentCount is the number of comments on the issue.
110116 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.
117+ // ClosedByMergeRequest is the number of the merge request whose merge
118+ // resolved the issue (a closing reference such as "Fixes #N"); 0 when the
119+ // issue was resolved by hand, is closed, or is open. Reset when the issue is
120+ // reopened.
114121 ClosedByMergeRequest int64 `protobuf:"varint,10,opt,name=closed_by_merge_request,json=closedByMergeRequest,proto3" json:"closed_by_merge_request,omitempty"`
115122 unknownFields protoimpl.UnknownFields
116123 sizeCache protoimpl.SizeCache
@@ -670,7 +677,10 @@ type GetIssueResponse struct {
670677 Comments []*IssueComment `protobuf:"bytes,2,rep,name=comments,proto3" json:"comments,omitempty"`
671678 // References are the merge requests naming the issue, ascending by number,
672679 // at most 100.
673- References []*IssueReference `protobuf:"bytes,3,rep,name=references,proto3" json:"references,omitempty"`
680+ References []*IssueReference `protobuf:"bytes,3,rep,name=references,proto3" json:"references,omitempty"`
681+ // Events are the history of the issue, oldest first, at most 500 (a server
682+ // limit). Clients interleave them with the comments by created_at.
683+ Events []*IssueEvent `protobuf:"bytes,4,rep,name=events,proto3" json:"events,omitempty"`
674684 unknownFields protoimpl.UnknownFields
675685 sizeCache protoimpl.SizeCache
676686 }
@@ -726,6 +736,13 @@ func (x *GetIssueResponse) GetReferences() []*IssueReference {
726736 return nil
727737 }
728738
739+func (x *GetIssueResponse) GetEvents() []*IssueEvent {
740+ if x != nil {
741+ return x.Events
742+ }
743+ return nil
744+}
745+
729746 // AddIssueCommentRequest describes the comment to add.
730747 type AddIssueCommentRequest struct {
731748 state protoimpl.MessageState `protogen:"open.v1"`
@@ -937,6 +954,107 @@ func (x *CloseIssueResponse) GetIssue() *Issue {
937954 return nil
938955 }
939956
957+// ResolveIssueRequest names the issue to resolve.
958+type ResolveIssueRequest struct {
959+ state protoimpl.MessageState `protogen:"open.v1"`
960+ // Repo is the repository name.
961+ Repo string `protobuf:"bytes,1,opt,name=repo,proto3" json:"repo,omitempty"`
962+ // Number is the issue number.
963+ Number int64 `protobuf:"varint,2,opt,name=number,proto3" json:"number,omitempty"`
964+ unknownFields protoimpl.UnknownFields
965+ sizeCache protoimpl.SizeCache
966+}
967+
968+func (x *ResolveIssueRequest) Reset() {
969+ *x = ResolveIssueRequest{}
970+ mi := &file_ermite_issue_proto_msgTypes[13]
971+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
972+ ms.StoreMessageInfo(mi)
973+}
974+
975+func (x *ResolveIssueRequest) String() string {
976+ return protoimpl.X.MessageStringOf(x)
977+}
978+
979+func (*ResolveIssueRequest) ProtoMessage() {}
980+
981+func (x *ResolveIssueRequest) ProtoReflect() protoreflect.Message {
982+ mi := &file_ermite_issue_proto_msgTypes[13]
983+ if x != nil {
984+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
985+ if ms.LoadMessageInfo() == nil {
986+ ms.StoreMessageInfo(mi)
987+ }
988+ return ms
989+ }
990+ return mi.MessageOf(x)
991+}
992+
993+// Deprecated: Use ResolveIssueRequest.ProtoReflect.Descriptor instead.
994+func (*ResolveIssueRequest) Descriptor() ([]byte, []int) {
995+ return file_ermite_issue_proto_rawDescGZIP(), []int{13}
996+}
997+
998+func (x *ResolveIssueRequest) GetRepo() string {
999+ if x != nil {
1000+ return x.Repo
1001+ }
1002+ return ""
1003+}
1004+
1005+func (x *ResolveIssueRequest) GetNumber() int64 {
1006+ if x != nil {
1007+ return x.Number
1008+ }
1009+ return 0
1010+}
1011+
1012+// ResolveIssueResponse holds the issue after resolving.
1013+type ResolveIssueResponse struct {
1014+ state protoimpl.MessageState `protogen:"open.v1"`
1015+ // Issue is the resolved issue.
1016+ Issue *Issue `protobuf:"bytes,1,opt,name=issue,proto3" json:"issue,omitempty"`
1017+ unknownFields protoimpl.UnknownFields
1018+ sizeCache protoimpl.SizeCache
1019+}
1020+
1021+func (x *ResolveIssueResponse) Reset() {
1022+ *x = ResolveIssueResponse{}
1023+ mi := &file_ermite_issue_proto_msgTypes[14]
1024+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
1025+ ms.StoreMessageInfo(mi)
1026+}
1027+
1028+func (x *ResolveIssueResponse) String() string {
1029+ return protoimpl.X.MessageStringOf(x)
1030+}
1031+
1032+func (*ResolveIssueResponse) ProtoMessage() {}
1033+
1034+func (x *ResolveIssueResponse) ProtoReflect() protoreflect.Message {
1035+ mi := &file_ermite_issue_proto_msgTypes[14]
1036+ if x != nil {
1037+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
1038+ if ms.LoadMessageInfo() == nil {
1039+ ms.StoreMessageInfo(mi)
1040+ }
1041+ return ms
1042+ }
1043+ return mi.MessageOf(x)
1044+}
1045+
1046+// Deprecated: Use ResolveIssueResponse.ProtoReflect.Descriptor instead.
1047+func (*ResolveIssueResponse) Descriptor() ([]byte, []int) {
1048+ return file_ermite_issue_proto_rawDescGZIP(), []int{14}
1049+}
1050+
1051+func (x *ResolveIssueResponse) GetIssue() *Issue {
1052+ if x != nil {
1053+ return x.Issue
1054+ }
1055+ return nil
1056+}
1057+
9401058 // ReopenIssueRequest names the issue to reopen.
9411059 type ReopenIssueRequest struct {
9421060 state protoimpl.MessageState `protogen:"open.v1"`
@@ -950,7 +1068,7 @@ type ReopenIssueRequest struct {
9501068
9511069 func (x *ReopenIssueRequest) Reset() {
9521070 *x = ReopenIssueRequest{}
953- mi := &file_ermite_issue_proto_msgTypes[13]
1071+ mi := &file_ermite_issue_proto_msgTypes[15]
9541072 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
9551073 ms.StoreMessageInfo(mi)
9561074 }
@@ -962,7 +1080,7 @@ func (x *ReopenIssueRequest) String() string {
9621080 func (*ReopenIssueRequest) ProtoMessage() {}
9631081
9641082 func (x *ReopenIssueRequest) ProtoReflect() protoreflect.Message {
965- mi := &file_ermite_issue_proto_msgTypes[13]
1083+ mi := &file_ermite_issue_proto_msgTypes[15]
9661084 if x != nil {
9671085 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
9681086 if ms.LoadMessageInfo() == nil {
@@ -975,7 +1093,7 @@ func (x *ReopenIssueRequest) ProtoReflect() protoreflect.Message {
9751093
9761094 // Deprecated: Use ReopenIssueRequest.ProtoReflect.Descriptor instead.
9771095 func (*ReopenIssueRequest) Descriptor() ([]byte, []int) {
978- return file_ermite_issue_proto_rawDescGZIP(), []int{13}
1096+ return file_ermite_issue_proto_rawDescGZIP(), []int{15}
9791097 }
9801098
9811099 func (x *ReopenIssueRequest) GetRepo() string {
@@ -1003,7 +1121,7 @@ type ReopenIssueResponse struct {
10031121
10041122 func (x *ReopenIssueResponse) Reset() {
10051123 *x = ReopenIssueResponse{}
1006- mi := &file_ermite_issue_proto_msgTypes[14]
1124+ mi := &file_ermite_issue_proto_msgTypes[16]
10071125 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
10081126 ms.StoreMessageInfo(mi)
10091127 }
@@ -1015,7 +1133,7 @@ func (x *ReopenIssueResponse) String() string {
10151133 func (*ReopenIssueResponse) ProtoMessage() {}
10161134
10171135 func (x *ReopenIssueResponse) ProtoReflect() protoreflect.Message {
1018- mi := &file_ermite_issue_proto_msgTypes[14]
1136+ mi := &file_ermite_issue_proto_msgTypes[16]
10191137 if x != nil {
10201138 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
10211139 if ms.LoadMessageInfo() == nil {
@@ -1028,7 +1146,7 @@ func (x *ReopenIssueResponse) ProtoReflect() protoreflect.Message {
10281146
10291147 // Deprecated: Use ReopenIssueResponse.ProtoReflect.Descriptor instead.
10301148 func (*ReopenIssueResponse) Descriptor() ([]byte, []int) {
1031- return file_ermite_issue_proto_rawDescGZIP(), []int{14}
1149+ return file_ermite_issue_proto_rawDescGZIP(), []int{16}
10321150 }
10331151
10341152 func (x *ReopenIssueResponse) GetIssue() *Issue {
@@ -1061,7 +1179,7 @@ type PendingIssue struct {
10611179
10621180 func (x *PendingIssue) Reset() {
10631181 *x = PendingIssue{}
1064- mi := &file_ermite_issue_proto_msgTypes[15]
1182+ mi := &file_ermite_issue_proto_msgTypes[17]
10651183 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
10661184 ms.StoreMessageInfo(mi)
10671185 }
@@ -1073,7 +1191,7 @@ func (x *PendingIssue) String() string {
10731191 func (*PendingIssue) ProtoMessage() {}
10741192
10751193 func (x *PendingIssue) ProtoReflect() protoreflect.Message {
1076- mi := &file_ermite_issue_proto_msgTypes[15]
1194+ mi := &file_ermite_issue_proto_msgTypes[17]
10771195 if x != nil {
10781196 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
10791197 if ms.LoadMessageInfo() == nil {
@@ -1086,7 +1204,7 @@ func (x *PendingIssue) ProtoReflect() protoreflect.Message {
10861204
10871205 // Deprecated: Use PendingIssue.ProtoReflect.Descriptor instead.
10881206 func (*PendingIssue) Descriptor() ([]byte, []int) {
1089- return file_ermite_issue_proto_rawDescGZIP(), []int{15}
1207+ return file_ermite_issue_proto_rawDescGZIP(), []int{17}
10901208 }
10911209
10921210 func (x *PendingIssue) GetId() string {
@@ -1148,7 +1266,7 @@ type ListPendingIssuesRequest struct {
11481266
11491267 func (x *ListPendingIssuesRequest) Reset() {
11501268 *x = ListPendingIssuesRequest{}
1151- mi := &file_ermite_issue_proto_msgTypes[16]
1269+ mi := &file_ermite_issue_proto_msgTypes[18]
11521270 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
11531271 ms.StoreMessageInfo(mi)
11541272 }
@@ -1160,7 +1278,7 @@ func (x *ListPendingIssuesRequest) String() string {
11601278 func (*ListPendingIssuesRequest) ProtoMessage() {}
11611279
11621280 func (x *ListPendingIssuesRequest) ProtoReflect() protoreflect.Message {
1163- mi := &file_ermite_issue_proto_msgTypes[16]
1281+ mi := &file_ermite_issue_proto_msgTypes[18]
11641282 if x != nil {
11651283 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
11661284 if ms.LoadMessageInfo() == nil {
@@ -1173,7 +1291,7 @@ func (x *ListPendingIssuesRequest) ProtoReflect() protoreflect.Message {
11731291
11741292 // Deprecated: Use ListPendingIssuesRequest.ProtoReflect.Descriptor instead.
11751293 func (*ListPendingIssuesRequest) Descriptor() ([]byte, []int) {
1176- return file_ermite_issue_proto_rawDescGZIP(), []int{16}
1294+ return file_ermite_issue_proto_rawDescGZIP(), []int{18}
11771295 }
11781296
11791297 func (x *ListPendingIssuesRequest) GetRepo() string {
@@ -1211,7 +1329,7 @@ type ListPendingIssuesResponse struct {
12111329
12121330 func (x *ListPendingIssuesResponse) Reset() {
12131331 *x = ListPendingIssuesResponse{}
1214- mi := &file_ermite_issue_proto_msgTypes[17]
1332+ mi := &file_ermite_issue_proto_msgTypes[19]
12151333 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
12161334 ms.StoreMessageInfo(mi)
12171335 }
@@ -1223,7 +1341,7 @@ func (x *ListPendingIssuesResponse) String() string {
12231341 func (*ListPendingIssuesResponse) ProtoMessage() {}
12241342
12251343 func (x *ListPendingIssuesResponse) ProtoReflect() protoreflect.Message {
1226- mi := &file_ermite_issue_proto_msgTypes[17]
1344+ mi := &file_ermite_issue_proto_msgTypes[19]
12271345 if x != nil {
12281346 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
12291347 if ms.LoadMessageInfo() == nil {
@@ -1236,7 +1354,7 @@ func (x *ListPendingIssuesResponse) ProtoReflect() protoreflect.Message {
12361354
12371355 // Deprecated: Use ListPendingIssuesResponse.ProtoReflect.Descriptor instead.
12381356 func (*ListPendingIssuesResponse) Descriptor() ([]byte, []int) {
1239- return file_ermite_issue_proto_rawDescGZIP(), []int{17}
1357+ return file_ermite_issue_proto_rawDescGZIP(), []int{19}
12401358 }
12411359
12421360 func (x *ListPendingIssuesResponse) GetIssues() []*PendingIssue {
@@ -1266,7 +1384,7 @@ type ApproveIssueRequest struct {
12661384
12671385 func (x *ApproveIssueRequest) Reset() {
12681386 *x = ApproveIssueRequest{}
1269- mi := &file_ermite_issue_proto_msgTypes[18]
1387+ mi := &file_ermite_issue_proto_msgTypes[20]
12701388 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
12711389 ms.StoreMessageInfo(mi)
12721390 }
@@ -1278,7 +1396,7 @@ func (x *ApproveIssueRequest) String() string {
12781396 func (*ApproveIssueRequest) ProtoMessage() {}
12791397
12801398 func (x *ApproveIssueRequest) ProtoReflect() protoreflect.Message {
1281- mi := &file_ermite_issue_proto_msgTypes[18]
1399+ mi := &file_ermite_issue_proto_msgTypes[20]
12821400 if x != nil {
12831401 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
12841402 if ms.LoadMessageInfo() == nil {
@@ -1291,7 +1409,7 @@ func (x *ApproveIssueRequest) ProtoReflect() protoreflect.Message {
12911409
12921410 // Deprecated: Use ApproveIssueRequest.ProtoReflect.Descriptor instead.
12931411 func (*ApproveIssueRequest) Descriptor() ([]byte, []int) {
1294- return file_ermite_issue_proto_rawDescGZIP(), []int{18}
1412+ return file_ermite_issue_proto_rawDescGZIP(), []int{20}
12951413 }
12961414
12971415 func (x *ApproveIssueRequest) GetRepo() string {
@@ -1320,7 +1438,7 @@ type ApproveIssueResponse struct {
13201438
13211439 func (x *ApproveIssueResponse) Reset() {
13221440 *x = ApproveIssueResponse{}
1323- mi := &file_ermite_issue_proto_msgTypes[19]
1441+ mi := &file_ermite_issue_proto_msgTypes[21]
13241442 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
13251443 ms.StoreMessageInfo(mi)
13261444 }
@@ -1332,7 +1450,7 @@ func (x *ApproveIssueResponse) String() string {
13321450 func (*ApproveIssueResponse) ProtoMessage() {}
13331451
13341452 func (x *ApproveIssueResponse) ProtoReflect() protoreflect.Message {
1335- mi := &file_ermite_issue_proto_msgTypes[19]
1453+ mi := &file_ermite_issue_proto_msgTypes[21]
13361454 if x != nil {
13371455 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
13381456 if ms.LoadMessageInfo() == nil {
@@ -1345,7 +1463,7 @@ func (x *ApproveIssueResponse) ProtoReflect() protoreflect.Message {
13451463
13461464 // Deprecated: Use ApproveIssueResponse.ProtoReflect.Descriptor instead.
13471465 func (*ApproveIssueResponse) Descriptor() ([]byte, []int) {
1348- return file_ermite_issue_proto_rawDescGZIP(), []int{19}
1466+ return file_ermite_issue_proto_rawDescGZIP(), []int{21}
13491467 }
13501468
13511469 func (x *ApproveIssueResponse) GetIssue() *Issue {
@@ -1370,7 +1488,7 @@ type RejectIssueRequest struct {
13701488
13711489 func (x *RejectIssueRequest) Reset() {
13721490 *x = RejectIssueRequest{}
1373- mi := &file_ermite_issue_proto_msgTypes[20]
1491+ mi := &file_ermite_issue_proto_msgTypes[22]
13741492 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
13751493 ms.StoreMessageInfo(mi)
13761494 }
@@ -1382,7 +1500,7 @@ func (x *RejectIssueRequest) String() string {
13821500 func (*RejectIssueRequest) ProtoMessage() {}
13831501
13841502 func (x *RejectIssueRequest) ProtoReflect() protoreflect.Message {
1385- mi := &file_ermite_issue_proto_msgTypes[20]
1503+ mi := &file_ermite_issue_proto_msgTypes[22]
13861504 if x != nil {
13871505 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
13881506 if ms.LoadMessageInfo() == nil {
@@ -1395,7 +1513,7 @@ func (x *RejectIssueRequest) ProtoReflect() protoreflect.Message {
13951513
13961514 // Deprecated: Use RejectIssueRequest.ProtoReflect.Descriptor instead.
13971515 func (*RejectIssueRequest) Descriptor() ([]byte, []int) {
1398- return file_ermite_issue_proto_rawDescGZIP(), []int{20}
1516+ return file_ermite_issue_proto_rawDescGZIP(), []int{22}
13991517 }
14001518
14011519 func (x *RejectIssueRequest) GetRepo() string {
@@ -1428,7 +1546,7 @@ type RejectIssueResponse struct {
14281546
14291547 func (x *RejectIssueResponse) Reset() {
14301548 *x = RejectIssueResponse{}
1431- mi := &file_ermite_issue_proto_msgTypes[21]
1549+ mi := &file_ermite_issue_proto_msgTypes[23]
14321550 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
14331551 ms.StoreMessageInfo(mi)
14341552 }
@@ -1440,7 +1558,7 @@ func (x *RejectIssueResponse) String() string {
14401558 func (*RejectIssueResponse) ProtoMessage() {}
14411559
14421560 func (x *RejectIssueResponse) ProtoReflect() protoreflect.Message {
1443- mi := &file_ermite_issue_proto_msgTypes[21]
1561+ mi := &file_ermite_issue_proto_msgTypes[23]
14441562 if x != nil {
14451563 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
14461564 if ms.LoadMessageInfo() == nil {
@@ -1453,7 +1571,7 @@ func (x *RejectIssueResponse) ProtoReflect() protoreflect.Message {
14531571
14541572 // Deprecated: Use RejectIssueResponse.ProtoReflect.Descriptor instead.
14551573 func (*RejectIssueResponse) Descriptor() ([]byte, []int) {
1456- return file_ermite_issue_proto_rawDescGZIP(), []int{21}
1574+ return file_ermite_issue_proto_rawDescGZIP(), []int{23}
14571575 }
14581576
14591577 var File_ermite_issue_proto protoreflect.FileDescriptor
@@ -1503,13 +1621,14 @@ const file_ermite_issue_proto_rawDesc = "" +
15031621 "\x0fnext_page_token\x18\x02 \x01(\tR\rnextPageToken\"=\n" +
15041622 "\x0fGetIssueRequest\x12\x12\n" +
15051623 "\x04repo\x18\x01 \x01(\tR\x04repo\x12\x16\n" +
1506- "\x06number\x18\x02 \x01(\x03R\x06number\"\xa1\x01\n" +
1624+ "\x06number\x18\x02 \x01(\x03R\x06number\"\xcd\x01\n" +
15071625 "\x10GetIssueResponse\x12#\n" +
15081626 "\x05issue\x18\x01 \x01(\v2\r.ermite.IssueR\x05issue\x120\n" +
15091627 "\bcomments\x18\x02 \x03(\v2\x14.ermite.IssueCommentR\bcomments\x126\n" +
15101628 "\n" +
15111629 "references\x18\x03 \x03(\v2\x16.ermite.IssueReferenceR\n" +
1512- "references\"X\n" +
1630+ "references\x12*\n" +
1631+ "\x06events\x18\x04 \x03(\v2\x12.ermite.IssueEventR\x06events\"X\n" +
15131632 "\x16AddIssueCommentRequest\x12\x12\n" +
15141633 "\x04repo\x18\x01 \x01(\tR\x04repo\x12\x16\n" +
15151634 "\x06number\x18\x02 \x01(\x03R\x06number\x12\x12\n" +
@@ -1520,6 +1639,11 @@ const file_ermite_issue_proto_rawDesc = "" +
15201639 "\x04repo\x18\x01 \x01(\tR\x04repo\x12\x16\n" +
15211640 "\x06number\x18\x02 \x01(\x03R\x06number\"9\n" +
15221641 "\x12CloseIssueResponse\x12#\n" +
1642+ "\x05issue\x18\x01 \x01(\v2\r.ermite.IssueR\x05issue\"A\n" +
1643+ "\x13ResolveIssueRequest\x12\x12\n" +
1644+ "\x04repo\x18\x01 \x01(\tR\x04repo\x12\x16\n" +
1645+ "\x06number\x18\x02 \x01(\x03R\x06number\";\n" +
1646+ "\x14ResolveIssueResponse\x12#\n" +
15231647 "\x05issue\x18\x01 \x01(\v2\r.ermite.IssueR\x05issue\"@\n" +
15241648 "\x12ReopenIssueRequest\x12\x12\n" +
15251649 "\x04repo\x18\x01 \x01(\tR\x04repo\x12\x16\n" +
@@ -1551,13 +1675,14 @@ const file_ermite_issue_proto_rawDesc = "" +
15511675 "\x04repo\x18\x01 \x01(\tR\x04repo\x12\x0e\n" +
15521676 "\x02id\x18\x02 \x01(\tR\x02id\x12\x10\n" +
15531677 "\x03ban\x18\x03 \x01(\bR\x03ban\"\x15\n" +
1554- "\x13RejectIssueResponse*p\n" +
1678+ "\x13RejectIssueResponse*\x8a\x01\n" +
15551679 "\n" +
15561680 "IssueState\x12\x1b\n" +
15571681 "\x17ISSUE_STATE_UNSPECIFIED\x10\x00\x12\x14\n" +
15581682 "\x10ISSUE_STATE_OPEN\x10\x01\x12\x16\n" +
15591683 "\x12ISSUE_STATE_CLOSED\x10\x02\x12\x17\n" +
1560- "\x13ISSUE_STATE_PENDING\x10\x032\xa8\x05\n" +
1684+ "\x13ISSUE_STATE_PENDING\x10\x03\x12\x18\n" +
1685+ "\x14ISSUE_STATE_RESOLVED\x10\x042\xf3\x05\n" +
15611686 "\fIssueService\x12F\n" +
15621687 "\vCreateIssue\x12\x1a.ermite.CreateIssueRequest\x1a\x1b.ermite.CreateIssueResponse\x12C\n" +
15631688 "\n" +
@@ -1565,7 +1690,8 @@ const file_ermite_issue_proto_rawDesc = "" +
15651690 "\bGetIssue\x12\x17.ermite.GetIssueRequest\x1a\x18.ermite.GetIssueResponse\x12R\n" +
15661691 "\x0fAddIssueComment\x12\x1e.ermite.AddIssueCommentRequest\x1a\x1f.ermite.AddIssueCommentResponse\x12C\n" +
15671692 "\n" +
1568- "CloseIssue\x12\x19.ermite.CloseIssueRequest\x1a\x1a.ermite.CloseIssueResponse\x12F\n" +
1693+ "CloseIssue\x12\x19.ermite.CloseIssueRequest\x1a\x1a.ermite.CloseIssueResponse\x12I\n" +
1694+ "\fResolveIssue\x12\x1b.ermite.ResolveIssueRequest\x1a\x1c.ermite.ResolveIssueResponse\x12F\n" +
15691695 "\vReopenIssue\x12\x1a.ermite.ReopenIssueRequest\x1a\x1b.ermite.ReopenIssueResponse\x12X\n" +
15701696 "\x11ListPendingIssues\x12 .ermite.ListPendingIssuesRequest\x1a!.ermite.ListPendingIssuesResponse\x12I\n" +
15711697 "\fApproveIssue\x12\x1b.ermite.ApproveIssueRequest\x1a\x1c.ermite.ApproveIssueResponse\x12F\n" +
@@ -1587,7 +1713,7 @@ func file_ermite_issue_proto_rawDescGZIP() []byte {
15871713 }
15881714
15891715 var file_ermite_issue_proto_enumTypes = make([]protoimpl.EnumInfo, 1)
1590-var file_ermite_issue_proto_msgTypes = make([]protoimpl.MessageInfo, 22)
1716+var file_ermite_issue_proto_msgTypes = make([]protoimpl.MessageInfo, 24)
15911717 var file_ermite_issue_proto_goTypes = []any{
15921718 (IssueState)(0), // 0: ermite.IssueState
15931719 (*Issue)(nil), // 1: ermite.Issue
@@ -1603,59 +1729,66 @@ var file_ermite_issue_proto_goTypes = []any{
16031729 (*AddIssueCommentResponse)(nil), // 11: ermite.AddIssueCommentResponse
16041730 (*CloseIssueRequest)(nil), // 12: ermite.CloseIssueRequest
16051731 (*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
1732+ (*ResolveIssueRequest)(nil), // 14: ermite.ResolveIssueRequest
1733+ (*ResolveIssueResponse)(nil), // 15: ermite.ResolveIssueResponse
1734+ (*ReopenIssueRequest)(nil), // 16: ermite.ReopenIssueRequest
1735+ (*ReopenIssueResponse)(nil), // 17: ermite.ReopenIssueResponse
1736+ (*PendingIssue)(nil), // 18: ermite.PendingIssue
1737+ (*ListPendingIssuesRequest)(nil), // 19: ermite.ListPendingIssuesRequest
1738+ (*ListPendingIssuesResponse)(nil), // 20: ermite.ListPendingIssuesResponse
1739+ (*ApproveIssueRequest)(nil), // 21: ermite.ApproveIssueRequest
1740+ (*ApproveIssueResponse)(nil), // 22: ermite.ApproveIssueResponse
1741+ (*RejectIssueRequest)(nil), // 23: ermite.RejectIssueRequest
1742+ (*RejectIssueResponse)(nil), // 24: ermite.RejectIssueResponse
1743+ (*timestamppb.Timestamp)(nil), // 25: google.protobuf.Timestamp
1744+ (MergeRequestState)(0), // 26: ermite.MergeRequestState
1745+ (*IssueEvent)(nil), // 27: ermite.IssueEvent
16171746 }
16181747 var file_ermite_issue_proto_depIdxs = []int32{
16191748 0, // 0: ermite.Issue.state:type_name -> ermite.IssueState
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
1749+ 25, // 1: ermite.Issue.created_at:type_name -> google.protobuf.Timestamp
1750+ 25, // 2: ermite.Issue.updated_at:type_name -> google.protobuf.Timestamp
1751+ 26, // 3: ermite.IssueReference.state:type_name -> ermite.MergeRequestState
1752+ 25, // 4: ermite.IssueComment.created_at:type_name -> google.protobuf.Timestamp
16241753 1, // 5: ermite.CreateIssueResponse.issue:type_name -> ermite.Issue
16251754 0, // 6: ermite.ListIssuesRequest.state:type_name -> ermite.IssueState
16261755 1, // 7: ermite.ListIssuesResponse.issues:type_name -> ermite.Issue
16271756 1, // 8: ermite.GetIssueResponse.issue:type_name -> ermite.Issue
16281757 3, // 9: ermite.GetIssueResponse.comments:type_name -> ermite.IssueComment
16291758 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
1759+ 27, // 11: ermite.GetIssueResponse.events:type_name -> ermite.IssueEvent
1760+ 3, // 12: ermite.AddIssueCommentResponse.comment:type_name -> ermite.IssueComment
1761+ 1, // 13: ermite.CloseIssueResponse.issue:type_name -> ermite.Issue
1762+ 1, // 14: ermite.ResolveIssueResponse.issue:type_name -> ermite.Issue
1763+ 1, // 15: ermite.ReopenIssueResponse.issue:type_name -> ermite.Issue
1764+ 25, // 16: ermite.PendingIssue.created_at:type_name -> google.protobuf.Timestamp
1765+ 18, // 17: ermite.ListPendingIssuesResponse.issues:type_name -> ermite.PendingIssue
1766+ 1, // 18: ermite.ApproveIssueResponse.issue:type_name -> ermite.Issue
1767+ 4, // 19: ermite.IssueService.CreateIssue:input_type -> ermite.CreateIssueRequest
1768+ 6, // 20: ermite.IssueService.ListIssues:input_type -> ermite.ListIssuesRequest
1769+ 8, // 21: ermite.IssueService.GetIssue:input_type -> ermite.GetIssueRequest
1770+ 10, // 22: ermite.IssueService.AddIssueComment:input_type -> ermite.AddIssueCommentRequest
1771+ 12, // 23: ermite.IssueService.CloseIssue:input_type -> ermite.CloseIssueRequest
1772+ 14, // 24: ermite.IssueService.ResolveIssue:input_type -> ermite.ResolveIssueRequest
1773+ 16, // 25: ermite.IssueService.ReopenIssue:input_type -> ermite.ReopenIssueRequest
1774+ 19, // 26: ermite.IssueService.ListPendingIssues:input_type -> ermite.ListPendingIssuesRequest
1775+ 21, // 27: ermite.IssueService.ApproveIssue:input_type -> ermite.ApproveIssueRequest
1776+ 23, // 28: ermite.IssueService.RejectIssue:input_type -> ermite.RejectIssueRequest
1777+ 5, // 29: ermite.IssueService.CreateIssue:output_type -> ermite.CreateIssueResponse
1778+ 7, // 30: ermite.IssueService.ListIssues:output_type -> ermite.ListIssuesResponse
1779+ 9, // 31: ermite.IssueService.GetIssue:output_type -> ermite.GetIssueResponse
1780+ 11, // 32: ermite.IssueService.AddIssueComment:output_type -> ermite.AddIssueCommentResponse
1781+ 13, // 33: ermite.IssueService.CloseIssue:output_type -> ermite.CloseIssueResponse
1782+ 15, // 34: ermite.IssueService.ResolveIssue:output_type -> ermite.ResolveIssueResponse
1783+ 17, // 35: ermite.IssueService.ReopenIssue:output_type -> ermite.ReopenIssueResponse
1784+ 20, // 36: ermite.IssueService.ListPendingIssues:output_type -> ermite.ListPendingIssuesResponse
1785+ 22, // 37: ermite.IssueService.ApproveIssue:output_type -> ermite.ApproveIssueResponse
1786+ 24, // 38: ermite.IssueService.RejectIssue:output_type -> ermite.RejectIssueResponse
1787+ 29, // [29:39] is the sub-list for method output_type
1788+ 19, // [19:29] is the sub-list for method input_type
1789+ 19, // [19:19] is the sub-list for extension type_name
1790+ 19, // [19:19] is the sub-list for extension extendee
1791+ 0, // [0:19] is the sub-list for field type_name
16591792 }
16601793
16611794 func init() { file_ermite_issue_proto_init() }
@@ -1670,7 +1803,7 @@ func file_ermite_issue_proto_init() {
16701803 GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
16711804 RawDescriptor: unsafe.Slice(unsafe.StringData(file_ermite_issue_proto_rawDesc), len(file_ermite_issue_proto_rawDesc)),
16721805 NumEnums: 1,
1673- NumMessages: 22,
1806+ NumMessages: 24,
16741807 NumExtensions: 0,
16751808 NumServices: 1,
16761809 },
@@ -33,10 +33,14 @@ const (
33 IssueState_ISSUE_STATE_UNSPECIFIED IssueState = 033 IssueState_ISSUE_STATE_UNSPECIFIED IssueState = 0
34 // The issue is open.34 // The issue is open.
35 IssueState_ISSUE_STATE_OPEN IssueState = 135 IssueState_ISSUE_STATE_OPEN IssueState = 1
36- // The issue is closed.36+ // The issue is closed without being resolved (won't fix, duplicate, ...).
37 IssueState_ISSUE_STATE_CLOSED IssueState = 237 IssueState_ISSUE_STATE_CLOSED IssueState = 2
38 // Reserved for later use: awaiting moderation, owner-only.38 // Reserved for later use: awaiting moderation, owner-only.
39 IssueState_ISSUE_STATE_PENDING IssueState = 339 IssueState_ISSUE_STATE_PENDING IssueState = 3
40+ // The issue was fixed: by the merge of a merge request with a closing
41+ // reference, or by hand (ResolveIssue). CLOSED means closed without being
42+ // resolved.
43+ IssueState_ISSUE_STATE_RESOLVED IssueState = 4
40 )44 )
41 45
42 // Enum value maps for IssueState.46 // Enum value maps for IssueState.
@@ -46,12 +50,14 @@ var (
46 1: "ISSUE_STATE_OPEN",50 1: "ISSUE_STATE_OPEN",
47 2: "ISSUE_STATE_CLOSED",51 2: "ISSUE_STATE_CLOSED",
48 3: "ISSUE_STATE_PENDING",52 3: "ISSUE_STATE_PENDING",
53+ 4: "ISSUE_STATE_RESOLVED",
49 }54 }
50 IssueState_value = map[string]int32{55 IssueState_value = map[string]int32{
51 "ISSUE_STATE_UNSPECIFIED": 0,56 "ISSUE_STATE_UNSPECIFIED": 0,
52 "ISSUE_STATE_OPEN": 1,57 "ISSUE_STATE_OPEN": 1,
53 "ISSUE_STATE_CLOSED": 2,58 "ISSUE_STATE_CLOSED": 2,
54 "ISSUE_STATE_PENDING": 3,59 "ISSUE_STATE_PENDING": 3,
60+ "ISSUE_STATE_RESOLVED": 4,
55 }61 }
56 )62 )
57 63
@@ -108,9 +114,10 @@ type Issue struct {
108 UpdatedAt *timestamppb.Timestamp `protobuf:"bytes,8,opt,name=updated_at,json=updatedAt,proto3" json:"updated_at,omitempty"`114 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.115 // 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"`116 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 closed117+ // ClosedByMergeRequest is the number of the merge request whose merge
112- // the issue (a closing reference such as "Fixes #N"); 0 when the issue was118+ // resolved the issue (a closing reference such as "Fixes #N"); 0 when the
113- // closed by hand or is open. Reset when the issue is reopened.119+ // issue was resolved by hand, is closed, or is open. Reset when the issue is
120+ // reopened.
114 ClosedByMergeRequest int64 `protobuf:"varint,10,opt,name=closed_by_merge_request,json=closedByMergeRequest,proto3" json:"closed_by_merge_request,omitempty"`121 ClosedByMergeRequest int64 `protobuf:"varint,10,opt,name=closed_by_merge_request,json=closedByMergeRequest,proto3" json:"closed_by_merge_request,omitempty"`
115 unknownFields protoimpl.UnknownFields122 unknownFields protoimpl.UnknownFields
116 sizeCache protoimpl.SizeCache123 sizeCache protoimpl.SizeCache
@@ -670,7 +677,10 @@ type GetIssueResponse struct {
670 Comments []*IssueComment `protobuf:"bytes,2,rep,name=comments,proto3" json:"comments,omitempty"`677 Comments []*IssueComment `protobuf:"bytes,2,rep,name=comments,proto3" json:"comments,omitempty"`
671 // References are the merge requests naming the issue, ascending by number,678 // References are the merge requests naming the issue, ascending by number,
672 // at most 100.679 // at most 100.
673- References []*IssueReference `protobuf:"bytes,3,rep,name=references,proto3" json:"references,omitempty"`680+ References []*IssueReference `protobuf:"bytes,3,rep,name=references,proto3" json:"references,omitempty"`
681+ // Events are the history of the issue, oldest first, at most 500 (a server
682+ // limit). Clients interleave them with the comments by created_at.
683+ Events []*IssueEvent `protobuf:"bytes,4,rep,name=events,proto3" json:"events,omitempty"`
674 unknownFields protoimpl.UnknownFields684 unknownFields protoimpl.UnknownFields
675 sizeCache protoimpl.SizeCache685 sizeCache protoimpl.SizeCache
676 }686 }
@@ -726,6 +736,13 @@ func (x *GetIssueResponse) GetReferences() []*IssueReference {
726 return nil736 return nil
727 }737 }
728 738
739+func (x *GetIssueResponse) GetEvents() []*IssueEvent {
740+ if x != nil {
741+ return x.Events
742+ }
743+ return nil
744+}
745+
729 // AddIssueCommentRequest describes the comment to add.746 // AddIssueCommentRequest describes the comment to add.
730 type AddIssueCommentRequest struct {747 type AddIssueCommentRequest struct {
731 state protoimpl.MessageState `protogen:"open.v1"`748 state protoimpl.MessageState `protogen:"open.v1"`
@@ -937,6 +954,107 @@ func (x *CloseIssueResponse) GetIssue() *Issue {
937 return nil954 return nil
938 }955 }
939 956
957+// ResolveIssueRequest names the issue to resolve.
958+type ResolveIssueRequest struct {
959+ state protoimpl.MessageState `protogen:"open.v1"`
960+ // Repo is the repository name.
961+ Repo string `protobuf:"bytes,1,opt,name=repo,proto3" json:"repo,omitempty"`
962+ // Number is the issue number.
963+ Number int64 `protobuf:"varint,2,opt,name=number,proto3" json:"number,omitempty"`
964+ unknownFields protoimpl.UnknownFields
965+ sizeCache protoimpl.SizeCache
966+}
967+
968+func (x *ResolveIssueRequest) Reset() {
969+ *x = ResolveIssueRequest{}
970+ mi := &file_ermite_issue_proto_msgTypes[13]
971+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
972+ ms.StoreMessageInfo(mi)
973+}
974+
975+func (x *ResolveIssueRequest) String() string {
976+ return protoimpl.X.MessageStringOf(x)
977+}
978+
979+func (*ResolveIssueRequest) ProtoMessage() {}
980+
981+func (x *ResolveIssueRequest) ProtoReflect() protoreflect.Message {
982+ mi := &file_ermite_issue_proto_msgTypes[13]
983+ if x != nil {
984+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
985+ if ms.LoadMessageInfo() == nil {
986+ ms.StoreMessageInfo(mi)
987+ }
988+ return ms
989+ }
990+ return mi.MessageOf(x)
991+}
992+
993+// Deprecated: Use ResolveIssueRequest.ProtoReflect.Descriptor instead.
994+func (*ResolveIssueRequest) Descriptor() ([]byte, []int) {
995+ return file_ermite_issue_proto_rawDescGZIP(), []int{13}
996+}
997+
998+func (x *ResolveIssueRequest) GetRepo() string {
999+ if x != nil {
1000+ return x.Repo
1001+ }
1002+ return ""
1003+}
1004+
1005+func (x *ResolveIssueRequest) GetNumber() int64 {
1006+ if x != nil {
1007+ return x.Number
1008+ }
1009+ return 0
1010+}
1011+
1012+// ResolveIssueResponse holds the issue after resolving.
1013+type ResolveIssueResponse struct {
1014+ state protoimpl.MessageState `protogen:"open.v1"`
1015+ // Issue is the resolved issue.
1016+ Issue *Issue `protobuf:"bytes,1,opt,name=issue,proto3" json:"issue,omitempty"`
1017+ unknownFields protoimpl.UnknownFields
1018+ sizeCache protoimpl.SizeCache
1019+}
1020+
1021+func (x *ResolveIssueResponse) Reset() {
1022+ *x = ResolveIssueResponse{}
1023+ mi := &file_ermite_issue_proto_msgTypes[14]
1024+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
1025+ ms.StoreMessageInfo(mi)
1026+}
1027+
1028+func (x *ResolveIssueResponse) String() string {
1029+ return protoimpl.X.MessageStringOf(x)
1030+}
1031+
1032+func (*ResolveIssueResponse) ProtoMessage() {}
1033+
1034+func (x *ResolveIssueResponse) ProtoReflect() protoreflect.Message {
1035+ mi := &file_ermite_issue_proto_msgTypes[14]
1036+ if x != nil {
1037+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
1038+ if ms.LoadMessageInfo() == nil {
1039+ ms.StoreMessageInfo(mi)
1040+ }
1041+ return ms
1042+ }
1043+ return mi.MessageOf(x)
1044+}
1045+
1046+// Deprecated: Use ResolveIssueResponse.ProtoReflect.Descriptor instead.
1047+func (*ResolveIssueResponse) Descriptor() ([]byte, []int) {
1048+ return file_ermite_issue_proto_rawDescGZIP(), []int{14}
1049+}
1050+
1051+func (x *ResolveIssueResponse) GetIssue() *Issue {
1052+ if x != nil {
1053+ return x.Issue
1054+ }
1055+ return nil
1056+}
1057+
940 // ReopenIssueRequest names the issue to reopen.1058 // ReopenIssueRequest names the issue to reopen.
941 type ReopenIssueRequest struct {1059 type ReopenIssueRequest struct {
942 state protoimpl.MessageState `protogen:"open.v1"`1060 state protoimpl.MessageState `protogen:"open.v1"`
@@ -950,7 +1068,7 @@ type ReopenIssueRequest struct {
950 1068
951 func (x *ReopenIssueRequest) Reset() {1069 func (x *ReopenIssueRequest) Reset() {
952 *x = ReopenIssueRequest{}1070 *x = ReopenIssueRequest{}
953- mi := &file_ermite_issue_proto_msgTypes[13]1071+ mi := &file_ermite_issue_proto_msgTypes[15]
954 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))1072 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
955 ms.StoreMessageInfo(mi)1073 ms.StoreMessageInfo(mi)
956 }1074 }
@@ -962,7 +1080,7 @@ func (x *ReopenIssueRequest) String() string {
962 func (*ReopenIssueRequest) ProtoMessage() {}1080 func (*ReopenIssueRequest) ProtoMessage() {}
963 1081
964 func (x *ReopenIssueRequest) ProtoReflect() protoreflect.Message {1082 func (x *ReopenIssueRequest) ProtoReflect() protoreflect.Message {
965- mi := &file_ermite_issue_proto_msgTypes[13]1083+ mi := &file_ermite_issue_proto_msgTypes[15]
966 if x != nil {1084 if x != nil {
967 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))1085 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
968 if ms.LoadMessageInfo() == nil {1086 if ms.LoadMessageInfo() == nil {
@@ -975,7 +1093,7 @@ func (x *ReopenIssueRequest) ProtoReflect() protoreflect.Message {
975 1093
976 // Deprecated: Use ReopenIssueRequest.ProtoReflect.Descriptor instead.1094 // Deprecated: Use ReopenIssueRequest.ProtoReflect.Descriptor instead.
977 func (*ReopenIssueRequest) Descriptor() ([]byte, []int) {1095 func (*ReopenIssueRequest) Descriptor() ([]byte, []int) {
978- return file_ermite_issue_proto_rawDescGZIP(), []int{13}1096+ return file_ermite_issue_proto_rawDescGZIP(), []int{15}
979 }1097 }
980 1098
981 func (x *ReopenIssueRequest) GetRepo() string {1099 func (x *ReopenIssueRequest) GetRepo() string {
@@ -1003,7 +1121,7 @@ type ReopenIssueResponse struct {
1003 1121
1004 func (x *ReopenIssueResponse) Reset() {1122 func (x *ReopenIssueResponse) Reset() {
1005 *x = ReopenIssueResponse{}1123 *x = ReopenIssueResponse{}
1006- mi := &file_ermite_issue_proto_msgTypes[14]1124+ mi := &file_ermite_issue_proto_msgTypes[16]
1007 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))1125 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
1008 ms.StoreMessageInfo(mi)1126 ms.StoreMessageInfo(mi)
1009 }1127 }
@@ -1015,7 +1133,7 @@ func (x *ReopenIssueResponse) String() string {
1015 func (*ReopenIssueResponse) ProtoMessage() {}1133 func (*ReopenIssueResponse) ProtoMessage() {}
1016 1134
1017 func (x *ReopenIssueResponse) ProtoReflect() protoreflect.Message {1135 func (x *ReopenIssueResponse) ProtoReflect() protoreflect.Message {
1018- mi := &file_ermite_issue_proto_msgTypes[14]1136+ mi := &file_ermite_issue_proto_msgTypes[16]
1019 if x != nil {1137 if x != nil {
1020 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))1138 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
1021 if ms.LoadMessageInfo() == nil {1139 if ms.LoadMessageInfo() == nil {
@@ -1028,7 +1146,7 @@ func (x *ReopenIssueResponse) ProtoReflect() protoreflect.Message {
1028 1146
1029 // Deprecated: Use ReopenIssueResponse.ProtoReflect.Descriptor instead.1147 // Deprecated: Use ReopenIssueResponse.ProtoReflect.Descriptor instead.
1030 func (*ReopenIssueResponse) Descriptor() ([]byte, []int) {1148 func (*ReopenIssueResponse) Descriptor() ([]byte, []int) {
1031- return file_ermite_issue_proto_rawDescGZIP(), []int{14}1149+ return file_ermite_issue_proto_rawDescGZIP(), []int{16}
1032 }1150 }
1033 1151
1034 func (x *ReopenIssueResponse) GetIssue() *Issue {1152 func (x *ReopenIssueResponse) GetIssue() *Issue {
@@ -1061,7 +1179,7 @@ type PendingIssue struct {
1061 1179
1062 func (x *PendingIssue) Reset() {1180 func (x *PendingIssue) Reset() {
1063 *x = PendingIssue{}1181 *x = PendingIssue{}
1064- mi := &file_ermite_issue_proto_msgTypes[15]1182+ mi := &file_ermite_issue_proto_msgTypes[17]
1065 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))1183 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
1066 ms.StoreMessageInfo(mi)1184 ms.StoreMessageInfo(mi)
1067 }1185 }
@@ -1073,7 +1191,7 @@ func (x *PendingIssue) String() string {
1073 func (*PendingIssue) ProtoMessage() {}1191 func (*PendingIssue) ProtoMessage() {}
1074 1192
1075 func (x *PendingIssue) ProtoReflect() protoreflect.Message {1193 func (x *PendingIssue) ProtoReflect() protoreflect.Message {
1076- mi := &file_ermite_issue_proto_msgTypes[15]1194+ mi := &file_ermite_issue_proto_msgTypes[17]
1077 if x != nil {1195 if x != nil {
1078 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))1196 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
1079 if ms.LoadMessageInfo() == nil {1197 if ms.LoadMessageInfo() == nil {
@@ -1086,7 +1204,7 @@ func (x *PendingIssue) ProtoReflect() protoreflect.Message {
1086 1204
1087 // Deprecated: Use PendingIssue.ProtoReflect.Descriptor instead.1205 // Deprecated: Use PendingIssue.ProtoReflect.Descriptor instead.
1088 func (*PendingIssue) Descriptor() ([]byte, []int) {1206 func (*PendingIssue) Descriptor() ([]byte, []int) {
1089- return file_ermite_issue_proto_rawDescGZIP(), []int{15}1207+ return file_ermite_issue_proto_rawDescGZIP(), []int{17}
1090 }1208 }
1091 1209
1092 func (x *PendingIssue) GetId() string {1210 func (x *PendingIssue) GetId() string {
@@ -1148,7 +1266,7 @@ type ListPendingIssuesRequest struct {
1148 1266
1149 func (x *ListPendingIssuesRequest) Reset() {1267 func (x *ListPendingIssuesRequest) Reset() {
1150 *x = ListPendingIssuesRequest{}1268 *x = ListPendingIssuesRequest{}
1151- mi := &file_ermite_issue_proto_msgTypes[16]1269+ mi := &file_ermite_issue_proto_msgTypes[18]
1152 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))1270 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
1153 ms.StoreMessageInfo(mi)1271 ms.StoreMessageInfo(mi)
1154 }1272 }
@@ -1160,7 +1278,7 @@ func (x *ListPendingIssuesRequest) String() string {
1160 func (*ListPendingIssuesRequest) ProtoMessage() {}1278 func (*ListPendingIssuesRequest) ProtoMessage() {}
1161 1279
1162 func (x *ListPendingIssuesRequest) ProtoReflect() protoreflect.Message {1280 func (x *ListPendingIssuesRequest) ProtoReflect() protoreflect.Message {
1163- mi := &file_ermite_issue_proto_msgTypes[16]1281+ mi := &file_ermite_issue_proto_msgTypes[18]
1164 if x != nil {1282 if x != nil {
1165 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))1283 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
1166 if ms.LoadMessageInfo() == nil {1284 if ms.LoadMessageInfo() == nil {
@@ -1173,7 +1291,7 @@ func (x *ListPendingIssuesRequest) ProtoReflect() protoreflect.Message {
1173 1291
1174 // Deprecated: Use ListPendingIssuesRequest.ProtoReflect.Descriptor instead.1292 // Deprecated: Use ListPendingIssuesRequest.ProtoReflect.Descriptor instead.
1175 func (*ListPendingIssuesRequest) Descriptor() ([]byte, []int) {1293 func (*ListPendingIssuesRequest) Descriptor() ([]byte, []int) {
1176- return file_ermite_issue_proto_rawDescGZIP(), []int{16}1294+ return file_ermite_issue_proto_rawDescGZIP(), []int{18}
1177 }1295 }
1178 1296
1179 func (x *ListPendingIssuesRequest) GetRepo() string {1297 func (x *ListPendingIssuesRequest) GetRepo() string {
@@ -1211,7 +1329,7 @@ type ListPendingIssuesResponse struct {
1211 1329
1212 func (x *ListPendingIssuesResponse) Reset() {1330 func (x *ListPendingIssuesResponse) Reset() {
1213 *x = ListPendingIssuesResponse{}1331 *x = ListPendingIssuesResponse{}
1214- mi := &file_ermite_issue_proto_msgTypes[17]1332+ mi := &file_ermite_issue_proto_msgTypes[19]
1215 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))1333 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
1216 ms.StoreMessageInfo(mi)1334 ms.StoreMessageInfo(mi)
1217 }1335 }
@@ -1223,7 +1341,7 @@ func (x *ListPendingIssuesResponse) String() string {
1223 func (*ListPendingIssuesResponse) ProtoMessage() {}1341 func (*ListPendingIssuesResponse) ProtoMessage() {}
1224 1342
1225 func (x *ListPendingIssuesResponse) ProtoReflect() protoreflect.Message {1343 func (x *ListPendingIssuesResponse) ProtoReflect() protoreflect.Message {
1226- mi := &file_ermite_issue_proto_msgTypes[17]1344+ mi := &file_ermite_issue_proto_msgTypes[19]
1227 if x != nil {1345 if x != nil {
1228 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))1346 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
1229 if ms.LoadMessageInfo() == nil {1347 if ms.LoadMessageInfo() == nil {
@@ -1236,7 +1354,7 @@ func (x *ListPendingIssuesResponse) ProtoReflect() protoreflect.Message {
1236 1354
1237 // Deprecated: Use ListPendingIssuesResponse.ProtoReflect.Descriptor instead.1355 // Deprecated: Use ListPendingIssuesResponse.ProtoReflect.Descriptor instead.
1238 func (*ListPendingIssuesResponse) Descriptor() ([]byte, []int) {1356 func (*ListPendingIssuesResponse) Descriptor() ([]byte, []int) {
1239- return file_ermite_issue_proto_rawDescGZIP(), []int{17}1357+ return file_ermite_issue_proto_rawDescGZIP(), []int{19}
1240 }1358 }
1241 1359
1242 func (x *ListPendingIssuesResponse) GetIssues() []*PendingIssue {1360 func (x *ListPendingIssuesResponse) GetIssues() []*PendingIssue {
@@ -1266,7 +1384,7 @@ type ApproveIssueRequest struct {
1266 1384
1267 func (x *ApproveIssueRequest) Reset() {1385 func (x *ApproveIssueRequest) Reset() {
1268 *x = ApproveIssueRequest{}1386 *x = ApproveIssueRequest{}
1269- mi := &file_ermite_issue_proto_msgTypes[18]1387+ mi := &file_ermite_issue_proto_msgTypes[20]
1270 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))1388 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
1271 ms.StoreMessageInfo(mi)1389 ms.StoreMessageInfo(mi)
1272 }1390 }
@@ -1278,7 +1396,7 @@ func (x *ApproveIssueRequest) String() string {
1278 func (*ApproveIssueRequest) ProtoMessage() {}1396 func (*ApproveIssueRequest) ProtoMessage() {}
1279 1397
1280 func (x *ApproveIssueRequest) ProtoReflect() protoreflect.Message {1398 func (x *ApproveIssueRequest) ProtoReflect() protoreflect.Message {
1281- mi := &file_ermite_issue_proto_msgTypes[18]1399+ mi := &file_ermite_issue_proto_msgTypes[20]
1282 if x != nil {1400 if x != nil {
1283 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))1401 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
1284 if ms.LoadMessageInfo() == nil {1402 if ms.LoadMessageInfo() == nil {
@@ -1291,7 +1409,7 @@ func (x *ApproveIssueRequest) ProtoReflect() protoreflect.Message {
1291 1409
1292 // Deprecated: Use ApproveIssueRequest.ProtoReflect.Descriptor instead.1410 // Deprecated: Use ApproveIssueRequest.ProtoReflect.Descriptor instead.
1293 func (*ApproveIssueRequest) Descriptor() ([]byte, []int) {1411 func (*ApproveIssueRequest) Descriptor() ([]byte, []int) {
1294- return file_ermite_issue_proto_rawDescGZIP(), []int{18}1412+ return file_ermite_issue_proto_rawDescGZIP(), []int{20}
1295 }1413 }
1296 1414
1297 func (x *ApproveIssueRequest) GetRepo() string {1415 func (x *ApproveIssueRequest) GetRepo() string {
@@ -1320,7 +1438,7 @@ type ApproveIssueResponse struct {
1320 1438
1321 func (x *ApproveIssueResponse) Reset() {1439 func (x *ApproveIssueResponse) Reset() {
1322 *x = ApproveIssueResponse{}1440 *x = ApproveIssueResponse{}
1323- mi := &file_ermite_issue_proto_msgTypes[19]1441+ mi := &file_ermite_issue_proto_msgTypes[21]
1324 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))1442 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
1325 ms.StoreMessageInfo(mi)1443 ms.StoreMessageInfo(mi)
1326 }1444 }
@@ -1332,7 +1450,7 @@ func (x *ApproveIssueResponse) String() string {
1332 func (*ApproveIssueResponse) ProtoMessage() {}1450 func (*ApproveIssueResponse) ProtoMessage() {}
1333 1451
1334 func (x *ApproveIssueResponse) ProtoReflect() protoreflect.Message {1452 func (x *ApproveIssueResponse) ProtoReflect() protoreflect.Message {
1335- mi := &file_ermite_issue_proto_msgTypes[19]1453+ mi := &file_ermite_issue_proto_msgTypes[21]
1336 if x != nil {1454 if x != nil {
1337 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))1455 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
1338 if ms.LoadMessageInfo() == nil {1456 if ms.LoadMessageInfo() == nil {
@@ -1345,7 +1463,7 @@ func (x *ApproveIssueResponse) ProtoReflect() protoreflect.Message {
1345 1463
1346 // Deprecated: Use ApproveIssueResponse.ProtoReflect.Descriptor instead.1464 // Deprecated: Use ApproveIssueResponse.ProtoReflect.Descriptor instead.
1347 func (*ApproveIssueResponse) Descriptor() ([]byte, []int) {1465 func (*ApproveIssueResponse) Descriptor() ([]byte, []int) {
1348- return file_ermite_issue_proto_rawDescGZIP(), []int{19}1466+ return file_ermite_issue_proto_rawDescGZIP(), []int{21}
1349 }1467 }
1350 1468
1351 func (x *ApproveIssueResponse) GetIssue() *Issue {1469 func (x *ApproveIssueResponse) GetIssue() *Issue {
@@ -1370,7 +1488,7 @@ type RejectIssueRequest struct {
1370 1488
1371 func (x *RejectIssueRequest) Reset() {1489 func (x *RejectIssueRequest) Reset() {
1372 *x = RejectIssueRequest{}1490 *x = RejectIssueRequest{}
1373- mi := &file_ermite_issue_proto_msgTypes[20]1491+ mi := &file_ermite_issue_proto_msgTypes[22]
1374 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))1492 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
1375 ms.StoreMessageInfo(mi)1493 ms.StoreMessageInfo(mi)
1376 }1494 }
@@ -1382,7 +1500,7 @@ func (x *RejectIssueRequest) String() string {
1382 func (*RejectIssueRequest) ProtoMessage() {}1500 func (*RejectIssueRequest) ProtoMessage() {}
1383 1501
1384 func (x *RejectIssueRequest) ProtoReflect() protoreflect.Message {1502 func (x *RejectIssueRequest) ProtoReflect() protoreflect.Message {
1385- mi := &file_ermite_issue_proto_msgTypes[20]1503+ mi := &file_ermite_issue_proto_msgTypes[22]
1386 if x != nil {1504 if x != nil {
1387 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))1505 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
1388 if ms.LoadMessageInfo() == nil {1506 if ms.LoadMessageInfo() == nil {
@@ -1395,7 +1513,7 @@ func (x *RejectIssueRequest) ProtoReflect() protoreflect.Message {
1395 1513
1396 // Deprecated: Use RejectIssueRequest.ProtoReflect.Descriptor instead.1514 // Deprecated: Use RejectIssueRequest.ProtoReflect.Descriptor instead.
1397 func (*RejectIssueRequest) Descriptor() ([]byte, []int) {1515 func (*RejectIssueRequest) Descriptor() ([]byte, []int) {
1398- return file_ermite_issue_proto_rawDescGZIP(), []int{20}1516+ return file_ermite_issue_proto_rawDescGZIP(), []int{22}
1399 }1517 }
1400 1518
1401 func (x *RejectIssueRequest) GetRepo() string {1519 func (x *RejectIssueRequest) GetRepo() string {
@@ -1428,7 +1546,7 @@ type RejectIssueResponse struct {
1428 1546
1429 func (x *RejectIssueResponse) Reset() {1547 func (x *RejectIssueResponse) Reset() {
1430 *x = RejectIssueResponse{}1548 *x = RejectIssueResponse{}
1431- mi := &file_ermite_issue_proto_msgTypes[21]1549+ mi := &file_ermite_issue_proto_msgTypes[23]
1432 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))1550 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
1433 ms.StoreMessageInfo(mi)1551 ms.StoreMessageInfo(mi)
1434 }1552 }
@@ -1440,7 +1558,7 @@ func (x *RejectIssueResponse) String() string {
1440 func (*RejectIssueResponse) ProtoMessage() {}1558 func (*RejectIssueResponse) ProtoMessage() {}
1441 1559
1442 func (x *RejectIssueResponse) ProtoReflect() protoreflect.Message {1560 func (x *RejectIssueResponse) ProtoReflect() protoreflect.Message {
1443- mi := &file_ermite_issue_proto_msgTypes[21]1561+ mi := &file_ermite_issue_proto_msgTypes[23]
1444 if x != nil {1562 if x != nil {
1445 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))1563 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
1446 if ms.LoadMessageInfo() == nil {1564 if ms.LoadMessageInfo() == nil {
@@ -1453,7 +1571,7 @@ func (x *RejectIssueResponse) ProtoReflect() protoreflect.Message {
1453 1571
1454 // Deprecated: Use RejectIssueResponse.ProtoReflect.Descriptor instead.1572 // Deprecated: Use RejectIssueResponse.ProtoReflect.Descriptor instead.
1455 func (*RejectIssueResponse) Descriptor() ([]byte, []int) {1573 func (*RejectIssueResponse) Descriptor() ([]byte, []int) {
1456- return file_ermite_issue_proto_rawDescGZIP(), []int{21}1574+ return file_ermite_issue_proto_rawDescGZIP(), []int{23}
1457 }1575 }
1458 1576
1459 var File_ermite_issue_proto protoreflect.FileDescriptor1577 var File_ermite_issue_proto protoreflect.FileDescriptor
@@ -1503,13 +1621,14 @@ const file_ermite_issue_proto_rawDesc = "" +
1503 "\x0fnext_page_token\x18\x02 \x01(\tR\rnextPageToken\"=\n" +1621 "\x0fnext_page_token\x18\x02 \x01(\tR\rnextPageToken\"=\n" +
1504 "\x0fGetIssueRequest\x12\x12\n" +1622 "\x0fGetIssueRequest\x12\x12\n" +
1505 "\x04repo\x18\x01 \x01(\tR\x04repo\x12\x16\n" +1623 "\x04repo\x18\x01 \x01(\tR\x04repo\x12\x16\n" +
1506- "\x06number\x18\x02 \x01(\x03R\x06number\"\xa1\x01\n" +1624+ "\x06number\x18\x02 \x01(\x03R\x06number\"\xcd\x01\n" +
1507 "\x10GetIssueResponse\x12#\n" +1625 "\x10GetIssueResponse\x12#\n" +
1508 "\x05issue\x18\x01 \x01(\v2\r.ermite.IssueR\x05issue\x120\n" +1626 "\x05issue\x18\x01 \x01(\v2\r.ermite.IssueR\x05issue\x120\n" +
1509 "\bcomments\x18\x02 \x03(\v2\x14.ermite.IssueCommentR\bcomments\x126\n" +1627 "\bcomments\x18\x02 \x03(\v2\x14.ermite.IssueCommentR\bcomments\x126\n" +
1510 "\n" +1628 "\n" +
1511 "references\x18\x03 \x03(\v2\x16.ermite.IssueReferenceR\n" +1629 "references\x18\x03 \x03(\v2\x16.ermite.IssueReferenceR\n" +
1512- "references\"X\n" +1630+ "references\x12*\n" +
1631+ "\x06events\x18\x04 \x03(\v2\x12.ermite.IssueEventR\x06events\"X\n" +
1513 "\x16AddIssueCommentRequest\x12\x12\n" +1632 "\x16AddIssueCommentRequest\x12\x12\n" +
1514 "\x04repo\x18\x01 \x01(\tR\x04repo\x12\x16\n" +1633 "\x04repo\x18\x01 \x01(\tR\x04repo\x12\x16\n" +
1515 "\x06number\x18\x02 \x01(\x03R\x06number\x12\x12\n" +1634 "\x06number\x18\x02 \x01(\x03R\x06number\x12\x12\n" +
@@ -1520,6 +1639,11 @@ const file_ermite_issue_proto_rawDesc = "" +
1520 "\x04repo\x18\x01 \x01(\tR\x04repo\x12\x16\n" +1639 "\x04repo\x18\x01 \x01(\tR\x04repo\x12\x16\n" +
1521 "\x06number\x18\x02 \x01(\x03R\x06number\"9\n" +1640 "\x06number\x18\x02 \x01(\x03R\x06number\"9\n" +
1522 "\x12CloseIssueResponse\x12#\n" +1641 "\x12CloseIssueResponse\x12#\n" +
1642+ "\x05issue\x18\x01 \x01(\v2\r.ermite.IssueR\x05issue\"A\n" +
1643+ "\x13ResolveIssueRequest\x12\x12\n" +
1644+ "\x04repo\x18\x01 \x01(\tR\x04repo\x12\x16\n" +
1645+ "\x06number\x18\x02 \x01(\x03R\x06number\";\n" +
1646+ "\x14ResolveIssueResponse\x12#\n" +
1523 "\x05issue\x18\x01 \x01(\v2\r.ermite.IssueR\x05issue\"@\n" +1647 "\x05issue\x18\x01 \x01(\v2\r.ermite.IssueR\x05issue\"@\n" +
1524 "\x12ReopenIssueRequest\x12\x12\n" +1648 "\x12ReopenIssueRequest\x12\x12\n" +
1525 "\x04repo\x18\x01 \x01(\tR\x04repo\x12\x16\n" +1649 "\x04repo\x18\x01 \x01(\tR\x04repo\x12\x16\n" +
@@ -1551,13 +1675,14 @@ const file_ermite_issue_proto_rawDesc = "" +
1551 "\x04repo\x18\x01 \x01(\tR\x04repo\x12\x0e\n" +1675 "\x04repo\x18\x01 \x01(\tR\x04repo\x12\x0e\n" +
1552 "\x02id\x18\x02 \x01(\tR\x02id\x12\x10\n" +1676 "\x02id\x18\x02 \x01(\tR\x02id\x12\x10\n" +
1553 "\x03ban\x18\x03 \x01(\bR\x03ban\"\x15\n" +1677 "\x03ban\x18\x03 \x01(\bR\x03ban\"\x15\n" +
1554- "\x13RejectIssueResponse*p\n" +1678+ "\x13RejectIssueResponse*\x8a\x01\n" +
1555 "\n" +1679 "\n" +
1556 "IssueState\x12\x1b\n" +1680 "IssueState\x12\x1b\n" +
1557 "\x17ISSUE_STATE_UNSPECIFIED\x10\x00\x12\x14\n" +1681 "\x17ISSUE_STATE_UNSPECIFIED\x10\x00\x12\x14\n" +
1558 "\x10ISSUE_STATE_OPEN\x10\x01\x12\x16\n" +1682 "\x10ISSUE_STATE_OPEN\x10\x01\x12\x16\n" +
1559 "\x12ISSUE_STATE_CLOSED\x10\x02\x12\x17\n" +1683 "\x12ISSUE_STATE_CLOSED\x10\x02\x12\x17\n" +
1560- "\x13ISSUE_STATE_PENDING\x10\x032\xa8\x05\n" +1684+ "\x13ISSUE_STATE_PENDING\x10\x03\x12\x18\n" +
1685+ "\x14ISSUE_STATE_RESOLVED\x10\x042\xf3\x05\n" +
1561 "\fIssueService\x12F\n" +1686 "\fIssueService\x12F\n" +
1562 "\vCreateIssue\x12\x1a.ermite.CreateIssueRequest\x1a\x1b.ermite.CreateIssueResponse\x12C\n" +1687 "\vCreateIssue\x12\x1a.ermite.CreateIssueRequest\x1a\x1b.ermite.CreateIssueResponse\x12C\n" +
1563 "\n" +1688 "\n" +
@@ -1565,7 +1690,8 @@ const file_ermite_issue_proto_rawDesc = "" +
1565 "\bGetIssue\x12\x17.ermite.GetIssueRequest\x1a\x18.ermite.GetIssueResponse\x12R\n" +1690 "\bGetIssue\x12\x17.ermite.GetIssueRequest\x1a\x18.ermite.GetIssueResponse\x12R\n" +
1566 "\x0fAddIssueComment\x12\x1e.ermite.AddIssueCommentRequest\x1a\x1f.ermite.AddIssueCommentResponse\x12C\n" +1691 "\x0fAddIssueComment\x12\x1e.ermite.AddIssueCommentRequest\x1a\x1f.ermite.AddIssueCommentResponse\x12C\n" +
1567 "\n" +1692 "\n" +
1568- "CloseIssue\x12\x19.ermite.CloseIssueRequest\x1a\x1a.ermite.CloseIssueResponse\x12F\n" +1693+ "CloseIssue\x12\x19.ermite.CloseIssueRequest\x1a\x1a.ermite.CloseIssueResponse\x12I\n" +
1694+ "\fResolveIssue\x12\x1b.ermite.ResolveIssueRequest\x1a\x1c.ermite.ResolveIssueResponse\x12F\n" +
1569 "\vReopenIssue\x12\x1a.ermite.ReopenIssueRequest\x1a\x1b.ermite.ReopenIssueResponse\x12X\n" +1695 "\vReopenIssue\x12\x1a.ermite.ReopenIssueRequest\x1a\x1b.ermite.ReopenIssueResponse\x12X\n" +
1570 "\x11ListPendingIssues\x12 .ermite.ListPendingIssuesRequest\x1a!.ermite.ListPendingIssuesResponse\x12I\n" +1696 "\x11ListPendingIssues\x12 .ermite.ListPendingIssuesRequest\x1a!.ermite.ListPendingIssuesResponse\x12I\n" +
1571 "\fApproveIssue\x12\x1b.ermite.ApproveIssueRequest\x1a\x1c.ermite.ApproveIssueResponse\x12F\n" +1697 "\fApproveIssue\x12\x1b.ermite.ApproveIssueRequest\x1a\x1c.ermite.ApproveIssueResponse\x12F\n" +
@@ -1587,7 +1713,7 @@ func file_ermite_issue_proto_rawDescGZIP() []byte {
1587 }1713 }
1588 1714
1589 var file_ermite_issue_proto_enumTypes = make([]protoimpl.EnumInfo, 1)1715 var file_ermite_issue_proto_enumTypes = make([]protoimpl.EnumInfo, 1)
1590-var file_ermite_issue_proto_msgTypes = make([]protoimpl.MessageInfo, 22)1716+var file_ermite_issue_proto_msgTypes = make([]protoimpl.MessageInfo, 24)
1591 var file_ermite_issue_proto_goTypes = []any{1717 var file_ermite_issue_proto_goTypes = []any{
1592 (IssueState)(0), // 0: ermite.IssueState1718 (IssueState)(0), // 0: ermite.IssueState
1593 (*Issue)(nil), // 1: ermite.Issue1719 (*Issue)(nil), // 1: ermite.Issue
@@ -1603,59 +1729,66 @@ var file_ermite_issue_proto_goTypes = []any{
1603 (*AddIssueCommentResponse)(nil), // 11: ermite.AddIssueCommentResponse1729 (*AddIssueCommentResponse)(nil), // 11: ermite.AddIssueCommentResponse
1604 (*CloseIssueRequest)(nil), // 12: ermite.CloseIssueRequest1730 (*CloseIssueRequest)(nil), // 12: ermite.CloseIssueRequest
1605 (*CloseIssueResponse)(nil), // 13: ermite.CloseIssueResponse1731 (*CloseIssueResponse)(nil), // 13: ermite.CloseIssueResponse
1606- (*ReopenIssueRequest)(nil), // 14: ermite.ReopenIssueRequest1732+ (*ResolveIssueRequest)(nil), // 14: ermite.ResolveIssueRequest
1607- (*ReopenIssueResponse)(nil), // 15: ermite.ReopenIssueResponse1733+ (*ResolveIssueResponse)(nil), // 15: ermite.ResolveIssueResponse
1608- (*PendingIssue)(nil), // 16: ermite.PendingIssue1734+ (*ReopenIssueRequest)(nil), // 16: ermite.ReopenIssueRequest
1609- (*ListPendingIssuesRequest)(nil), // 17: ermite.ListPendingIssuesRequest1735+ (*ReopenIssueResponse)(nil), // 17: ermite.ReopenIssueResponse
1610- (*ListPendingIssuesResponse)(nil), // 18: ermite.ListPendingIssuesResponse1736+ (*PendingIssue)(nil), // 18: ermite.PendingIssue
1611- (*ApproveIssueRequest)(nil), // 19: ermite.ApproveIssueRequest1737+ (*ListPendingIssuesRequest)(nil), // 19: ermite.ListPendingIssuesRequest
1612- (*ApproveIssueResponse)(nil), // 20: ermite.ApproveIssueResponse1738+ (*ListPendingIssuesResponse)(nil), // 20: ermite.ListPendingIssuesResponse
1613- (*RejectIssueRequest)(nil), // 21: ermite.RejectIssueRequest1739+ (*ApproveIssueRequest)(nil), // 21: ermite.ApproveIssueRequest
1614- (*RejectIssueResponse)(nil), // 22: ermite.RejectIssueResponse1740+ (*ApproveIssueResponse)(nil), // 22: ermite.ApproveIssueResponse
1615- (*timestamppb.Timestamp)(nil), // 23: google.protobuf.Timestamp1741+ (*RejectIssueRequest)(nil), // 23: ermite.RejectIssueRequest
1616- (MergeRequestState)(0), // 24: ermite.MergeRequestState1742+ (*RejectIssueResponse)(nil), // 24: ermite.RejectIssueResponse
1743+ (*timestamppb.Timestamp)(nil), // 25: google.protobuf.Timestamp
1744+ (MergeRequestState)(0), // 26: ermite.MergeRequestState
1745+ (*IssueEvent)(nil), // 27: ermite.IssueEvent
1617 }1746 }
1618 var file_ermite_issue_proto_depIdxs = []int32{1747 var file_ermite_issue_proto_depIdxs = []int32{
1619 0, // 0: ermite.Issue.state:type_name -> ermite.IssueState1748 0, // 0: ermite.Issue.state:type_name -> ermite.IssueState
1620- 23, // 1: ermite.Issue.created_at:type_name -> google.protobuf.Timestamp1749+ 25, // 1: ermite.Issue.created_at:type_name -> google.protobuf.Timestamp
1621- 23, // 2: ermite.Issue.updated_at:type_name -> google.protobuf.Timestamp1750+ 25, // 2: ermite.Issue.updated_at:type_name -> google.protobuf.Timestamp
1622- 24, // 3: ermite.IssueReference.state:type_name -> ermite.MergeRequestState1751+ 26, // 3: ermite.IssueReference.state:type_name -> ermite.MergeRequestState
1623- 23, // 4: ermite.IssueComment.created_at:type_name -> google.protobuf.Timestamp1752+ 25, // 4: ermite.IssueComment.created_at:type_name -> google.protobuf.Timestamp
1624 1, // 5: ermite.CreateIssueResponse.issue:type_name -> ermite.Issue1753 1, // 5: ermite.CreateIssueResponse.issue:type_name -> ermite.Issue
1625 0, // 6: ermite.ListIssuesRequest.state:type_name -> ermite.IssueState1754 0, // 6: ermite.ListIssuesRequest.state:type_name -> ermite.IssueState
1626 1, // 7: ermite.ListIssuesResponse.issues:type_name -> ermite.Issue1755 1, // 7: ermite.ListIssuesResponse.issues:type_name -> ermite.Issue
1627 1, // 8: ermite.GetIssueResponse.issue:type_name -> ermite.Issue1756 1, // 8: ermite.GetIssueResponse.issue:type_name -> ermite.Issue
1628 3, // 9: ermite.GetIssueResponse.comments:type_name -> ermite.IssueComment1757 3, // 9: ermite.GetIssueResponse.comments:type_name -> ermite.IssueComment
1629 2, // 10: ermite.GetIssueResponse.references:type_name -> ermite.IssueReference1758 2, // 10: ermite.GetIssueResponse.references:type_name -> ermite.IssueReference
1630- 3, // 11: ermite.AddIssueCommentResponse.comment:type_name -> ermite.IssueComment1759+ 27, // 11: ermite.GetIssueResponse.events:type_name -> ermite.IssueEvent
1631- 1, // 12: ermite.CloseIssueResponse.issue:type_name -> ermite.Issue1760+ 3, // 12: ermite.AddIssueCommentResponse.comment:type_name -> ermite.IssueComment
1632- 1, // 13: ermite.ReopenIssueResponse.issue:type_name -> ermite.Issue1761+ 1, // 13: ermite.CloseIssueResponse.issue:type_name -> ermite.Issue
1633- 23, // 14: ermite.PendingIssue.created_at:type_name -> google.protobuf.Timestamp1762+ 1, // 14: ermite.ResolveIssueResponse.issue:type_name -> ermite.Issue
1634- 16, // 15: ermite.ListPendingIssuesResponse.issues:type_name -> ermite.PendingIssue1763+ 1, // 15: ermite.ReopenIssueResponse.issue:type_name -> ermite.Issue
1635- 1, // 16: ermite.ApproveIssueResponse.issue:type_name -> ermite.Issue1764+ 25, // 16: ermite.PendingIssue.created_at:type_name -> google.protobuf.Timestamp
1636- 4, // 17: ermite.IssueService.CreateIssue:input_type -> ermite.CreateIssueRequest1765+ 18, // 17: ermite.ListPendingIssuesResponse.issues:type_name -> ermite.PendingIssue
1637- 6, // 18: ermite.IssueService.ListIssues:input_type -> ermite.ListIssuesRequest1766+ 1, // 18: ermite.ApproveIssueResponse.issue:type_name -> ermite.Issue
1638- 8, // 19: ermite.IssueService.GetIssue:input_type -> ermite.GetIssueRequest1767+ 4, // 19: ermite.IssueService.CreateIssue:input_type -> ermite.CreateIssueRequest
1639- 10, // 20: ermite.IssueService.AddIssueComment:input_type -> ermite.AddIssueCommentRequest1768+ 6, // 20: ermite.IssueService.ListIssues:input_type -> ermite.ListIssuesRequest
1640- 12, // 21: ermite.IssueService.CloseIssue:input_type -> ermite.CloseIssueRequest1769+ 8, // 21: ermite.IssueService.GetIssue:input_type -> ermite.GetIssueRequest
1641- 14, // 22: ermite.IssueService.ReopenIssue:input_type -> ermite.ReopenIssueRequest1770+ 10, // 22: ermite.IssueService.AddIssueComment:input_type -> ermite.AddIssueCommentRequest
1642- 17, // 23: ermite.IssueService.ListPendingIssues:input_type -> ermite.ListPendingIssuesRequest1771+ 12, // 23: ermite.IssueService.CloseIssue:input_type -> ermite.CloseIssueRequest
1643- 19, // 24: ermite.IssueService.ApproveIssue:input_type -> ermite.ApproveIssueRequest1772+ 14, // 24: ermite.IssueService.ResolveIssue:input_type -> ermite.ResolveIssueRequest
1644- 21, // 25: ermite.IssueService.RejectIssue:input_type -> ermite.RejectIssueRequest1773+ 16, // 25: ermite.IssueService.ReopenIssue:input_type -> ermite.ReopenIssueRequest
1645- 5, // 26: ermite.IssueService.CreateIssue:output_type -> ermite.CreateIssueResponse1774+ 19, // 26: ermite.IssueService.ListPendingIssues:input_type -> ermite.ListPendingIssuesRequest
1646- 7, // 27: ermite.IssueService.ListIssues:output_type -> ermite.ListIssuesResponse1775+ 21, // 27: ermite.IssueService.ApproveIssue:input_type -> ermite.ApproveIssueRequest
1647- 9, // 28: ermite.IssueService.GetIssue:output_type -> ermite.GetIssueResponse1776+ 23, // 28: ermite.IssueService.RejectIssue:input_type -> ermite.RejectIssueRequest
1648- 11, // 29: ermite.IssueService.AddIssueComment:output_type -> ermite.AddIssueCommentResponse1777+ 5, // 29: ermite.IssueService.CreateIssue:output_type -> ermite.CreateIssueResponse
1649- 13, // 30: ermite.IssueService.CloseIssue:output_type -> ermite.CloseIssueResponse1778+ 7, // 30: ermite.IssueService.ListIssues:output_type -> ermite.ListIssuesResponse
1650- 15, // 31: ermite.IssueService.ReopenIssue:output_type -> ermite.ReopenIssueResponse1779+ 9, // 31: ermite.IssueService.GetIssue:output_type -> ermite.GetIssueResponse
1651- 18, // 32: ermite.IssueService.ListPendingIssues:output_type -> ermite.ListPendingIssuesResponse1780+ 11, // 32: ermite.IssueService.AddIssueComment:output_type -> ermite.AddIssueCommentResponse
1652- 20, // 33: ermite.IssueService.ApproveIssue:output_type -> ermite.ApproveIssueResponse1781+ 13, // 33: ermite.IssueService.CloseIssue:output_type -> ermite.CloseIssueResponse
1653- 22, // 34: ermite.IssueService.RejectIssue:output_type -> ermite.RejectIssueResponse1782+ 15, // 34: ermite.IssueService.ResolveIssue:output_type -> ermite.ResolveIssueResponse
1654- 26, // [26:35] is the sub-list for method output_type1783+ 17, // 35: ermite.IssueService.ReopenIssue:output_type -> ermite.ReopenIssueResponse
1655- 17, // [17:26] is the sub-list for method input_type1784+ 20, // 36: ermite.IssueService.ListPendingIssues:output_type -> ermite.ListPendingIssuesResponse
1656- 17, // [17:17] is the sub-list for extension type_name1785+ 22, // 37: ermite.IssueService.ApproveIssue:output_type -> ermite.ApproveIssueResponse
1657- 17, // [17:17] is the sub-list for extension extendee1786+ 24, // 38: ermite.IssueService.RejectIssue:output_type -> ermite.RejectIssueResponse
1658- 0, // [0:17] is the sub-list for field type_name1787+ 29, // [29:39] is the sub-list for method output_type
1788+ 19, // [19:29] is the sub-list for method input_type
1789+ 19, // [19:19] is the sub-list for extension type_name
1790+ 19, // [19:19] is the sub-list for extension extendee
1791+ 0, // [0:19] is the sub-list for field type_name
1659 }1792 }
1660 1793
1661 func init() { file_ermite_issue_proto_init() }1794 func init() { file_ermite_issue_proto_init() }
@@ -1670,7 +1803,7 @@ func file_ermite_issue_proto_init() {
1670 GoPackagePath: reflect.TypeOf(x{}).PkgPath(),1803 GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
1671 RawDescriptor: unsafe.Slice(unsafe.StringData(file_ermite_issue_proto_rawDesc), len(file_ermite_issue_proto_rawDesc)),1804 RawDescriptor: unsafe.Slice(unsafe.StringData(file_ermite_issue_proto_rawDesc), len(file_ermite_issue_proto_rawDesc)),
1672 NumEnums: 1,1805 NumEnums: 1,
1673- NumMessages: 22,1806+ NumMessages: 24,
1674 NumExtensions: 0,1807 NumExtensions: 0,
1675 NumServices: 1,1808 NumServices: 1,
1676 },1809 },
M gen/ermite/merge_request.pb.go +546 -174 generated file: collapsed
M issue_test.go +2 -1
@@ -19,6 +19,7 @@ func TestIssueProcedures(t *testing.T) {
1919 ermiteconnect.IssueServiceAddIssueCommentProcedure: "AddIssueComment",
2020 ermiteconnect.IssueServiceCloseIssueProcedure: "CloseIssue",
2121 ermiteconnect.IssueServiceReopenIssueProcedure: "ReopenIssue",
22+ ermiteconnect.IssueServiceResolveIssueProcedure: "ResolveIssue",
2223 ermiteconnect.IssueServiceListPendingIssuesProcedure: "ListPendingIssues",
2324 ermiteconnect.IssueServiceApproveIssueProcedure: "ApproveIssue",
2425 ermiteconnect.IssueServiceRejectIssueProcedure: "RejectIssue",
@@ -58,7 +59,7 @@ func TestIssueContract(t *testing.T) {
5859 if ermite.Scope_SCOPE_ISSUE_WRITE != 11 {
5960 t.Fatal("issue:write scope number changed")
6061 }
61- for name, want := range map[string]int32{"ISSUE_STATE_UNSPECIFIED": 0, "ISSUE_STATE_OPEN": 1, "ISSUE_STATE_CLOSED": 2, "ISSUE_STATE_PENDING": 3} {
62+ for name, want := range map[string]int32{"ISSUE_STATE_UNSPECIFIED": 0, "ISSUE_STATE_OPEN": 1, "ISSUE_STATE_CLOSED": 2, "ISSUE_STATE_PENDING": 3, "ISSUE_STATE_RESOLVED": 4} {
6263 if got := ermite.IssueState_value[name]; got != want {
6364 t.Errorf("%s = %d, want %d", name, got, want)
6465 }
@@ -19,6 +19,7 @@ func TestIssueProcedures(t *testing.T) {
19 ermiteconnect.IssueServiceAddIssueCommentProcedure: "AddIssueComment",19 ermiteconnect.IssueServiceAddIssueCommentProcedure: "AddIssueComment",
20 ermiteconnect.IssueServiceCloseIssueProcedure: "CloseIssue",20 ermiteconnect.IssueServiceCloseIssueProcedure: "CloseIssue",
21 ermiteconnect.IssueServiceReopenIssueProcedure: "ReopenIssue",21 ermiteconnect.IssueServiceReopenIssueProcedure: "ReopenIssue",
22+ ermiteconnect.IssueServiceResolveIssueProcedure: "ResolveIssue",
22 ermiteconnect.IssueServiceListPendingIssuesProcedure: "ListPendingIssues",23 ermiteconnect.IssueServiceListPendingIssuesProcedure: "ListPendingIssues",
23 ermiteconnect.IssueServiceApproveIssueProcedure: "ApproveIssue",24 ermiteconnect.IssueServiceApproveIssueProcedure: "ApproveIssue",
24 ermiteconnect.IssueServiceRejectIssueProcedure: "RejectIssue",25 ermiteconnect.IssueServiceRejectIssueProcedure: "RejectIssue",
@@ -58,7 +59,7 @@ func TestIssueContract(t *testing.T) {
58 if ermite.Scope_SCOPE_ISSUE_WRITE != 11 {59 if ermite.Scope_SCOPE_ISSUE_WRITE != 11 {
59 t.Fatal("issue:write scope number changed")60 t.Fatal("issue:write scope number changed")
60 }61 }
61- for name, want := range map[string]int32{"ISSUE_STATE_UNSPECIFIED": 0, "ISSUE_STATE_OPEN": 1, "ISSUE_STATE_CLOSED": 2, "ISSUE_STATE_PENDING": 3} {62+ for name, want := range map[string]int32{"ISSUE_STATE_UNSPECIFIED": 0, "ISSUE_STATE_OPEN": 1, "ISSUE_STATE_CLOSED": 2, "ISSUE_STATE_PENDING": 3, "ISSUE_STATE_RESOLVED": 4} {
62 if got := ermite.IssueState_value[name]; got != want {63 if got := ermite.IssueState_value[name]; got != want {
63 t.Errorf("%s = %d, want %d", name, got, want)64 t.Errorf("%s = %d, want %d", name, got, want)
64 }65 }
M proto/ermite/event.proto +15 -4
@@ -21,9 +21,10 @@ service EventService {
2121 // for merge requests, merge_request_opened, merge_request_merged,
2222 // merge_request_closed, comment_added, comment_edited, comment_deleted and
2323 // comment_resolved (a thread resolved or reopened); for issues, issue_opened,
24- // issue_closed, issue_reopened and issue_commented, and issue_submitted. Each
25- // one is delivered on the "repo:<name>" topic of its repository and on
26- // "home", subject to the visibility of the repository, except
24+ // issue_closed, issue_resolved, issue_reopened and issue_commented, and
25+ // issue_submitted. Each one is delivered on the "repo:<name>" topic of its
26+ // repository and on "home", subject to the visibility of the repository,
27+ // except
2728 // issue_submitted: it is delivered only on the "owner" topic, never on
2829 // "home" or "repo:<name>", and carries no content (see IssueSubmitted).
2930 //
@@ -153,6 +154,8 @@ message Event {
153154 ReleaseDeleted release_deleted = 29;
154155 // ReleaseUnpublished reports a release turned into a draft after tag deletion.
155156 ReleaseUnpublished release_unpublished = 30;
157+ // IssueResolved: an issue was resolved.
158+ IssueResolved issue_resolved = 31;
156159 }
157160 }
158161
@@ -290,12 +293,20 @@ message IssueOpened {
290293 Issue issue = 1;
291294 }
292295
293-// IssueClosed reports a closed issue.
296+// IssueClosed reports a closed issue. A merge that resolves an issue sends
297+// issue_resolved, not issue_closed.
294298 message IssueClosed {
295299 // Issue is the issue after closing, including its repository and number.
296300 Issue issue = 1;
297301 }
298302
303+// IssueResolved reports a resolved issue.
304+message IssueResolved {
305+ // Issue is the issue after resolving, including its repository, number and
306+ // closed_by_merge_request.
307+ Issue issue = 1;
308+}
309+
299310 // IssueReopened reports a reopened issue.
300311 message IssueReopened {
301312 // Issue is the issue after reopening, including its repository and number.
@@ -21,9 +21,10 @@ service EventService {
21 // for merge requests, merge_request_opened, merge_request_merged,21 // for merge requests, merge_request_opened, merge_request_merged,
22 // merge_request_closed, comment_added, comment_edited, comment_deleted and22 // merge_request_closed, comment_added, comment_edited, comment_deleted and
23 // comment_resolved (a thread resolved or reopened); for issues, issue_opened,23 // comment_resolved (a thread resolved or reopened); for issues, issue_opened,
24- // issue_closed, issue_reopened and issue_commented, and issue_submitted. Each24+ // issue_closed, issue_resolved, issue_reopened and issue_commented, and
25- // one is delivered on the "repo:<name>" topic of its repository and on25+ // issue_submitted. Each one is delivered on the "repo:<name>" topic of its
26- // "home", subject to the visibility of the repository, except26+ // repository and on "home", subject to the visibility of the repository,
27+ // except
27 // issue_submitted: it is delivered only on the "owner" topic, never on28 // issue_submitted: it is delivered only on the "owner" topic, never on
28 // "home" or "repo:<name>", and carries no content (see IssueSubmitted).29 // "home" or "repo:<name>", and carries no content (see IssueSubmitted).
29 //30 //
@@ -153,6 +154,8 @@ message Event {
153 ReleaseDeleted release_deleted = 29;154 ReleaseDeleted release_deleted = 29;
154 // ReleaseUnpublished reports a release turned into a draft after tag deletion.155 // ReleaseUnpublished reports a release turned into a draft after tag deletion.
155 ReleaseUnpublished release_unpublished = 30;156 ReleaseUnpublished release_unpublished = 30;
157+ // IssueResolved: an issue was resolved.
158+ IssueResolved issue_resolved = 31;
156 }159 }
157 }160 }
158 161
@@ -290,12 +293,20 @@ message IssueOpened {
290 Issue issue = 1;293 Issue issue = 1;
291 }294 }
292 295
293-// IssueClosed reports a closed issue.296+// IssueClosed reports a closed issue. A merge that resolves an issue sends
297+// issue_resolved, not issue_closed.
294 message IssueClosed {298 message IssueClosed {
295 // Issue is the issue after closing, including its repository and number.299 // Issue is the issue after closing, including its repository and number.
296 Issue issue = 1;300 Issue issue = 1;
297 }301 }
298 302
303+// IssueResolved reports a resolved issue.
304+message IssueResolved {
305+ // Issue is the issue after resolving, including its repository, number and
306+ // closed_by_merge_request.
307+ Issue issue = 1;
308+}
309+
299 // IssueReopened reports a reopened issue.310 // IssueReopened reports a reopened issue.
300 message IssueReopened {311 message IssueReopened {
301 // Issue is the issue after reopening, including its repository and number.312 // Issue is the issue after reopening, including its repository and number.
M proto/ermite/issue.proto +46 -15
@@ -14,10 +14,14 @@ enum IssueState {
1414 ISSUE_STATE_UNSPECIFIED = 0;
1515 // The issue is open.
1616 ISSUE_STATE_OPEN = 1;
17- // The issue is closed.
17+ // The issue is closed without being resolved (won't fix, duplicate, ...).
1818 ISSUE_STATE_CLOSED = 2;
1919 // Reserved for later use: awaiting moderation, owner-only.
2020 ISSUE_STATE_PENDING = 3;
21+ // The issue was fixed: by the merge of a merge request with a closing
22+ // reference, or by hand (ResolveIssue). CLOSED means closed without being
23+ // resolved.
24+ ISSUE_STATE_RESOLVED = 4;
2125 }
2226
2327 // Issue is a discussion in a repository.
@@ -45,9 +49,10 @@ message Issue {
4549 google.protobuf.Timestamp updated_at = 8;
4650 // CommentCount is the number of comments on the issue.
4751 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.
52+ // ClosedByMergeRequest is the number of the merge request whose merge
53+ // resolved the issue (a closing reference such as "Fixes #N"); 0 when the
54+ // issue was resolved by hand, is closed, or is open. Reset when the issue is
55+ // reopened.
5156 int64 closed_by_merge_request = 10;
5257 }
5358
@@ -86,29 +91,35 @@ message IssueComment {
8691 //
8792 // Reading (ListIssues, GetIssue) needs the same access as reading the
8893 // repository: nothing for a public one, the repo:read scope for a private one.
89-// Writing (CreateIssue, AddIssueComment, CloseIssue, ReopenIssue) needs the
94+// Writing (CreateIssue, AddIssueComment, CloseIssue, ResolveIssue,
95+// ReopenIssue) needs the
9096 // owner or a token with the issue:write scope on the repository; branch
9197 // prefixes do not restrict it. A caller without credentials gets
9298 // unauthenticated, one with an insufficient scope gets permission_denied, and
9399 // one that cannot read the repository gets not_found.
94100 //
95101 // 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.
102+// description or commit messages of a merge request resolves the issue when the
103+// request is merged, and only then: the issue gets the state RESOLVED, an
104+// issue.resolved event is sent, and Issue carries closed_by_merge_request.
105+// Servers that report these links (GetIssueResponse.references,
106+// Issue.closed_by_merge_request) list "issues.links" in
107+// GetVersionResponse.features; older servers leave them empty. Servers that
108+// also keep the history of issues (GetIssueResponse.events), implement
109+// ResolveIssue and the RESOLVED state list "issues.resolve".
101110 //
102111 // Text fields are normalized to NFC and stripped of control and Unicode
103112 // bidirectional characters (line breaks and tabs stay in bodies and comments).
104113 // The title is one line of 1 to 120 code points; body and comment text are at
105114 // most 10,000 code points and a comment must not be blank. A text that breaks
106115 // a rule is rejected with invalid_argument. A comment on an issue that already
107-// holds 1,000 comments gives resource_exhausted. Closing an issue that is not
108-// open, or reopening one that is not closed, gives failed_precondition.
116+// holds 1,000 comments gives resource_exhausted. Closing or resolving an issue
117+// that is not open, or reopening one that is neither closed nor resolved,
118+// gives failed_precondition.
109119 //
110-// The ordinary RPCs only return issues in state OPEN or CLOSED, and
111-// ListIssues with state ISSUE_STATE_PENDING is invalid_argument. Submissions
120+// The ordinary RPCs return issues in state OPEN, CLOSED or RESOLVED, and
121+// ListIssues accepts these three states; ISSUE_STATE_PENDING is
122+// invalid_argument. Submissions
112123 // from the public form wait as PendingIssue records, reachable only through
113124 // the three moderation RPCs (ListPendingIssues, ApproveIssue, RejectIssue).
114125 // These need owner rights (root, an owner session, or a token holding every
@@ -126,7 +137,10 @@ service IssueService {
126137 rpc AddIssueComment(AddIssueCommentRequest) returns (AddIssueCommentResponse);
127138 // CloseIssue closes an issue. Needs the issue:write scope.
128139 rpc CloseIssue(CloseIssueRequest) returns (CloseIssueResponse);
129- // ReopenIssue reopens an issue. Needs the issue:write scope.
140+ // ResolveIssue marks an open issue as resolved. Needs the issue:write scope.
141+ rpc ResolveIssue(ResolveIssueRequest) returns (ResolveIssueResponse);
142+ // ReopenIssue reopens a closed or resolved issue. Needs the issue:write
143+ // scope.
130144 rpc ReopenIssue(ReopenIssueRequest) returns (ReopenIssueResponse);
131145 // ListPendingIssues lists issues awaiting moderation, oldest first. Owner
132146 // rights only; anyone else gets NOT_FOUND.
@@ -196,6 +210,9 @@ message GetIssueResponse {
196210 // References are the merge requests naming the issue, ascending by number,
197211 // at most 100.
198212 repeated IssueReference references = 3;
213+ // Events are the history of the issue, oldest first, at most 500 (a server
214+ // limit). Clients interleave them with the comments by created_at.
215+ repeated IssueEvent events = 4;
199216 }
200217
201218 // AddIssueCommentRequest describes the comment to add.
@@ -228,6 +245,20 @@ message CloseIssueResponse {
228245 Issue issue = 1;
229246 }
230247
248+// ResolveIssueRequest names the issue to resolve.
249+message ResolveIssueRequest {
250+ // Repo is the repository name.
251+ string repo = 1;
252+ // Number is the issue number.
253+ int64 number = 2;
254+}
255+
256+// ResolveIssueResponse holds the issue after resolving.
257+message ResolveIssueResponse {
258+ // Issue is the resolved issue.
259+ Issue issue = 1;
260+}
261+
231262 // ReopenIssueRequest names the issue to reopen.
232263 message ReopenIssueRequest {
233264 // Repo is the repository name.
@@ -14,10 +14,14 @@ enum IssueState {
14 ISSUE_STATE_UNSPECIFIED = 0;14 ISSUE_STATE_UNSPECIFIED = 0;
15 // The issue is open.15 // The issue is open.
16 ISSUE_STATE_OPEN = 1;16 ISSUE_STATE_OPEN = 1;
17- // The issue is closed.17+ // The issue is closed without being resolved (won't fix, duplicate, ...).
18 ISSUE_STATE_CLOSED = 2;18 ISSUE_STATE_CLOSED = 2;
19 // Reserved for later use: awaiting moderation, owner-only.19 // Reserved for later use: awaiting moderation, owner-only.
20 ISSUE_STATE_PENDING = 3;20 ISSUE_STATE_PENDING = 3;
21+ // The issue was fixed: by the merge of a merge request with a closing
22+ // reference, or by hand (ResolveIssue). CLOSED means closed without being
23+ // resolved.
24+ ISSUE_STATE_RESOLVED = 4;
21 }25 }
22 26
23 // Issue is a discussion in a repository.27 // Issue is a discussion in a repository.
@@ -45,9 +49,10 @@ message Issue {
45 google.protobuf.Timestamp updated_at = 8;49 google.protobuf.Timestamp updated_at = 8;
46 // CommentCount is the number of comments on the issue.50 // CommentCount is the number of comments on the issue.
47 int32 comment_count = 9;51 int32 comment_count = 9;
48- // ClosedByMergeRequest is the number of the merge request whose merge closed52+ // ClosedByMergeRequest is the number of the merge request whose merge
49- // the issue (a closing reference such as "Fixes #N"); 0 when the issue was53+ // resolved the issue (a closing reference such as "Fixes #N"); 0 when the
50- // closed by hand or is open. Reset when the issue is reopened.54+ // issue was resolved by hand, is closed, or is open. Reset when the issue is
55+ // reopened.
51 int64 closed_by_merge_request = 10;56 int64 closed_by_merge_request = 10;
52 }57 }
53 58
@@ -86,29 +91,35 @@ message IssueComment {
86 //91 //
87 // Reading (ListIssues, GetIssue) needs the same access as reading the92 // Reading (ListIssues, GetIssue) needs the same access as reading the
88 // repository: nothing for a public one, the repo:read scope for a private one.93 // repository: nothing for a public one, the repo:read scope for a private one.
89-// Writing (CreateIssue, AddIssueComment, CloseIssue, ReopenIssue) needs the94+// Writing (CreateIssue, AddIssueComment, CloseIssue, ResolveIssue,
95+// ReopenIssue) needs the
90 // owner or a token with the issue:write scope on the repository; branch96 // owner or a token with the issue:write scope on the repository; branch
91 // prefixes do not restrict it. A caller without credentials gets97 // prefixes do not restrict it. A caller without credentials gets
92 // unauthenticated, one with an insufficient scope gets permission_denied, and98 // unauthenticated, one with an insufficient scope gets permission_denied, and
93 // one that cannot read the repository gets not_found.99 // one that cannot read the repository gets not_found.
94 //100 //
95 // A closing reference ("Fixes #N", "Closes #N", "Resolves #N") in the title,101 // 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 the102+// description or commit messages of a merge request resolves the issue when the
97-// request is merged, and only then; the issue.closed event and Issue carry103+// request is merged, and only then: the issue gets the state RESOLVED, an
98-// closed_by_merge_request. Servers that report these links (GetIssueResponse.104+// issue.resolved event is sent, and Issue carries closed_by_merge_request.
99-// references, Issue.closed_by_merge_request) list "issues.links" in105+// Servers that report these links (GetIssueResponse.references,
100-// GetVersionResponse.features; older servers leave them empty.106+// Issue.closed_by_merge_request) list "issues.links" in
107+// GetVersionResponse.features; older servers leave them empty. Servers that
108+// also keep the history of issues (GetIssueResponse.events), implement
109+// ResolveIssue and the RESOLVED state list "issues.resolve".
101 //110 //
102 // Text fields are normalized to NFC and stripped of control and Unicode111 // Text fields are normalized to NFC and stripped of control and Unicode
103 // bidirectional characters (line breaks and tabs stay in bodies and comments).112 // bidirectional characters (line breaks and tabs stay in bodies and comments).
104 // The title is one line of 1 to 120 code points; body and comment text are at113 // The title is one line of 1 to 120 code points; body and comment text are at
105 // most 10,000 code points and a comment must not be blank. A text that breaks114 // most 10,000 code points and a comment must not be blank. A text that breaks
106 // a rule is rejected with invalid_argument. A comment on an issue that already115 // a rule is rejected with invalid_argument. A comment on an issue that already
107-// holds 1,000 comments gives resource_exhausted. Closing an issue that is not116+// holds 1,000 comments gives resource_exhausted. Closing or resolving an issue
108-// open, or reopening one that is not closed, gives failed_precondition.117+// that is not open, or reopening one that is neither closed nor resolved,
118+// gives failed_precondition.
109 //119 //
110-// The ordinary RPCs only return issues in state OPEN or CLOSED, and120+// The ordinary RPCs return issues in state OPEN, CLOSED or RESOLVED, and
111-// ListIssues with state ISSUE_STATE_PENDING is invalid_argument. Submissions121+// ListIssues accepts these three states; ISSUE_STATE_PENDING is
122+// invalid_argument. Submissions
112 // from the public form wait as PendingIssue records, reachable only through123 // from the public form wait as PendingIssue records, reachable only through
113 // the three moderation RPCs (ListPendingIssues, ApproveIssue, RejectIssue).124 // the three moderation RPCs (ListPendingIssues, ApproveIssue, RejectIssue).
114 // These need owner rights (root, an owner session, or a token holding every125 // These need owner rights (root, an owner session, or a token holding every
@@ -126,7 +137,10 @@ service IssueService {
126 rpc AddIssueComment(AddIssueCommentRequest) returns (AddIssueCommentResponse);137 rpc AddIssueComment(AddIssueCommentRequest) returns (AddIssueCommentResponse);
127 // CloseIssue closes an issue. Needs the issue:write scope.138 // CloseIssue closes an issue. Needs the issue:write scope.
128 rpc CloseIssue(CloseIssueRequest) returns (CloseIssueResponse);139 rpc CloseIssue(CloseIssueRequest) returns (CloseIssueResponse);
129- // ReopenIssue reopens an issue. Needs the issue:write scope.140+ // ResolveIssue marks an open issue as resolved. Needs the issue:write scope.
141+ rpc ResolveIssue(ResolveIssueRequest) returns (ResolveIssueResponse);
142+ // ReopenIssue reopens a closed or resolved issue. Needs the issue:write
143+ // scope.
130 rpc ReopenIssue(ReopenIssueRequest) returns (ReopenIssueResponse);144 rpc ReopenIssue(ReopenIssueRequest) returns (ReopenIssueResponse);
131 // ListPendingIssues lists issues awaiting moderation, oldest first. Owner145 // ListPendingIssues lists issues awaiting moderation, oldest first. Owner
132 // rights only; anyone else gets NOT_FOUND.146 // rights only; anyone else gets NOT_FOUND.
@@ -196,6 +210,9 @@ message GetIssueResponse {
196 // References are the merge requests naming the issue, ascending by number,210 // References are the merge requests naming the issue, ascending by number,
197 // at most 100.211 // at most 100.
198 repeated IssueReference references = 3;212 repeated IssueReference references = 3;
213+ // Events are the history of the issue, oldest first, at most 500 (a server
214+ // limit). Clients interleave them with the comments by created_at.
215+ repeated IssueEvent events = 4;
199 }216 }
200 217
201 // AddIssueCommentRequest describes the comment to add.218 // AddIssueCommentRequest describes the comment to add.
@@ -228,6 +245,20 @@ message CloseIssueResponse {
228 Issue issue = 1;245 Issue issue = 1;
229 }246 }
230 247
248+// ResolveIssueRequest names the issue to resolve.
249+message ResolveIssueRequest {
250+ // Repo is the repository name.
251+ string repo = 1;
252+ // Number is the issue number.
253+ int64 number = 2;
254+}
255+
256+// ResolveIssueResponse holds the issue after resolving.
257+message ResolveIssueResponse {
258+ // Issue is the resolved issue.
259+ Issue issue = 1;
260+}
261+
231 // ReopenIssueRequest names the issue to reopen.262 // ReopenIssueRequest names the issue to reopen.
232 message ReopenIssueRequest {263 message ReopenIssueRequest {
233 // Repo is the repository name.264 // Repo is the repository name.
M proto/ermite/merge_request.proto +78 -0
@@ -402,6 +402,76 @@ message ListMergeRequestsResponse {
402402 string next_page_token = 2;
403403 }
404404
405+// MergeRequestIssueState is where an issue named by a merge request is in its
406+// life. Values share their numbers with IssueState (3, awaiting moderation,
407+// is never shown here). It exists because issue.proto imports this file and
408+// cannot be imported back.
409+enum MergeRequestIssueState {
410+ // Not set. Never returned by the server.
411+ MERGE_REQUEST_ISSUE_STATE_UNSPECIFIED = 0;
412+ // The issue is open.
413+ MERGE_REQUEST_ISSUE_STATE_OPEN = 1;
414+ // The issue is closed without being resolved.
415+ MERGE_REQUEST_ISSUE_STATE_CLOSED = 2;
416+ // The issue was resolved, by a merge or by hand.
417+ MERGE_REQUEST_ISSUE_STATE_RESOLVED = 4;
418+}
419+
420+// MergeRequestIssue is an issue of the same repository that a merge request
421+// names ("#N").
422+message MergeRequestIssue {
423+ // Number is the number of the issue.
424+ int64 number = 1;
425+ // Title is the title of the issue.
426+ string title = 2;
427+ // State is where the issue is in its life.
428+ MergeRequestIssueState state = 3;
429+ // Closes says that a closing reference names the issue: merging the request
430+ // resolves it.
431+ bool closes = 4;
432+}
433+
434+// IssueEventKind is what happened in an IssueEvent.
435+enum IssueEventKind {
436+ // Not set. Never returned by the server.
437+ ISSUE_EVENT_KIND_UNSPECIFIED = 0;
438+ // A merge request started naming the issue; closes says whether with a
439+ // closing reference.
440+ ISSUE_EVENT_KIND_REFERENCED = 1;
441+ // The issue was closed without being resolved.
442+ ISSUE_EVENT_KIND_CLOSED = 2;
443+ // The issue was reopened.
444+ ISSUE_EVENT_KIND_REOPENED = 3;
445+ // The issue was resolved; merge_request is set when a merge resolved it.
446+ ISSUE_EVENT_KIND_RESOLVED = 4;
447+}
448+
449+// IssueEvent is one entry in the history of an issue. Events are append-only:
450+// a reference that later disappears does not remove its event.
451+message IssueEvent {
452+ // Id identifies the event within its issue. Opaque. Events of different
453+ // issues can share an id: key them by (issue, id).
454+ string id = 1;
455+ // Kind is what happened.
456+ IssueEventKind kind = 2;
457+ // Issue is the number of the issue.
458+ int64 issue = 3;
459+ // MergeRequest is the number of the merge request involved; 0 if none.
460+ int64 merge_request = 4;
461+ // MergeRequestTitle is the title of that merge request at read time; empty
462+ // if none.
463+ string merge_request_title = 5;
464+ // Closes says that the reference was a closing one. Only set for
465+ // ISSUE_EVENT_KIND_REFERENCED.
466+ bool closes = 6;
467+ // Actor names who caused the event, like Issue.author: the label of the
468+ // token or session. For events triggered by a merge, the label of who
469+ // merged.
470+ string actor = 7;
471+ // CreatedAt is when the event happened.
472+ google.protobuf.Timestamp created_at = 8;
473+}
474+
405475 // GetMergeRequestRequest selects a merge request.
406476 message GetMergeRequestRequest {
407477 // Repo is the repository name.
@@ -452,6 +522,14 @@ message GetMergeRequestResponse {
452522 // Verdicts are the current verdicts, one per author who gave one, ordered
453523 // by the comment that carries them, oldest first.
454524 repeated AuthorVerdict verdicts = 10;
525+ // Issues are the issues of the same repository that the merge request names,
526+ // ascending by number, at most 100. Empty when issues are off.
527+ repeated MergeRequestIssue issues = 11;
528+ // IssueEvents are the history entries that involve this merge request: the
529+ // REFERENCED and RESOLVED events of the issues it names or once named,
530+ // oldest first, at most 500. An event can name an issue that is no longer
531+ // in issues. Empty when issues are off.
532+ repeated IssueEvent issue_events = 12;
455533 }
456534
457535 // AddCommentRequest describes the comment to add.
@@ -402,6 +402,76 @@ message ListMergeRequestsResponse {
402 string next_page_token = 2;402 string next_page_token = 2;
403 }403 }
404 404
405+// MergeRequestIssueState is where an issue named by a merge request is in its
406+// life. Values share their numbers with IssueState (3, awaiting moderation,
407+// is never shown here). It exists because issue.proto imports this file and
408+// cannot be imported back.
409+enum MergeRequestIssueState {
410+ // Not set. Never returned by the server.
411+ MERGE_REQUEST_ISSUE_STATE_UNSPECIFIED = 0;
412+ // The issue is open.
413+ MERGE_REQUEST_ISSUE_STATE_OPEN = 1;
414+ // The issue is closed without being resolved.
415+ MERGE_REQUEST_ISSUE_STATE_CLOSED = 2;
416+ // The issue was resolved, by a merge or by hand.
417+ MERGE_REQUEST_ISSUE_STATE_RESOLVED = 4;
418+}
419+
420+// MergeRequestIssue is an issue of the same repository that a merge request
421+// names ("#N").
422+message MergeRequestIssue {
423+ // Number is the number of the issue.
424+ int64 number = 1;
425+ // Title is the title of the issue.
426+ string title = 2;
427+ // State is where the issue is in its life.
428+ MergeRequestIssueState state = 3;
429+ // Closes says that a closing reference names the issue: merging the request
430+ // resolves it.
431+ bool closes = 4;
432+}
433+
434+// IssueEventKind is what happened in an IssueEvent.
435+enum IssueEventKind {
436+ // Not set. Never returned by the server.
437+ ISSUE_EVENT_KIND_UNSPECIFIED = 0;
438+ // A merge request started naming the issue; closes says whether with a
439+ // closing reference.
440+ ISSUE_EVENT_KIND_REFERENCED = 1;
441+ // The issue was closed without being resolved.
442+ ISSUE_EVENT_KIND_CLOSED = 2;
443+ // The issue was reopened.
444+ ISSUE_EVENT_KIND_REOPENED = 3;
445+ // The issue was resolved; merge_request is set when a merge resolved it.
446+ ISSUE_EVENT_KIND_RESOLVED = 4;
447+}
448+
449+// IssueEvent is one entry in the history of an issue. Events are append-only:
450+// a reference that later disappears does not remove its event.
451+message IssueEvent {
452+ // Id identifies the event within its issue. Opaque. Events of different
453+ // issues can share an id: key them by (issue, id).
454+ string id = 1;
455+ // Kind is what happened.
456+ IssueEventKind kind = 2;
457+ // Issue is the number of the issue.
458+ int64 issue = 3;
459+ // MergeRequest is the number of the merge request involved; 0 if none.
460+ int64 merge_request = 4;
461+ // MergeRequestTitle is the title of that merge request at read time; empty
462+ // if none.
463+ string merge_request_title = 5;
464+ // Closes says that the reference was a closing one. Only set for
465+ // ISSUE_EVENT_KIND_REFERENCED.
466+ bool closes = 6;
467+ // Actor names who caused the event, like Issue.author: the label of the
468+ // token or session. For events triggered by a merge, the label of who
469+ // merged.
470+ string actor = 7;
471+ // CreatedAt is when the event happened.
472+ google.protobuf.Timestamp created_at = 8;
473+}
474+
405 // GetMergeRequestRequest selects a merge request.475 // GetMergeRequestRequest selects a merge request.
406 message GetMergeRequestRequest {476 message GetMergeRequestRequest {
407 // Repo is the repository name.477 // Repo is the repository name.
@@ -452,6 +522,14 @@ message GetMergeRequestResponse {
452 // Verdicts are the current verdicts, one per author who gave one, ordered522 // Verdicts are the current verdicts, one per author who gave one, ordered
453 // by the comment that carries them, oldest first.523 // by the comment that carries them, oldest first.
454 repeated AuthorVerdict verdicts = 10;524 repeated AuthorVerdict verdicts = 10;
525+ // Issues are the issues of the same repository that the merge request names,
526+ // ascending by number, at most 100. Empty when issues are off.
527+ repeated MergeRequestIssue issues = 11;
528+ // IssueEvents are the history entries that involve this merge request: the
529+ // REFERENCED and RESOLVED events of the issues it names or once named,
530+ // oldest first, at most 500. An event can name an issue that is no longer
531+ // in issues. Empty when issues are off.
532+ repeated IssueEvent issue_events = 12;
455 }533 }
456 534
457 // AddCommentRequest describes the comment to add.535 // AddCommentRequest describes the comment to add.

Keyboard shortcuts

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

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

Branches 2

Tags 18

↑↓ moveenter openesc close