feat(proto): resolved issue state, ResolveIssue, issue history events and merge request issue links
- commit
- 7cff81f5a57714f243f9c0d6edbc16a55885c6a1
- author
- brice · · 2026-10-22 17:49 UTC
- parent
- ffa9a5e
- signature
- GPG Verified
CD88F9E564E0102646FB6077A1A07C7C7C3E349D· arch-gpg Verified for the committer email
10 files · +1110 -384
M docs/services.md +2 -2
| @@ -6,9 +6,9 @@ | |||
| 6 | 6 | | `GitService` | `ListRefs`, `GetTree`, `ListPaths`, `GetBlob` (streamed), `ListCommits`, `GetCommit` (structured diff), `ResolveRevision` | | |
| 7 | 7 | | `TokenService` | `CreateToken` (secret shown once), `ListTokens`, `RevokeToken` | | |
| 8 | 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 | 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_resolved` (event 31), `issue_reopened`, `issue_commented`, and `issue_submitted` (only on `owner`, no content). Event 22: `merge_request_mergeability` | | |
| 12 | 12 | | `ServerService` | `GetVersion` (version and features), `GetSigningKey`, `RotateOIDCKey` (owner only) | | |
| 13 | 13 | | `TrustedKeyService` | `ListTrustedKeys`, `AddTrustedKey` and `RemoveTrustedKey` (owner only). `Commit.verification` carries the result of the check (feature `commit_signatures`) | | |
| 14 | 14 | | `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_resolved` (event 31), `issue_reopened`, `issue_commented`, and `issue_submitted` (only on `owner`, no content). Event 22: `merge_request_mergeability` | |
| 12 | | `ServerService` | `GetVersion` (version and features), `GetSigningKey`, `RotateOIDCKey` (owner only) | | 12 | | `ServerService` | `GetVersion` (version and features), `GetSigningKey`, `RotateOIDCKey` (owner only) | | ||
| 13 | | `TrustedKeyService` | `ListTrustedKeys`, `AddTrustedKey` and `RemoveTrustedKey` (owner only). `Commit.verification` carries the result of the check (feature `commit_signatures`) | | 13 | | `TrustedKeyService` | `ListTrustedKeys`, `AddTrustedKey` and `RemoveTrustedKey` (owner only). `Commit.verification` carries the result of the check (feature `commit_signatures`) | | ||
| 14 | | `RunService` | `ListRuns`, `GetRun`, `GetJob`, `GetJobLog` (streamed, follow), `ListAnnotations`, `GetStepSummaries`, `CancelRun`, `RerunRun`, `DispatchWorkflow`, `ListWorkflows`, `DisableWorkflow`, `EnableWorkflow`, `ListChecks`, `ListRunners`, `RemoveRunner` | | 14 | | `RunService` | `ListRuns`, `GetRun`, `GetJob`, `GetJobLog` (streamed, follow), `ListAnnotations`, `GetStepSummaries`, `CancelRun`, `RerunRun`, `DispatchWorkflow`, `ListWorkflows`, `DisableWorkflow`, `EnableWorkflow`, `ListChecks`, `ListRunners`, `RemoveRunner` | | ||
M gen/ermite/ermiteconnect/event.connect.go +2 -2
| @@ -49,7 +49,7 @@ type EventServiceClient interface { | |||
| 49 | 49 | // for merge requests, merge_request_opened, merge_request_merged, | |
| 50 | 50 | // merge_request_closed, comment_added, comment_edited, comment_deleted and | |
| 51 | 51 | // comment_resolved (a thread resolved or reopened); for issues, issue_opened, | |
| 52 | - | // issue_closed, issue_reopened and issue_commented, and issue_submitted. Each | |
| 52 | + | // issue_closed, issue_resolved, issue_reopened and issue_commented, and issue_submitted. Each | |
| 53 | 53 | // one is delivered on the "repo:<name>" topic of its repository and on | |
| 54 | 54 | // "home", subject to the visibility of the repository, except | |
| 55 | 55 | // issue_submitted: it is delivered only on the "owner" topic, never on | |
| @@ -125,7 +125,7 @@ type EventServiceHandler interface { | |||
| 125 | 125 | // for merge requests, merge_request_opened, merge_request_merged, | |
| 126 | 126 | // merge_request_closed, comment_added, comment_edited, comment_deleted and | |
| 127 | 127 | // comment_resolved (a thread resolved or reopened); for issues, issue_opened, | |
| 128 | - | // issue_closed, issue_reopened and issue_commented, and issue_submitted. Each | |
| 128 | + | // issue_closed, issue_resolved, issue_reopened and issue_commented, and issue_submitted. Each | |
| 129 | 129 | // one is delivered on the "repo:<name>" topic of its repository and on | |
| 130 | 130 | // "home", subject to the visibility of the repository, except | |
| 131 | 131 | // issue_submitted: it is delivered only on the "owner" topic, never on | |
| @@ -49,7 +49,7 @@ 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 and | 50 | // 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. Each | 52 | + | // issue_closed, issue_resolved, issue_reopened and issue_commented, and issue_submitted. Each |
| 53 | // one is delivered on the "repo:<name>" topic of its repository and on | 53 | // one is delivered on the "repo:<name>" topic of its repository and on | ||
| 54 | // "home", subject to the visibility of the repository, except | 54 | // "home", subject to the visibility of the repository, except | ||
| 55 | // issue_submitted: it is delivered only on the "owner" topic, never on | 55 | // issue_submitted: it is delivered only on the "owner" topic, never on | ||
| @@ -125,7 +125,7 @@ type EventServiceHandler interface { | |||||
| 125 | // for merge requests, merge_request_opened, merge_request_merged, | 125 | // for merge requests, merge_request_opened, merge_request_merged, | ||
| 126 | // merge_request_closed, comment_added, comment_edited, comment_deleted and | 126 | // merge_request_closed, comment_added, comment_edited, comment_deleted and | ||
| 127 | // comment_resolved (a thread resolved or reopened); for issues, issue_opened, | 127 | // comment_resolved (a thread resolved or reopened); for issues, issue_opened, | ||
| 128 | - | // issue_closed, issue_reopened and issue_commented, and issue_submitted. Each | 128 | + | // issue_closed, issue_resolved, issue_reopened and issue_commented, and issue_submitted. Each |
| 129 | // one is delivered on the "repo:<name>" topic of its repository and on | 129 | // one is delivered on the "repo:<name>" topic of its repository and on | ||
| 130 | // "home", subject to the visibility of the repository, except | 130 | // "home", subject to the visibility of the repository, except | ||
| 131 | // issue_submitted: it is delivered only on the "owner" topic, never on | 131 | // issue_submitted: it is delivered only on the "owner" topic, never on | ||
M gen/ermite/ermiteconnect/issue.connect.go +35 -2
| @@ -47,6 +47,9 @@ const ( | |||
| 47 | 47 | IssueServiceAddIssueCommentProcedure = "/ermite.IssueService/AddIssueComment" | |
| 48 | 48 | // IssueServiceCloseIssueProcedure is the fully-qualified name of the IssueService's CloseIssue RPC. | |
| 49 | 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 | 53 | // IssueServiceReopenIssueProcedure is the fully-qualified name of the IssueService's ReopenIssue | |
| 51 | 54 | // RPC. | |
| 52 | 55 | IssueServiceReopenIssueProcedure = "/ermite.IssueService/ReopenIssue" | |
| @@ -73,7 +76,10 @@ type IssueServiceClient interface { | |||
| 73 | 76 | AddIssueComment(context.Context, *connect.Request[ermite.AddIssueCommentRequest]) (*connect.Response[ermite.AddIssueCommentResponse], error) | |
| 74 | 77 | // CloseIssue closes an issue. Needs the issue:write scope. | |
| 75 | 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 | 83 | ReopenIssue(context.Context, *connect.Request[ermite.ReopenIssueRequest]) (*connect.Response[ermite.ReopenIssueResponse], error) | |
| 78 | 84 | // ListPendingIssues lists issues awaiting moderation, oldest first. Owner | |
| 79 | 85 | // rights only; anyone else gets NOT_FOUND. | |
| @@ -127,6 +133,12 @@ func NewIssueServiceClient(httpClient connect.HTTPClient, baseURL string, opts . | |||
| 127 | 133 | connect.WithSchema(issueServiceMethods.ByName("CloseIssue")), | |
| 128 | 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 | 142 | reopenIssue: connect.NewClient[ermite.ReopenIssueRequest, ermite.ReopenIssueResponse]( | |
| 131 | 143 | httpClient, | |
| 132 | 144 | baseURL+IssueServiceReopenIssueProcedure, | |
| @@ -161,6 +173,7 @@ type issueServiceClient struct { | |||
| 161 | 173 | getIssue *connect.Client[ermite.GetIssueRequest, ermite.GetIssueResponse] | |
| 162 | 174 | addIssueComment *connect.Client[ermite.AddIssueCommentRequest, ermite.AddIssueCommentResponse] | |
| 163 | 175 | closeIssue *connect.Client[ermite.CloseIssueRequest, ermite.CloseIssueResponse] | |
| 176 | + | resolveIssue *connect.Client[ermite.ResolveIssueRequest, ermite.ResolveIssueResponse] | |
| 164 | 177 | reopenIssue *connect.Client[ermite.ReopenIssueRequest, ermite.ReopenIssueResponse] | |
| 165 | 178 | listPendingIssues *connect.Client[ermite.ListPendingIssuesRequest, ermite.ListPendingIssuesResponse] | |
| 166 | 179 | approveIssue *connect.Client[ermite.ApproveIssueRequest, ermite.ApproveIssueResponse] | |
| @@ -192,6 +205,11 @@ func (c *issueServiceClient) CloseIssue(ctx context.Context, req *connect.Reques | |||
| 192 | 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 | 213 | // ReopenIssue calls ermite.IssueService.ReopenIssue. | |
| 196 | 214 | func (c *issueServiceClient) ReopenIssue(ctx context.Context, req *connect.Request[ermite.ReopenIssueRequest]) (*connect.Response[ermite.ReopenIssueResponse], error) { | |
| 197 | 215 | return c.reopenIssue.CallUnary(ctx, req) | |
| @@ -224,7 +242,10 @@ type IssueServiceHandler interface { | |||
| 224 | 242 | AddIssueComment(context.Context, *connect.Request[ermite.AddIssueCommentRequest]) (*connect.Response[ermite.AddIssueCommentResponse], error) | |
| 225 | 243 | // CloseIssue closes an issue. Needs the issue:write scope. | |
| 226 | 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 | 249 | ReopenIssue(context.Context, *connect.Request[ermite.ReopenIssueRequest]) (*connect.Response[ermite.ReopenIssueResponse], error) | |
| 229 | 250 | // ListPendingIssues lists issues awaiting moderation, oldest first. Owner | |
| 230 | 251 | // rights only; anyone else gets NOT_FOUND. | |
| @@ -274,6 +295,12 @@ func NewIssueServiceHandler(svc IssueServiceHandler, opts ...connect.HandlerOpti | |||
| 274 | 295 | connect.WithSchema(issueServiceMethods.ByName("CloseIssue")), | |
| 275 | 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 | 304 | issueServiceReopenIssueHandler := connect.NewUnaryHandler( | |
| 278 | 305 | IssueServiceReopenIssueProcedure, | |
| 279 | 306 | svc.ReopenIssue, | |
| @@ -310,6 +337,8 @@ func NewIssueServiceHandler(svc IssueServiceHandler, opts ...connect.HandlerOpti | |||
| 310 | 337 | issueServiceAddIssueCommentHandler.ServeHTTP(w, r) | |
| 311 | 338 | case IssueServiceCloseIssueProcedure: | |
| 312 | 339 | issueServiceCloseIssueHandler.ServeHTTP(w, r) | |
| 340 | + | case IssueServiceResolveIssueProcedure: | |
| 341 | + | issueServiceResolveIssueHandler.ServeHTTP(w, r) | |
| 313 | 342 | case IssueServiceReopenIssueProcedure: | |
| 314 | 343 | issueServiceReopenIssueHandler.ServeHTTP(w, r) | |
| 315 | 344 | case IssueServiceListPendingIssuesProcedure: | |
| @@ -347,6 +376,10 @@ func (UnimplementedIssueServiceHandler) CloseIssue(context.Context, *connect.Req | |||
| 347 | 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 | 383 | func (UnimplementedIssueServiceHandler) ReopenIssue(context.Context, *connect.Request[ermite.ReopenIssueRequest]) (*connect.Response[ermite.ReopenIssueResponse], error) { | |
| 351 | 384 | return nil, connect.NewError(connect.CodeUnimplemented, errors.New("ermite.IssueService.ReopenIssue is not implemented")) | |
| 352 | 385 | } | |
| @@ -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 ReopenIssue | 53 | // 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. Owner | 84 | // 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. Owner | 250 | // 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 ( | |||
| 33 | 33 | IssueState_ISSUE_STATE_UNSPECIFIED IssueState = 0 | |
| 34 | 34 | // The issue is open. | |
| 35 | 35 | IssueState_ISSUE_STATE_OPEN IssueState = 1 | |
| 36 | - | // The issue is closed. | |
| 36 | + | // The issue is closed without being resolved (won't fix, duplicate, ...). | |
| 37 | 37 | IssueState_ISSUE_STATE_CLOSED IssueState = 2 | |
| 38 | 38 | // Reserved for later use: awaiting moderation, owner-only. | |
| 39 | 39 | 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 | 46 | // Enum value maps for IssueState. | |
| @@ -46,12 +50,14 @@ var ( | |||
| 46 | 50 | 1: "ISSUE_STATE_OPEN", | |
| 47 | 51 | 2: "ISSUE_STATE_CLOSED", | |
| 48 | 52 | 3: "ISSUE_STATE_PENDING", | |
| 53 | + | 4: "ISSUE_STATE_RESOLVED", | |
| 49 | 54 | } | |
| 50 | 55 | IssueState_value = map[string]int32{ | |
| 51 | 56 | "ISSUE_STATE_UNSPECIFIED": 0, | |
| 52 | 57 | "ISSUE_STATE_OPEN": 1, | |
| 53 | 58 | "ISSUE_STATE_CLOSED": 2, | |
| 54 | 59 | "ISSUE_STATE_PENDING": 3, | |
| 60 | + | "ISSUE_STATE_RESOLVED": 4, | |
| 55 | 61 | } | |
| 56 | 62 | ) | |
| 57 | 63 | ||
| @@ -108,9 +114,10 @@ type Issue struct { | |||
| 108 | 114 | UpdatedAt *timestamppb.Timestamp `protobuf:"bytes,8,opt,name=updated_at,json=updatedAt,proto3" json:"updated_at,omitempty"` | |
| 109 | 115 | // CommentCount is the number of comments on the issue. | |
| 110 | 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 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. | |
| 114 | 121 | ClosedByMergeRequest int64 `protobuf:"varint,10,opt,name=closed_by_merge_request,json=closedByMergeRequest,proto3" json:"closed_by_merge_request,omitempty"` | |
| 115 | 122 | unknownFields protoimpl.UnknownFields | |
| 116 | 123 | sizeCache protoimpl.SizeCache | |
| @@ -670,7 +677,10 @@ type GetIssueResponse struct { | |||
| 670 | 677 | Comments []*IssueComment `protobuf:"bytes,2,rep,name=comments,proto3" json:"comments,omitempty"` | |
| 671 | 678 | // References are the merge requests naming the issue, ascending by number, | |
| 672 | 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 | 684 | unknownFields protoimpl.UnknownFields | |
| 675 | 685 | sizeCache protoimpl.SizeCache | |
| 676 | 686 | } | |
| @@ -726,6 +736,13 @@ func (x *GetIssueResponse) GetReferences() []*IssueReference { | |||
| 726 | 736 | 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 | 746 | // AddIssueCommentRequest describes the comment to add. | |
| 730 | 747 | type AddIssueCommentRequest struct { | |
| 731 | 748 | state protoimpl.MessageState `protogen:"open.v1"` | |
| @@ -937,6 +954,107 @@ func (x *CloseIssueResponse) GetIssue() *Issue { | |||
| 937 | 954 | 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 | 1058 | // ReopenIssueRequest names the issue to reopen. | |
| 941 | 1059 | type ReopenIssueRequest struct { | |
| 942 | 1060 | state protoimpl.MessageState `protogen:"open.v1"` | |
| @@ -950,7 +1068,7 @@ type ReopenIssueRequest struct { | |||
| 950 | 1068 | ||
| 951 | 1069 | func (x *ReopenIssueRequest) Reset() { | |
| 952 | 1070 | *x = ReopenIssueRequest{} | |
| 953 | - | mi := &file_ermite_issue_proto_msgTypes[13] | |
| 1071 | + | mi := &file_ermite_issue_proto_msgTypes[15] | |
| 954 | 1072 | ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) | |
| 955 | 1073 | ms.StoreMessageInfo(mi) | |
| 956 | 1074 | } | |
| @@ -962,7 +1080,7 @@ func (x *ReopenIssueRequest) String() string { | |||
| 962 | 1080 | func (*ReopenIssueRequest) ProtoMessage() {} | |
| 963 | 1081 | ||
| 964 | 1082 | func (x *ReopenIssueRequest) ProtoReflect() protoreflect.Message { | |
| 965 | - | mi := &file_ermite_issue_proto_msgTypes[13] | |
| 1083 | + | mi := &file_ermite_issue_proto_msgTypes[15] | |
| 966 | 1084 | if x != nil { | |
| 967 | 1085 | ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) | |
| 968 | 1086 | if ms.LoadMessageInfo() == nil { | |
| @@ -975,7 +1093,7 @@ func (x *ReopenIssueRequest) ProtoReflect() protoreflect.Message { | |||
| 975 | 1093 | ||
| 976 | 1094 | // Deprecated: Use ReopenIssueRequest.ProtoReflect.Descriptor instead. | |
| 977 | 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 | 1099 | func (x *ReopenIssueRequest) GetRepo() string { | |
| @@ -1003,7 +1121,7 @@ type ReopenIssueResponse struct { | |||
| 1003 | 1121 | ||
| 1004 | 1122 | func (x *ReopenIssueResponse) Reset() { | |
| 1005 | 1123 | *x = ReopenIssueResponse{} | |
| 1006 | - | mi := &file_ermite_issue_proto_msgTypes[14] | |
| 1124 | + | mi := &file_ermite_issue_proto_msgTypes[16] | |
| 1007 | 1125 | ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) | |
| 1008 | 1126 | ms.StoreMessageInfo(mi) | |
| 1009 | 1127 | } | |
| @@ -1015,7 +1133,7 @@ func (x *ReopenIssueResponse) String() string { | |||
| 1015 | 1133 | func (*ReopenIssueResponse) ProtoMessage() {} | |
| 1016 | 1134 | ||
| 1017 | 1135 | func (x *ReopenIssueResponse) ProtoReflect() protoreflect.Message { | |
| 1018 | - | mi := &file_ermite_issue_proto_msgTypes[14] | |
| 1136 | + | mi := &file_ermite_issue_proto_msgTypes[16] | |
| 1019 | 1137 | if x != nil { | |
| 1020 | 1138 | ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) | |
| 1021 | 1139 | if ms.LoadMessageInfo() == nil { | |
| @@ -1028,7 +1146,7 @@ func (x *ReopenIssueResponse) ProtoReflect() protoreflect.Message { | |||
| 1028 | 1146 | ||
| 1029 | 1147 | // Deprecated: Use ReopenIssueResponse.ProtoReflect.Descriptor instead. | |
| 1030 | 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 | 1152 | func (x *ReopenIssueResponse) GetIssue() *Issue { | |
| @@ -1061,7 +1179,7 @@ type PendingIssue struct { | |||
| 1061 | 1179 | ||
| 1062 | 1180 | func (x *PendingIssue) Reset() { | |
| 1063 | 1181 | *x = PendingIssue{} | |
| 1064 | - | mi := &file_ermite_issue_proto_msgTypes[15] | |
| 1182 | + | mi := &file_ermite_issue_proto_msgTypes[17] | |
| 1065 | 1183 | ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) | |
| 1066 | 1184 | ms.StoreMessageInfo(mi) | |
| 1067 | 1185 | } | |
| @@ -1073,7 +1191,7 @@ func (x *PendingIssue) String() string { | |||
| 1073 | 1191 | func (*PendingIssue) ProtoMessage() {} | |
| 1074 | 1192 | ||
| 1075 | 1193 | func (x *PendingIssue) ProtoReflect() protoreflect.Message { | |
| 1076 | - | mi := &file_ermite_issue_proto_msgTypes[15] | |
| 1194 | + | mi := &file_ermite_issue_proto_msgTypes[17] | |
| 1077 | 1195 | if x != nil { | |
| 1078 | 1196 | ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) | |
| 1079 | 1197 | if ms.LoadMessageInfo() == nil { | |
| @@ -1086,7 +1204,7 @@ func (x *PendingIssue) ProtoReflect() protoreflect.Message { | |||
| 1086 | 1204 | ||
| 1087 | 1205 | // Deprecated: Use PendingIssue.ProtoReflect.Descriptor instead. | |
| 1088 | 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 | 1210 | func (x *PendingIssue) GetId() string { | |
| @@ -1148,7 +1266,7 @@ type ListPendingIssuesRequest struct { | |||
| 1148 | 1266 | ||
| 1149 | 1267 | func (x *ListPendingIssuesRequest) Reset() { | |
| 1150 | 1268 | *x = ListPendingIssuesRequest{} | |
| 1151 | - | mi := &file_ermite_issue_proto_msgTypes[16] | |
| 1269 | + | mi := &file_ermite_issue_proto_msgTypes[18] | |
| 1152 | 1270 | ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) | |
| 1153 | 1271 | ms.StoreMessageInfo(mi) | |
| 1154 | 1272 | } | |
| @@ -1160,7 +1278,7 @@ func (x *ListPendingIssuesRequest) String() string { | |||
| 1160 | 1278 | func (*ListPendingIssuesRequest) ProtoMessage() {} | |
| 1161 | 1279 | ||
| 1162 | 1280 | func (x *ListPendingIssuesRequest) ProtoReflect() protoreflect.Message { | |
| 1163 | - | mi := &file_ermite_issue_proto_msgTypes[16] | |
| 1281 | + | mi := &file_ermite_issue_proto_msgTypes[18] | |
| 1164 | 1282 | if x != nil { | |
| 1165 | 1283 | ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) | |
| 1166 | 1284 | if ms.LoadMessageInfo() == nil { | |
| @@ -1173,7 +1291,7 @@ func (x *ListPendingIssuesRequest) ProtoReflect() protoreflect.Message { | |||
| 1173 | 1291 | ||
| 1174 | 1292 | // Deprecated: Use ListPendingIssuesRequest.ProtoReflect.Descriptor instead. | |
| 1175 | 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 | 1297 | func (x *ListPendingIssuesRequest) GetRepo() string { | |
| @@ -1211,7 +1329,7 @@ type ListPendingIssuesResponse struct { | |||
| 1211 | 1329 | ||
| 1212 | 1330 | func (x *ListPendingIssuesResponse) Reset() { | |
| 1213 | 1331 | *x = ListPendingIssuesResponse{} | |
| 1214 | - | mi := &file_ermite_issue_proto_msgTypes[17] | |
| 1332 | + | mi := &file_ermite_issue_proto_msgTypes[19] | |
| 1215 | 1333 | ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) | |
| 1216 | 1334 | ms.StoreMessageInfo(mi) | |
| 1217 | 1335 | } | |
| @@ -1223,7 +1341,7 @@ func (x *ListPendingIssuesResponse) String() string { | |||
| 1223 | 1341 | func (*ListPendingIssuesResponse) ProtoMessage() {} | |
| 1224 | 1342 | ||
| 1225 | 1343 | func (x *ListPendingIssuesResponse) ProtoReflect() protoreflect.Message { | |
| 1226 | - | mi := &file_ermite_issue_proto_msgTypes[17] | |
| 1344 | + | mi := &file_ermite_issue_proto_msgTypes[19] | |
| 1227 | 1345 | if x != nil { | |
| 1228 | 1346 | ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) | |
| 1229 | 1347 | if ms.LoadMessageInfo() == nil { | |
| @@ -1236,7 +1354,7 @@ func (x *ListPendingIssuesResponse) ProtoReflect() protoreflect.Message { | |||
| 1236 | 1354 | ||
| 1237 | 1355 | // Deprecated: Use ListPendingIssuesResponse.ProtoReflect.Descriptor instead. | |
| 1238 | 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 | 1360 | func (x *ListPendingIssuesResponse) GetIssues() []*PendingIssue { | |
| @@ -1266,7 +1384,7 @@ type ApproveIssueRequest struct { | |||
| 1266 | 1384 | ||
| 1267 | 1385 | func (x *ApproveIssueRequest) Reset() { | |
| 1268 | 1386 | *x = ApproveIssueRequest{} | |
| 1269 | - | mi := &file_ermite_issue_proto_msgTypes[18] | |
| 1387 | + | mi := &file_ermite_issue_proto_msgTypes[20] | |
| 1270 | 1388 | ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) | |
| 1271 | 1389 | ms.StoreMessageInfo(mi) | |
| 1272 | 1390 | } | |
| @@ -1278,7 +1396,7 @@ func (x *ApproveIssueRequest) String() string { | |||
| 1278 | 1396 | func (*ApproveIssueRequest) ProtoMessage() {} | |
| 1279 | 1397 | ||
| 1280 | 1398 | func (x *ApproveIssueRequest) ProtoReflect() protoreflect.Message { | |
| 1281 | - | mi := &file_ermite_issue_proto_msgTypes[18] | |
| 1399 | + | mi := &file_ermite_issue_proto_msgTypes[20] | |
| 1282 | 1400 | if x != nil { | |
| 1283 | 1401 | ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) | |
| 1284 | 1402 | if ms.LoadMessageInfo() == nil { | |
| @@ -1291,7 +1409,7 @@ func (x *ApproveIssueRequest) ProtoReflect() protoreflect.Message { | |||
| 1291 | 1409 | ||
| 1292 | 1410 | // Deprecated: Use ApproveIssueRequest.ProtoReflect.Descriptor instead. | |
| 1293 | 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 | 1415 | func (x *ApproveIssueRequest) GetRepo() string { | |
| @@ -1320,7 +1438,7 @@ type ApproveIssueResponse struct { | |||
| 1320 | 1438 | ||
| 1321 | 1439 | func (x *ApproveIssueResponse) Reset() { | |
| 1322 | 1440 | *x = ApproveIssueResponse{} | |
| 1323 | - | mi := &file_ermite_issue_proto_msgTypes[19] | |
| 1441 | + | mi := &file_ermite_issue_proto_msgTypes[21] | |
| 1324 | 1442 | ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) | |
| 1325 | 1443 | ms.StoreMessageInfo(mi) | |
| 1326 | 1444 | } | |
| @@ -1332,7 +1450,7 @@ func (x *ApproveIssueResponse) String() string { | |||
| 1332 | 1450 | func (*ApproveIssueResponse) ProtoMessage() {} | |
| 1333 | 1451 | ||
| 1334 | 1452 | func (x *ApproveIssueResponse) ProtoReflect() protoreflect.Message { | |
| 1335 | - | mi := &file_ermite_issue_proto_msgTypes[19] | |
| 1453 | + | mi := &file_ermite_issue_proto_msgTypes[21] | |
| 1336 | 1454 | if x != nil { | |
| 1337 | 1455 | ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) | |
| 1338 | 1456 | if ms.LoadMessageInfo() == nil { | |
| @@ -1345,7 +1463,7 @@ func (x *ApproveIssueResponse) ProtoReflect() protoreflect.Message { | |||
| 1345 | 1463 | ||
| 1346 | 1464 | // Deprecated: Use ApproveIssueResponse.ProtoReflect.Descriptor instead. | |
| 1347 | 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 | 1469 | func (x *ApproveIssueResponse) GetIssue() *Issue { | |
| @@ -1370,7 +1488,7 @@ type RejectIssueRequest struct { | |||
| 1370 | 1488 | ||
| 1371 | 1489 | func (x *RejectIssueRequest) Reset() { | |
| 1372 | 1490 | *x = RejectIssueRequest{} | |
| 1373 | - | mi := &file_ermite_issue_proto_msgTypes[20] | |
| 1491 | + | mi := &file_ermite_issue_proto_msgTypes[22] | |
| 1374 | 1492 | ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) | |
| 1375 | 1493 | ms.StoreMessageInfo(mi) | |
| 1376 | 1494 | } | |
| @@ -1382,7 +1500,7 @@ func (x *RejectIssueRequest) String() string { | |||
| 1382 | 1500 | func (*RejectIssueRequest) ProtoMessage() {} | |
| 1383 | 1501 | ||
| 1384 | 1502 | func (x *RejectIssueRequest) ProtoReflect() protoreflect.Message { | |
| 1385 | - | mi := &file_ermite_issue_proto_msgTypes[20] | |
| 1503 | + | mi := &file_ermite_issue_proto_msgTypes[22] | |
| 1386 | 1504 | if x != nil { | |
| 1387 | 1505 | ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) | |
| 1388 | 1506 | if ms.LoadMessageInfo() == nil { | |
| @@ -1395,7 +1513,7 @@ func (x *RejectIssueRequest) ProtoReflect() protoreflect.Message { | |||
| 1395 | 1513 | ||
| 1396 | 1514 | // Deprecated: Use RejectIssueRequest.ProtoReflect.Descriptor instead. | |
| 1397 | 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 | 1519 | func (x *RejectIssueRequest) GetRepo() string { | |
| @@ -1428,7 +1546,7 @@ type RejectIssueResponse struct { | |||
| 1428 | 1546 | ||
| 1429 | 1547 | func (x *RejectIssueResponse) Reset() { | |
| 1430 | 1548 | *x = RejectIssueResponse{} | |
| 1431 | - | mi := &file_ermite_issue_proto_msgTypes[21] | |
| 1549 | + | mi := &file_ermite_issue_proto_msgTypes[23] | |
| 1432 | 1550 | ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) | |
| 1433 | 1551 | ms.StoreMessageInfo(mi) | |
| 1434 | 1552 | } | |
| @@ -1440,7 +1558,7 @@ func (x *RejectIssueResponse) String() string { | |||
| 1440 | 1558 | func (*RejectIssueResponse) ProtoMessage() {} | |
| 1441 | 1559 | ||
| 1442 | 1560 | func (x *RejectIssueResponse) ProtoReflect() protoreflect.Message { | |
| 1443 | - | mi := &file_ermite_issue_proto_msgTypes[21] | |
| 1561 | + | mi := &file_ermite_issue_proto_msgTypes[23] | |
| 1444 | 1562 | if x != nil { | |
| 1445 | 1563 | ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) | |
| 1446 | 1564 | if ms.LoadMessageInfo() == nil { | |
| @@ -1453,7 +1571,7 @@ func (x *RejectIssueResponse) ProtoReflect() protoreflect.Message { | |||
| 1453 | 1571 | ||
| 1454 | 1572 | // Deprecated: Use RejectIssueResponse.ProtoReflect.Descriptor instead. | |
| 1455 | 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 | 1577 | var File_ermite_issue_proto protoreflect.FileDescriptor | |
| @@ -1503,13 +1621,14 @@ const file_ermite_issue_proto_rawDesc = "" + | |||
| 1503 | 1621 | "\x0fnext_page_token\x18\x02 \x01(\tR\rnextPageToken\"=\n" + | |
| 1504 | 1622 | "\x0fGetIssueRequest\x12\x12\n" + | |
| 1505 | 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 | 1625 | "\x10GetIssueResponse\x12#\n" + | |
| 1508 | 1626 | "\x05issue\x18\x01 \x01(\v2\r.ermite.IssueR\x05issue\x120\n" + | |
| 1509 | 1627 | "\bcomments\x18\x02 \x03(\v2\x14.ermite.IssueCommentR\bcomments\x126\n" + | |
| 1510 | 1628 | "\n" + | |
| 1511 | 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 | 1632 | "\x16AddIssueCommentRequest\x12\x12\n" + | |
| 1514 | 1633 | "\x04repo\x18\x01 \x01(\tR\x04repo\x12\x16\n" + | |
| 1515 | 1634 | "\x06number\x18\x02 \x01(\x03R\x06number\x12\x12\n" + | |
| @@ -1520,6 +1639,11 @@ const file_ermite_issue_proto_rawDesc = "" + | |||
| 1520 | 1639 | "\x04repo\x18\x01 \x01(\tR\x04repo\x12\x16\n" + | |
| 1521 | 1640 | "\x06number\x18\x02 \x01(\x03R\x06number\"9\n" + | |
| 1522 | 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 | 1647 | "\x05issue\x18\x01 \x01(\v2\r.ermite.IssueR\x05issue\"@\n" + | |
| 1524 | 1648 | "\x12ReopenIssueRequest\x12\x12\n" + | |
| 1525 | 1649 | "\x04repo\x18\x01 \x01(\tR\x04repo\x12\x16\n" + | |
| @@ -1551,13 +1675,14 @@ const file_ermite_issue_proto_rawDesc = "" + | |||
| 1551 | 1675 | "\x04repo\x18\x01 \x01(\tR\x04repo\x12\x0e\n" + | |
| 1552 | 1676 | "\x02id\x18\x02 \x01(\tR\x02id\x12\x10\n" + | |
| 1553 | 1677 | "\x03ban\x18\x03 \x01(\bR\x03ban\"\x15\n" + | |
| 1554 | - | "\x13RejectIssueResponse*p\n" + | |
| 1678 | + | "\x13RejectIssueResponse*\x8a\x01\n" + | |
| 1555 | 1679 | "\n" + | |
| 1556 | 1680 | "IssueState\x12\x1b\n" + | |
| 1557 | 1681 | "\x17ISSUE_STATE_UNSPECIFIED\x10\x00\x12\x14\n" + | |
| 1558 | 1682 | "\x10ISSUE_STATE_OPEN\x10\x01\x12\x16\n" + | |
| 1559 | 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 | 1686 | "\fIssueService\x12F\n" + | |
| 1562 | 1687 | "\vCreateIssue\x12\x1a.ermite.CreateIssueRequest\x1a\x1b.ermite.CreateIssueResponse\x12C\n" + | |
| 1563 | 1688 | "\n" + | |
| @@ -1565,7 +1690,8 @@ const file_ermite_issue_proto_rawDesc = "" + | |||
| 1565 | 1690 | "\bGetIssue\x12\x17.ermite.GetIssueRequest\x1a\x18.ermite.GetIssueResponse\x12R\n" + | |
| 1566 | 1691 | "\x0fAddIssueComment\x12\x1e.ermite.AddIssueCommentRequest\x1a\x1f.ermite.AddIssueCommentResponse\x12C\n" + | |
| 1567 | 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 | 1695 | "\vReopenIssue\x12\x1a.ermite.ReopenIssueRequest\x1a\x1b.ermite.ReopenIssueResponse\x12X\n" + | |
| 1570 | 1696 | "\x11ListPendingIssues\x12 .ermite.ListPendingIssuesRequest\x1a!.ermite.ListPendingIssuesResponse\x12I\n" + | |
| 1571 | 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 | 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 | 1717 | var file_ermite_issue_proto_goTypes = []any{ | |
| 1592 | 1718 | (IssueState)(0), // 0: ermite.IssueState | |
| 1593 | 1719 | (*Issue)(nil), // 1: ermite.Issue | |
| @@ -1603,59 +1729,66 @@ var file_ermite_issue_proto_goTypes = []any{ | |||
| 1603 | 1729 | (*AddIssueCommentResponse)(nil), // 11: ermite.AddIssueCommentResponse | |
| 1604 | 1730 | (*CloseIssueRequest)(nil), // 12: ermite.CloseIssueRequest | |
| 1605 | 1731 | (*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 | |
| 1617 | 1746 | } | |
| 1618 | 1747 | var file_ermite_issue_proto_depIdxs = []int32{ | |
| 1619 | 1748 | 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 | |
| 1624 | 1753 | 1, // 5: ermite.CreateIssueResponse.issue:type_name -> ermite.Issue | |
| 1625 | 1754 | 0, // 6: ermite.ListIssuesRequest.state:type_name -> ermite.IssueState | |
| 1626 | 1755 | 1, // 7: ermite.ListIssuesResponse.issues:type_name -> ermite.Issue | |
| 1627 | 1756 | 1, // 8: ermite.GetIssueResponse.issue:type_name -> ermite.Issue | |
| 1628 | 1757 | 3, // 9: ermite.GetIssueResponse.comments:type_name -> ermite.IssueComment | |
| 1629 | 1758 | 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 | |
| 1659 | 1792 | } | |
| 1660 | 1793 | ||
| 1661 | 1794 | func init() { file_ermite_issue_proto_init() } | |
| @@ -1670,7 +1803,7 @@ func file_ermite_issue_proto_init() { | |||
| 1670 | 1803 | GoPackagePath: reflect.TypeOf(x{}).PkgPath(), | |
| 1671 | 1804 | RawDescriptor: unsafe.Slice(unsafe.StringData(file_ermite_issue_proto_rawDesc), len(file_ermite_issue_proto_rawDesc)), | |
| 1672 | 1805 | NumEnums: 1, | |
| 1673 | - | NumMessages: 22, | |
| 1806 | + | NumMessages: 24, | |
| 1674 | 1807 | NumExtensions: 0, | |
| 1675 | 1808 | NumServices: 1, | |
| 1676 | 1809 | }, | |
| @@ -33,10 +33,14 @@ const ( | |||||
| 33 | IssueState_ISSUE_STATE_UNSPECIFIED IssueState = 0 | 33 | IssueState_ISSUE_STATE_UNSPECIFIED IssueState = 0 | ||
| 34 | // The issue is open. | 34 | // The issue is open. | ||
| 35 | IssueState_ISSUE_STATE_OPEN IssueState = 1 | 35 | 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 = 2 | 37 | 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 = 3 | 39 | 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 closed | 117 | + | // ClosedByMergeRequest is the number of the merge request whose merge |
| 112 | - | // the issue (a closing reference such as "Fixes #N"); 0 when the issue was | 118 | + | // 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.UnknownFields | 122 | unknownFields protoimpl.UnknownFields | ||
| 116 | sizeCache protoimpl.SizeCache | 123 | 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.UnknownFields | 684 | unknownFields protoimpl.UnknownFields | ||
| 675 | sizeCache protoimpl.SizeCache | 685 | sizeCache protoimpl.SizeCache | ||
| 676 | } | 686 | } | ||
| @@ -726,6 +736,13 @@ func (x *GetIssueResponse) GetReferences() []*IssueReference { | |||||
| 726 | return nil | 736 | 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 nil | 954 | 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.FileDescriptor | 1577 | 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.IssueState | 1718 | (IssueState)(0), // 0: ermite.IssueState | ||
| 1593 | (*Issue)(nil), // 1: ermite.Issue | 1719 | (*Issue)(nil), // 1: ermite.Issue | ||
| @@ -1603,59 +1729,66 @@ var file_ermite_issue_proto_goTypes = []any{ | |||||
| 1603 | (*AddIssueCommentResponse)(nil), // 11: ermite.AddIssueCommentResponse | 1729 | (*AddIssueCommentResponse)(nil), // 11: ermite.AddIssueCommentResponse | ||
| 1604 | (*CloseIssueRequest)(nil), // 12: ermite.CloseIssueRequest | 1730 | (*CloseIssueRequest)(nil), // 12: ermite.CloseIssueRequest | ||
| 1605 | (*CloseIssueResponse)(nil), // 13: ermite.CloseIssueResponse | 1731 | (*CloseIssueResponse)(nil), // 13: ermite.CloseIssueResponse | ||
| 1606 | - | (*ReopenIssueRequest)(nil), // 14: ermite.ReopenIssueRequest | 1732 | + | (*ResolveIssueRequest)(nil), // 14: ermite.ResolveIssueRequest |
| 1607 | - | (*ReopenIssueResponse)(nil), // 15: ermite.ReopenIssueResponse | 1733 | + | (*ResolveIssueResponse)(nil), // 15: ermite.ResolveIssueResponse |
| 1608 | - | (*PendingIssue)(nil), // 16: ermite.PendingIssue | 1734 | + | (*ReopenIssueRequest)(nil), // 16: ermite.ReopenIssueRequest |
| 1609 | - | (*ListPendingIssuesRequest)(nil), // 17: ermite.ListPendingIssuesRequest | 1735 | + | (*ReopenIssueResponse)(nil), // 17: ermite.ReopenIssueResponse |
| 1610 | - | (*ListPendingIssuesResponse)(nil), // 18: ermite.ListPendingIssuesResponse | 1736 | + | (*PendingIssue)(nil), // 18: ermite.PendingIssue |
| 1611 | - | (*ApproveIssueRequest)(nil), // 19: ermite.ApproveIssueRequest | 1737 | + | (*ListPendingIssuesRequest)(nil), // 19: ermite.ListPendingIssuesRequest |
| 1612 | - | (*ApproveIssueResponse)(nil), // 20: ermite.ApproveIssueResponse | 1738 | + | (*ListPendingIssuesResponse)(nil), // 20: ermite.ListPendingIssuesResponse |
| 1613 | - | (*RejectIssueRequest)(nil), // 21: ermite.RejectIssueRequest | 1739 | + | (*ApproveIssueRequest)(nil), // 21: ermite.ApproveIssueRequest |
| 1614 | - | (*RejectIssueResponse)(nil), // 22: ermite.RejectIssueResponse | 1740 | + | (*ApproveIssueResponse)(nil), // 22: ermite.ApproveIssueResponse |
| 1615 | - | (*timestamppb.Timestamp)(nil), // 23: google.protobuf.Timestamp | 1741 | + | (*RejectIssueRequest)(nil), // 23: ermite.RejectIssueRequest |
| 1616 | - | (MergeRequestState)(0), // 24: ermite.MergeRequestState | 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 | |||
| 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.IssueState | 1748 | 0, // 0: ermite.Issue.state:type_name -> ermite.IssueState | ||
| 1620 | - | 23, // 1: ermite.Issue.created_at:type_name -> google.protobuf.Timestamp | 1749 | + | 25, // 1: ermite.Issue.created_at:type_name -> google.protobuf.Timestamp |
| 1621 | - | 23, // 2: ermite.Issue.updated_at:type_name -> google.protobuf.Timestamp | 1750 | + | 25, // 2: ermite.Issue.updated_at:type_name -> google.protobuf.Timestamp |
| 1622 | - | 24, // 3: ermite.IssueReference.state:type_name -> ermite.MergeRequestState | 1751 | + | 26, // 3: ermite.IssueReference.state:type_name -> ermite.MergeRequestState |
| 1623 | - | 23, // 4: ermite.IssueComment.created_at:type_name -> google.protobuf.Timestamp | 1752 | + | 25, // 4: ermite.IssueComment.created_at:type_name -> google.protobuf.Timestamp |
| 1624 | 1, // 5: ermite.CreateIssueResponse.issue:type_name -> ermite.Issue | 1753 | 1, // 5: ermite.CreateIssueResponse.issue:type_name -> ermite.Issue | ||
| 1625 | 0, // 6: ermite.ListIssuesRequest.state:type_name -> ermite.IssueState | 1754 | 0, // 6: ermite.ListIssuesRequest.state:type_name -> ermite.IssueState | ||
| 1626 | 1, // 7: ermite.ListIssuesResponse.issues:type_name -> ermite.Issue | 1755 | 1, // 7: ermite.ListIssuesResponse.issues:type_name -> ermite.Issue | ||
| 1627 | 1, // 8: ermite.GetIssueResponse.issue:type_name -> ermite.Issue | 1756 | 1, // 8: ermite.GetIssueResponse.issue:type_name -> ermite.Issue | ||
| 1628 | 3, // 9: ermite.GetIssueResponse.comments:type_name -> ermite.IssueComment | 1757 | 3, // 9: ermite.GetIssueResponse.comments:type_name -> ermite.IssueComment | ||
| 1629 | 2, // 10: ermite.GetIssueResponse.references:type_name -> ermite.IssueReference | 1758 | 2, // 10: ermite.GetIssueResponse.references:type_name -> ermite.IssueReference | ||
| 1630 | - | 3, // 11: ermite.AddIssueCommentResponse.comment:type_name -> ermite.IssueComment | 1759 | + | 27, // 11: ermite.GetIssueResponse.events:type_name -> ermite.IssueEvent |
| 1631 | - | 1, // 12: ermite.CloseIssueResponse.issue:type_name -> ermite.Issue | 1760 | + | 3, // 12: ermite.AddIssueCommentResponse.comment:type_name -> ermite.IssueComment |
| 1632 | - | 1, // 13: ermite.ReopenIssueResponse.issue:type_name -> ermite.Issue | 1761 | + | 1, // 13: ermite.CloseIssueResponse.issue:type_name -> ermite.Issue |
| 1633 | - | 23, // 14: ermite.PendingIssue.created_at:type_name -> google.protobuf.Timestamp | 1762 | + | 1, // 14: ermite.ResolveIssueResponse.issue:type_name -> ermite.Issue |
| 1634 | - | 16, // 15: ermite.ListPendingIssuesResponse.issues:type_name -> ermite.PendingIssue | 1763 | + | 1, // 15: ermite.ReopenIssueResponse.issue:type_name -> ermite.Issue |
| 1635 | - | 1, // 16: ermite.ApproveIssueResponse.issue:type_name -> ermite.Issue | 1764 | + | 25, // 16: ermite.PendingIssue.created_at:type_name -> google.protobuf.Timestamp |
| 1636 | - | 4, // 17: ermite.IssueService.CreateIssue:input_type -> ermite.CreateIssueRequest | 1765 | + | 18, // 17: ermite.ListPendingIssuesResponse.issues:type_name -> ermite.PendingIssue |
| 1637 | - | 6, // 18: ermite.IssueService.ListIssues:input_type -> ermite.ListIssuesRequest | 1766 | + | 1, // 18: ermite.ApproveIssueResponse.issue:type_name -> ermite.Issue |
| 1638 | - | 8, // 19: ermite.IssueService.GetIssue:input_type -> ermite.GetIssueRequest | 1767 | + | 4, // 19: ermite.IssueService.CreateIssue:input_type -> ermite.CreateIssueRequest |
| 1639 | - | 10, // 20: ermite.IssueService.AddIssueComment:input_type -> ermite.AddIssueCommentRequest | 1768 | + | 6, // 20: ermite.IssueService.ListIssues:input_type -> ermite.ListIssuesRequest |
| 1640 | - | 12, // 21: ermite.IssueService.CloseIssue:input_type -> ermite.CloseIssueRequest | 1769 | + | 8, // 21: ermite.IssueService.GetIssue:input_type -> ermite.GetIssueRequest |
| 1641 | - | 14, // 22: ermite.IssueService.ReopenIssue:input_type -> ermite.ReopenIssueRequest | 1770 | + | 10, // 22: ermite.IssueService.AddIssueComment:input_type -> ermite.AddIssueCommentRequest |
| 1642 | - | 17, // 23: ermite.IssueService.ListPendingIssues:input_type -> ermite.ListPendingIssuesRequest | 1771 | + | 12, // 23: ermite.IssueService.CloseIssue:input_type -> ermite.CloseIssueRequest |
| 1643 | - | 19, // 24: ermite.IssueService.ApproveIssue:input_type -> ermite.ApproveIssueRequest | 1772 | + | 14, // 24: ermite.IssueService.ResolveIssue:input_type -> ermite.ResolveIssueRequest |
| 1644 | - | 21, // 25: ermite.IssueService.RejectIssue:input_type -> ermite.RejectIssueRequest | 1773 | + | 16, // 25: ermite.IssueService.ReopenIssue:input_type -> ermite.ReopenIssueRequest |
| 1645 | - | 5, // 26: ermite.IssueService.CreateIssue:output_type -> ermite.CreateIssueResponse | 1774 | + | 19, // 26: ermite.IssueService.ListPendingIssues:input_type -> ermite.ListPendingIssuesRequest |
| 1646 | - | 7, // 27: ermite.IssueService.ListIssues:output_type -> ermite.ListIssuesResponse | 1775 | + | 21, // 27: ermite.IssueService.ApproveIssue:input_type -> ermite.ApproveIssueRequest |
| 1647 | - | 9, // 28: ermite.IssueService.GetIssue:output_type -> ermite.GetIssueResponse | 1776 | + | 23, // 28: ermite.IssueService.RejectIssue:input_type -> ermite.RejectIssueRequest |
| 1648 | - | 11, // 29: ermite.IssueService.AddIssueComment:output_type -> ermite.AddIssueCommentResponse | 1777 | + | 5, // 29: ermite.IssueService.CreateIssue:output_type -> ermite.CreateIssueResponse |
| 1649 | - | 13, // 30: ermite.IssueService.CloseIssue:output_type -> ermite.CloseIssueResponse | 1778 | + | 7, // 30: ermite.IssueService.ListIssues:output_type -> ermite.ListIssuesResponse |
| 1650 | - | 15, // 31: ermite.IssueService.ReopenIssue:output_type -> ermite.ReopenIssueResponse | 1779 | + | 9, // 31: ermite.IssueService.GetIssue:output_type -> ermite.GetIssueResponse |
| 1651 | - | 18, // 32: ermite.IssueService.ListPendingIssues:output_type -> ermite.ListPendingIssuesResponse | 1780 | + | 11, // 32: ermite.IssueService.AddIssueComment:output_type -> ermite.AddIssueCommentResponse |
| 1652 | - | 20, // 33: ermite.IssueService.ApproveIssue:output_type -> ermite.ApproveIssueResponse | 1781 | + | 13, // 33: ermite.IssueService.CloseIssue:output_type -> ermite.CloseIssueResponse |
| 1653 | - | 22, // 34: ermite.IssueService.RejectIssue:output_type -> ermite.RejectIssueResponse | 1782 | + | 15, // 34: ermite.IssueService.ResolveIssue:output_type -> ermite.ResolveIssueResponse |
| 1654 | - | 26, // [26:35] is the sub-list for method output_type | 1783 | + | 17, // 35: ermite.IssueService.ReopenIssue:output_type -> ermite.ReopenIssueResponse |
| 1655 | - | 17, // [17:26] is the sub-list for method input_type | 1784 | + | 20, // 36: ermite.IssueService.ListPendingIssues:output_type -> ermite.ListPendingIssuesResponse |
| 1656 | - | 17, // [17:17] is the sub-list for extension type_name | 1785 | + | 22, // 37: ermite.IssueService.ApproveIssue:output_type -> ermite.ApproveIssueResponse |
| 1657 | - | 17, // [17:17] is the sub-list for extension extendee | 1786 | + | 24, // 38: ermite.IssueService.RejectIssue:output_type -> ermite.RejectIssueResponse |
| 1658 | - | 0, // [0:17] is the sub-list for field type_name | 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 | |||
| 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 +544 -174 generated file: collapsed
M issue_test.go +2 -1
| @@ -19,6 +19,7 @@ func TestIssueProcedures(t *testing.T) { | |||
| 19 | 19 | ermiteconnect.IssueServiceAddIssueCommentProcedure: "AddIssueComment", | |
| 20 | 20 | ermiteconnect.IssueServiceCloseIssueProcedure: "CloseIssue", | |
| 21 | 21 | ermiteconnect.IssueServiceReopenIssueProcedure: "ReopenIssue", | |
| 22 | + | ermiteconnect.IssueServiceResolveIssueProcedure: "ResolveIssue", | |
| 22 | 23 | ermiteconnect.IssueServiceListPendingIssuesProcedure: "ListPendingIssues", | |
| 23 | 24 | ermiteconnect.IssueServiceApproveIssueProcedure: "ApproveIssue", | |
| 24 | 25 | ermiteconnect.IssueServiceRejectIssueProcedure: "RejectIssue", | |
| @@ -58,7 +59,7 @@ func TestIssueContract(t *testing.T) { | |||
| 58 | 59 | if ermite.Scope_SCOPE_ISSUE_WRITE != 11 { | |
| 59 | 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 | 63 | if got := ermite.IssueState_value[name]; got != want { | |
| 63 | 64 | t.Errorf("%s = %d, want %d", name, got, want) | |
| 64 | 65 | } | |
| @@ -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 +12 -2
| @@ -21,7 +21,7 @@ service EventService { | |||
| 21 | 21 | // for merge requests, merge_request_opened, merge_request_merged, | |
| 22 | 22 | // merge_request_closed, comment_added, comment_edited, comment_deleted and | |
| 23 | 23 | // comment_resolved (a thread resolved or reopened); for issues, issue_opened, | |
| 24 | - | // issue_closed, issue_reopened and issue_commented, and issue_submitted. Each | |
| 24 | + | // issue_closed, issue_resolved, issue_reopened and issue_commented, and issue_submitted. Each | |
| 25 | 25 | // one is delivered on the "repo:<name>" topic of its repository and on | |
| 26 | 26 | // "home", subject to the visibility of the repository, except | |
| 27 | 27 | // issue_submitted: it is delivered only on the "owner" topic, never on | |
| @@ -153,6 +153,8 @@ message Event { | |||
| 153 | 153 | ReleaseDeleted release_deleted = 29; | |
| 154 | 154 | // ReleaseUnpublished reports a release turned into a draft after tag deletion. | |
| 155 | 155 | ReleaseUnpublished release_unpublished = 30; | |
| 156 | + | // IssueResolved: an issue was resolved. | |
| 157 | + | IssueResolved issue_resolved = 31; | |
| 156 | 158 | } | |
| 157 | 159 | } | |
| 158 | 160 | ||
| @@ -290,12 +292,20 @@ message IssueOpened { | |||
| 290 | 292 | Issue issue = 1; | |
| 291 | 293 | } | |
| 292 | 294 | ||
| 293 | - | // IssueClosed reports a closed issue. | |
| 295 | + | // IssueClosed reports a closed issue. A merge that resolves an issue sends | |
| 296 | + | // issue_resolved, not issue_closed. | |
| 294 | 297 | message IssueClosed { | |
| 295 | 298 | // Issue is the issue after closing, including its repository and number. | |
| 296 | 299 | Issue issue = 1; | |
| 297 | 300 | } | |
| 298 | 301 | ||
| 302 | + | // IssueResolved reports a resolved issue. | |
| 303 | + | message IssueResolved { | |
| 304 | + | // Issue is the issue after resolving, including its repository, number and | |
| 305 | + | // closed_by_merge_request. | |
| 306 | + | Issue issue = 1; | |
| 307 | + | } | |
| 308 | + | ||
| 299 | 309 | // IssueReopened reports a reopened issue. | |
| 300 | 310 | message IssueReopened { | |
| 301 | 311 | // Issue is the issue after reopening, including its repository and number. | |
| @@ -21,7 +21,7 @@ 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 and | 22 | // 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. Each | 24 | + | // issue_closed, issue_resolved, issue_reopened and issue_commented, and issue_submitted. Each |
| 25 | // one is delivered on the "repo:<name>" topic of its repository and on | 25 | // one is delivered on the "repo:<name>" topic of its repository and on | ||
| 26 | // "home", subject to the visibility of the repository, except | 26 | // "home", subject to the visibility of the repository, except | ||
| 27 | // issue_submitted: it is delivered only on the "owner" topic, never on | 27 | // issue_submitted: it is delivered only on the "owner" topic, never on | ||
| @@ -153,6 +153,8 @@ message Event { | |||||
| 153 | ReleaseDeleted release_deleted = 29; | 153 | ReleaseDeleted release_deleted = 29; | ||
| 154 | // ReleaseUnpublished reports a release turned into a draft after tag deletion. | 154 | // ReleaseUnpublished reports a release turned into a draft after tag deletion. | ||
| 155 | ReleaseUnpublished release_unpublished = 30; | 155 | ReleaseUnpublished release_unpublished = 30; | ||
| 156 | + | // IssueResolved: an issue was resolved. | |||
| 157 | + | IssueResolved issue_resolved = 31; | |||
| 156 | } | 158 | } | ||
| 157 | } | 159 | } | ||
| 158 | 160 | ||||
| @@ -290,12 +292,20 @@ message IssueOpened { | |||||
| 290 | Issue issue = 1; | 292 | Issue issue = 1; | ||
| 291 | } | 293 | } | ||
| 292 | 294 | ||||
| 293 | - | // IssueClosed reports a closed issue. | 295 | + | // IssueClosed reports a closed issue. A merge that resolves an issue sends |
| 296 | + | // issue_resolved, not issue_closed. | |||
| 294 | message IssueClosed { | 297 | message IssueClosed { | ||
| 295 | // Issue is the issue after closing, including its repository and number. | 298 | // Issue is the issue after closing, including its repository and number. | ||
| 296 | Issue issue = 1; | 299 | Issue issue = 1; | ||
| 297 | } | 300 | } | ||
| 298 | 301 | ||||
| 302 | + | // IssueResolved reports a resolved issue. | |||
| 303 | + | message IssueResolved { | |||
| 304 | + | // Issue is the issue after resolving, including its repository, number and | |||
| 305 | + | // closed_by_merge_request. | |||
| 306 | + | Issue issue = 1; | |||
| 307 | + | } | |||
| 308 | + | ||||
| 299 | // IssueReopened reports a reopened issue. | 309 | // IssueReopened reports a reopened issue. | ||
| 300 | message IssueReopened { | 310 | message IssueReopened { | ||
| 301 | // Issue is the issue after reopening, including its repository and number. | 311 | // Issue is the issue after reopening, including its repository and number. | ||
M proto/ermite/issue.proto +46 -15
| @@ -14,10 +14,14 @@ enum IssueState { | |||
| 14 | 14 | ISSUE_STATE_UNSPECIFIED = 0; | |
| 15 | 15 | // The issue is open. | |
| 16 | 16 | ISSUE_STATE_OPEN = 1; | |
| 17 | - | // The issue is closed. | |
| 17 | + | // The issue is closed without being resolved (won't fix, duplicate, ...). | |
| 18 | 18 | ISSUE_STATE_CLOSED = 2; | |
| 19 | 19 | // Reserved for later use: awaiting moderation, owner-only. | |
| 20 | 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 | 27 | // Issue is a discussion in a repository. | |
| @@ -45,9 +49,10 @@ message Issue { | |||
| 45 | 49 | google.protobuf.Timestamp updated_at = 8; | |
| 46 | 50 | // CommentCount is the number of comments on the issue. | |
| 47 | 51 | 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. | |
| 51 | 56 | int64 closed_by_merge_request = 10; | |
| 52 | 57 | } | |
| 53 | 58 | ||
| @@ -86,29 +91,35 @@ message IssueComment { | |||
| 86 | 91 | // | |
| 87 | 92 | // Reading (ListIssues, GetIssue) needs the same access as reading the | |
| 88 | 93 | // 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 | |
| 90 | 96 | // owner or a token with the issue:write scope on the repository; branch | |
| 91 | 97 | // prefixes do not restrict it. A caller without credentials gets | |
| 92 | 98 | // unauthenticated, one with an insufficient scope gets permission_denied, and | |
| 93 | 99 | // one that cannot read the repository gets not_found. | |
| 94 | 100 | // | |
| 95 | 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 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". | |
| 101 | 110 | // | |
| 102 | 111 | // Text fields are normalized to NFC and stripped of control and Unicode | |
| 103 | 112 | // bidirectional characters (line breaks and tabs stay in bodies and comments). | |
| 104 | 113 | // The title is one line of 1 to 120 code points; body and comment text are at | |
| 105 | 114 | // most 10,000 code points and a comment must not be blank. A text that breaks | |
| 106 | 115 | // 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. | |
| 109 | 119 | // | |
| 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 | |
| 112 | 123 | // from the public form wait as PendingIssue records, reachable only through | |
| 113 | 124 | // the three moderation RPCs (ListPendingIssues, ApproveIssue, RejectIssue). | |
| 114 | 125 | // These need owner rights (root, an owner session, or a token holding every | |
| @@ -126,7 +137,10 @@ service IssueService { | |||
| 126 | 137 | rpc AddIssueComment(AddIssueCommentRequest) returns (AddIssueCommentResponse); | |
| 127 | 138 | // CloseIssue closes an issue. Needs the issue:write scope. | |
| 128 | 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 | 144 | rpc ReopenIssue(ReopenIssueRequest) returns (ReopenIssueResponse); | |
| 131 | 145 | // ListPendingIssues lists issues awaiting moderation, oldest first. Owner | |
| 132 | 146 | // rights only; anyone else gets NOT_FOUND. | |
| @@ -196,6 +210,9 @@ message GetIssueResponse { | |||
| 196 | 210 | // References are the merge requests naming the issue, ascending by number, | |
| 197 | 211 | // at most 100. | |
| 198 | 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 | 218 | // AddIssueCommentRequest describes the comment to add. | |
| @@ -228,6 +245,20 @@ message CloseIssueResponse { | |||
| 228 | 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 | 262 | // ReopenIssueRequest names the issue to reopen. | |
| 232 | 263 | message ReopenIssueRequest { | |
| 233 | 264 | // 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 closed | 52 | + | // ClosedByMergeRequest is the number of the merge request whose merge |
| 49 | - | // the issue (a closing reference such as "Fixes #N"); 0 when the issue was | 53 | + | // 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 the | 92 | // 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 the | 94 | + | // Writing (CreateIssue, AddIssueComment, CloseIssue, ResolveIssue, |
| 95 | + | // ReopenIssue) needs the | |||
| 90 | // owner or a token with the issue:write scope on the repository; branch | 96 | // owner or a token with the issue:write scope on the repository; branch | ||
| 91 | // prefixes do not restrict it. A caller without credentials gets | 97 | // prefixes do not restrict it. A caller without credentials gets | ||
| 92 | // unauthenticated, one with an insufficient scope gets permission_denied, and | 98 | // 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 the | 102 | + | // 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 carry | 103 | + | // 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" in | 105 | + | // 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 Unicode | 111 | // 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 at | 113 | // 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 breaks | 114 | // 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 already | 115 | // 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 | 116 | + | // 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, and | 120 | + | // The ordinary RPCs return issues in state OPEN, CLOSED or RESOLVED, and |
| 111 | - | // ListIssues with state ISSUE_STATE_PENDING is invalid_argument. Submissions | 121 | + | // ListIssues accepts these three states; ISSUE_STATE_PENDING is |
| 122 | + | // invalid_argument. Submissions | |||
| 112 | // from the public form wait as PendingIssue records, reachable only through | 123 | // 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 every | 125 | // 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. Owner | 145 | // 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 +76 -0
| @@ -402,6 +402,75 @@ message ListMergeRequestsResponse { | |||
| 402 | 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. Opaque. | |
| 453 | + | string id = 1; | |
| 454 | + | // Kind is what happened. | |
| 455 | + | IssueEventKind kind = 2; | |
| 456 | + | // Issue is the number of the issue. | |
| 457 | + | int64 issue = 3; | |
| 458 | + | // MergeRequest is the number of the merge request involved; 0 if none. | |
| 459 | + | int64 merge_request = 4; | |
| 460 | + | // MergeRequestTitle is the title of that merge request at read time; empty | |
| 461 | + | // if none. | |
| 462 | + | string merge_request_title = 5; | |
| 463 | + | // Closes says that the reference was a closing one. Only set for | |
| 464 | + | // ISSUE_EVENT_KIND_REFERENCED. | |
| 465 | + | bool closes = 6; | |
| 466 | + | // Actor names who caused the event, like Issue.author: the label of the | |
| 467 | + | // token or session. For events triggered by a merge, the label of who | |
| 468 | + | // merged. | |
| 469 | + | string actor = 7; | |
| 470 | + | // CreatedAt is when the event happened. | |
| 471 | + | google.protobuf.Timestamp created_at = 8; | |
| 472 | + | } | |
| 473 | + | ||
| 405 | 474 | // GetMergeRequestRequest selects a merge request. | |
| 406 | 475 | message GetMergeRequestRequest { | |
| 407 | 476 | // Repo is the repository name. | |
| @@ -452,6 +521,13 @@ message GetMergeRequestResponse { | |||
| 452 | 521 | // Verdicts are the current verdicts, one per author who gave one, ordered | |
| 453 | 522 | // by the comment that carries them, oldest first. | |
| 454 | 523 | repeated AuthorVerdict verdicts = 10; | |
| 524 | + | // Issues are the issues of the same repository that the merge request names, | |
| 525 | + | // ascending by number, at most 100. Empty when issues are off. | |
| 526 | + | repeated MergeRequestIssue issues = 11; | |
| 527 | + | // IssueEvents are the history entries that involve this merge request: the | |
| 528 | + | // REFERENCED and RESOLVED events of the issues it names, oldest first, at | |
| 529 | + | // most 500. | |
| 530 | + | repeated IssueEvent issue_events = 12; | |
| 455 | 531 | } | |
| 456 | 532 | ||
| 457 | 533 | // AddCommentRequest describes the comment to add. | |
| @@ -402,6 +402,75 @@ 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. Opaque. | |||
| 453 | + | string id = 1; | |||
| 454 | + | // Kind is what happened. | |||
| 455 | + | IssueEventKind kind = 2; | |||
| 456 | + | // Issue is the number of the issue. | |||
| 457 | + | int64 issue = 3; | |||
| 458 | + | // MergeRequest is the number of the merge request involved; 0 if none. | |||
| 459 | + | int64 merge_request = 4; | |||
| 460 | + | // MergeRequestTitle is the title of that merge request at read time; empty | |||
| 461 | + | // if none. | |||
| 462 | + | string merge_request_title = 5; | |||
| 463 | + | // Closes says that the reference was a closing one. Only set for | |||
| 464 | + | // ISSUE_EVENT_KIND_REFERENCED. | |||
| 465 | + | bool closes = 6; | |||
| 466 | + | // Actor names who caused the event, like Issue.author: the label of the | |||
| 467 | + | // token or session. For events triggered by a merge, the label of who | |||
| 468 | + | // merged. | |||
| 469 | + | string actor = 7; | |||
| 470 | + | // CreatedAt is when the event happened. | |||
| 471 | + | google.protobuf.Timestamp created_at = 8; | |||
| 472 | + | } | |||
| 473 | + | ||||
| 405 | // GetMergeRequestRequest selects a merge request. | 474 | // GetMergeRequestRequest selects a merge request. | ||
| 406 | message GetMergeRequestRequest { | 475 | message GetMergeRequestRequest { | ||
| 407 | // Repo is the repository name. | 476 | // Repo is the repository name. | ||
| @@ -452,6 +521,13 @@ message GetMergeRequestResponse { | |||||
| 452 | // Verdicts are the current verdicts, one per author who gave one, ordered | 521 | // Verdicts are the current verdicts, one per author who gave one, ordered | ||
| 453 | // by the comment that carries them, oldest first. | 522 | // by the comment that carries them, oldest first. | ||
| 454 | repeated AuthorVerdict verdicts = 10; | 523 | repeated AuthorVerdict verdicts = 10; | ||
| 524 | + | // Issues are the issues of the same repository that the merge request names, | |||
| 525 | + | // ascending by number, at most 100. Empty when issues are off. | |||
| 526 | + | repeated MergeRequestIssue issues = 11; | |||
| 527 | + | // IssueEvents are the history entries that involve this merge request: the | |||
| 528 | + | // REFERENCED and RESOLVED events of the issues it names, oldest first, at | |||
| 529 | + | // most 500. | |||
| 530 | + | repeated IssueEvent issue_events = 12; | |||
| 455 | } | 531 | } | ||
| 456 | 532 | ||||
| 457 | // AddCommentRequest describes the comment to add. | 533 | // AddCommentRequest describes the comment to add. | ||