detached b394bb8

Merge 81ede3b81040f2594180d0ca4f180a63b2cea9fd into ffa9a5ed3b92f780404c89cbe9288e74108a1ed0

commit
b394bb84e4b109668771066a112438ab8df26154
author
ermite · · 2026-10-22 18:34 UTC
merge of
ffa9a5e + 81ede3b · diff against the first parent
signature
unsigned
10 files · +1123 -390
M docs/services.md +2 -2
@@ -6,9 +6,9 @@
66 | `GitService` | `ListRefs`, `GetTree`, `ListPaths`, `GetBlob` (streamed), `ListCommits`, `GetCommit` (structured diff), `ResolveRevision` |
77 | `TokenService` | `CreateToken` (secret shown once), `ListTokens`, `RevokeToken` |
88 | `MergeRequestService` | `CreateMergeRequest`, `ListMergeRequests`, `GetMergeRequest` (commits, diff, comments), `AddComment`, `EditComment`, `DeleteComment`, `ResolveComment`, `CloseMergeRequest`, `MarkReady`, `MergeMergeRequest` (modes fast-forward, squash, merge commit), `MarkRead`, `EnableAutoMerge`, `CancelAutoMerge` (merge by itself once a check passed on the head and all its runs are complete; setting `allow_auto_merge`, `MergeRequest.auto_merge`, events `MergeRequestAutoMergeEnabled` and `MergeRequestAutoMergeCancelled`, `MergeRequestMerged.auto`; feature `merge_requests.auto_merge`). Open merge requests carry `mergeability` (up to date, behind, conflict, or checking) and `Watch` publishes `MergeRequestMergeability` each time a result is settled for new branch tips (feature `merge_requests.mergeability`) |
9-| `IssueService` | `CreateIssue`, `ListIssues`, `GetIssue` (comments, merge requests naming the issue, `closed_by_merge_request`), `AddIssueComment`, `CloseIssue`, `ReopenIssue`; owner only: `ListPendingIssues`, `ApproveIssue`, `RejectIssue`. Features `issues`, `issues.links`. Issues share numbers with merge requests |
9+| `IssueService` | `CreateIssue`, `ListIssues`, `GetIssue` (comments, merge requests naming the issue, history events, `closed_by_merge_request`), `AddIssueComment`, `CloseIssue`, `ResolveIssue`, `ReopenIssue`; owner only: `ListPendingIssues`, `ApproveIssue`, `RejectIssue`. States `OPEN`, `CLOSED`, `RESOLVED`; `ResolveIssue` needs `issue:write`. Features `issues`, `issues.links`, `issues.resolve`. Issues share numbers with merge requests |
1010 | `SessionService` | `CreateLoginLink`, `SignOutEverywhere` (owner only) |
11-| `EventService` | `Watch` (streamed, resumable). Topics `home`, `repo:<name>` and `owner` (owner rights only). Events 17–21: `issue_opened`, `issue_closed`, `issue_reopened`, `issue_commented`, and `issue_submitted` (only on `owner`, no content). Event 22: `merge_request_mergeability` |
11+| `EventService` | `Watch` (streamed, resumable). Topics `home`, `repo:<name>` and `owner` (owner rights only). Events 17–21: `issue_opened`, `issue_closed`, `issue_reopened`, `issue_commented`, and `issue_submitted` (only on `owner`, no content). Event 22: `merge_request_mergeability`. Event 31: `issue_resolved` |
1212 | `ServerService` | `GetVersion` (version and features), `GetSigningKey`, `RotateOIDCKey` (owner only) |
1313 | `TrustedKeyService` | `ListTrustedKeys`, `AddTrustedKey` and `RemoveTrustedKey` (owner only). `Commit.verification` carries the result of the check (feature `commit_signatures`) |
1414 | `RunService` | `ListRuns`, `GetRun`, `GetJob`, `GetJobLog` (streamed, follow), `ListAnnotations`, `GetStepSummaries`, `CancelRun`, `RerunRun`, `DispatchWorkflow`, `ListWorkflows`, `DisableWorkflow`, `EnableWorkflow`, `ListChecks`, `ListRunners`, `RemoveRunner` |
@@ -6,9 +6,9 @@
6 | `GitService` | `ListRefs`, `GetTree`, `ListPaths`, `GetBlob` (streamed), `ListCommits`, `GetCommit` (structured diff), `ResolveRevision` |6 | `GitService` | `ListRefs`, `GetTree`, `ListPaths`, `GetBlob` (streamed), `ListCommits`, `GetCommit` (structured diff), `ResolveRevision` |
7 | `TokenService` | `CreateToken` (secret shown once), `ListTokens`, `RevokeToken` |7 | `TokenService` | `CreateToken` (secret shown once), `ListTokens`, `RevokeToken` |
8 | `MergeRequestService` | `CreateMergeRequest`, `ListMergeRequests`, `GetMergeRequest` (commits, diff, comments), `AddComment`, `EditComment`, `DeleteComment`, `ResolveComment`, `CloseMergeRequest`, `MarkReady`, `MergeMergeRequest` (modes fast-forward, squash, merge commit), `MarkRead`, `EnableAutoMerge`, `CancelAutoMerge` (merge by itself once a check passed on the head and all its runs are complete; setting `allow_auto_merge`, `MergeRequest.auto_merge`, events `MergeRequestAutoMergeEnabled` and `MergeRequestAutoMergeCancelled`, `MergeRequestMerged.auto`; feature `merge_requests.auto_merge`). Open merge requests carry `mergeability` (up to date, behind, conflict, or checking) and `Watch` publishes `MergeRequestMergeability` each time a result is settled for new branch tips (feature `merge_requests.mergeability`) |8 | `MergeRequestService` | `CreateMergeRequest`, `ListMergeRequests`, `GetMergeRequest` (commits, diff, comments), `AddComment`, `EditComment`, `DeleteComment`, `ResolveComment`, `CloseMergeRequest`, `MarkReady`, `MergeMergeRequest` (modes fast-forward, squash, merge commit), `MarkRead`, `EnableAutoMerge`, `CancelAutoMerge` (merge by itself once a check passed on the head and all its runs are complete; setting `allow_auto_merge`, `MergeRequest.auto_merge`, events `MergeRequestAutoMergeEnabled` and `MergeRequestAutoMergeCancelled`, `MergeRequestMerged.auto`; feature `merge_requests.auto_merge`). Open merge requests carry `mergeability` (up to date, behind, conflict, or checking) and `Watch` publishes `MergeRequestMergeability` each time a result is settled for new branch tips (feature `merge_requests.mergeability`) |
9-| `IssueService` | `CreateIssue`, `ListIssues`, `GetIssue` (comments, merge requests naming the issue, `closed_by_merge_request`), `AddIssueComment`, `CloseIssue`, `ReopenIssue`; owner only: `ListPendingIssues`, `ApproveIssue`, `RejectIssue`. Features `issues`, `issues.links`. Issues share numbers with merge requests |9+| `IssueService` | `CreateIssue`, `ListIssues`, `GetIssue` (comments, merge requests naming the issue, history events, `closed_by_merge_request`), `AddIssueComment`, `CloseIssue`, `ResolveIssue`, `ReopenIssue`; owner only: `ListPendingIssues`, `ApproveIssue`, `RejectIssue`. States `OPEN`, `CLOSED`, `RESOLVED`; `ResolveIssue` needs `issue:write`. Features `issues`, `issues.links`, `issues.resolve`. Issues share numbers with merge requests |
10 | `SessionService` | `CreateLoginLink`, `SignOutEverywhere` (owner only) |10 | `SessionService` | `CreateLoginLink`, `SignOutEverywhere` (owner only) |
11-| `EventService` | `Watch` (streamed, resumable). Topics `home`, `repo:<name>` and `owner` (owner rights only). Events 17–21: `issue_opened`, `issue_closed`, `issue_reopened`, `issue_commented`, and `issue_submitted` (only on `owner`, no content). Event 22: `merge_request_mergeability` |11+| `EventService` | `Watch` (streamed, resumable). Topics `home`, `repo:<name>` and `owner` (owner rights only). Events 17–21: `issue_opened`, `issue_closed`, `issue_reopened`, `issue_commented`, and `issue_submitted` (only on `owner`, no content). Event 22: `merge_request_mergeability`. Event 31: `issue_resolved` |
12 | `ServerService` | `GetVersion` (version and features), `GetSigningKey`, `RotateOIDCKey` (owner only) |12 | `ServerService` | `GetVersion` (version and features), `GetSigningKey`, `RotateOIDCKey` (owner only) |
13 | `TrustedKeyService` | `ListTrustedKeys`, `AddTrustedKey` and `RemoveTrustedKey` (owner only). `Commit.verification` carries the result of the check (feature `commit_signatures`) |13 | `TrustedKeyService` | `ListTrustedKeys`, `AddTrustedKey` and `RemoveTrustedKey` (owner only). `Commit.verification` carries the result of the check (feature `commit_signatures`) |
14 | `RunService` | `ListRuns`, `GetRun`, `GetJob`, `GetJobLog` (streamed, follow), `ListAnnotations`, `GetStepSummaries`, `CancelRun`, `RerunRun`, `DispatchWorkflow`, `ListWorkflows`, `DisableWorkflow`, `EnableWorkflow`, `ListChecks`, `ListRunners`, `RemoveRunner` |14 | `RunService` | `ListRuns`, `GetRun`, `GetJob`, `GetJobLog` (streamed, follow), `ListAnnotations`, `GetStepSummaries`, `CancelRun`, `RerunRun`, `DispatchWorkflow`, `ListWorkflows`, `DisableWorkflow`, `EnableWorkflow`, `ListChecks`, `ListRunners`, `RemoveRunner` |
M gen/ermite/ermiteconnect/event.connect.go +8 -6
@@ -49,9 +49,10 @@ type EventServiceClient interface {
4949 // for merge requests, merge_request_opened, merge_request_merged,
5050 // merge_request_closed, comment_added, comment_edited, comment_deleted and
5151 // comment_resolved (a thread resolved or reopened); for issues, issue_opened,
52- // issue_closed, issue_reopened and issue_commented, and issue_submitted. Each
53- // one is delivered on the "repo:<name>" topic of its repository and on
54- // "home", subject to the visibility of the repository, except
52+ // issue_closed, issue_resolved, issue_reopened and issue_commented, and
53+ // issue_submitted. Each one is delivered on the "repo:<name>" topic of its
54+ // repository and on "home", subject to the visibility of the repository,
55+ // except
5556 // issue_submitted: it is delivered only on the "owner" topic, never on
5657 // "home" or "repo:<name>", and carries no content (see IssueSubmitted).
5758 //
@@ -125,9 +126,10 @@ type EventServiceHandler interface {
125126 // for merge requests, merge_request_opened, merge_request_merged,
126127 // merge_request_closed, comment_added, comment_edited, comment_deleted and
127128 // comment_resolved (a thread resolved or reopened); for issues, issue_opened,
128- // issue_closed, issue_reopened and issue_commented, and issue_submitted. Each
129- // one is delivered on the "repo:<name>" topic of its repository and on
130- // "home", subject to the visibility of the repository, except
129+ // issue_closed, issue_resolved, issue_reopened and issue_commented, and
130+ // issue_submitted. Each one is delivered on the "repo:<name>" topic of its
131+ // repository and on "home", subject to the visibility of the repository,
132+ // except
131133 // issue_submitted: it is delivered only on the "owner" topic, never on
132134 // "home" or "repo:<name>", and carries no content (see IssueSubmitted).
133135 //
@@ -49,9 +49,10 @@ type EventServiceClient interface {
49 // for merge requests, merge_request_opened, merge_request_merged,49 // for merge requests, merge_request_opened, merge_request_merged,
50 // merge_request_closed, comment_added, comment_edited, comment_deleted and50 // merge_request_closed, comment_added, comment_edited, comment_deleted and
51 // comment_resolved (a thread resolved or reopened); for issues, issue_opened,51 // comment_resolved (a thread resolved or reopened); for issues, issue_opened,
52- // issue_closed, issue_reopened and issue_commented, and issue_submitted. Each52+ // issue_closed, issue_resolved, issue_reopened and issue_commented, and
53- // one is delivered on the "repo:<name>" topic of its repository and on53+ // issue_submitted. Each one is delivered on the "repo:<name>" topic of its
54- // "home", subject to the visibility of the repository, except54+ // repository and on "home", subject to the visibility of the repository,
55+ // except
55 // issue_submitted: it is delivered only on the "owner" topic, never on56 // issue_submitted: it is delivered only on the "owner" topic, never on
56 // "home" or "repo:<name>", and carries no content (see IssueSubmitted).57 // "home" or "repo:<name>", and carries no content (see IssueSubmitted).
57 //58 //
@@ -125,9 +126,10 @@ type EventServiceHandler interface {
125 // for merge requests, merge_request_opened, merge_request_merged,126 // for merge requests, merge_request_opened, merge_request_merged,
126 // merge_request_closed, comment_added, comment_edited, comment_deleted and127 // merge_request_closed, comment_added, comment_edited, comment_deleted and
127 // comment_resolved (a thread resolved or reopened); for issues, issue_opened,128 // comment_resolved (a thread resolved or reopened); for issues, issue_opened,
128- // issue_closed, issue_reopened and issue_commented, and issue_submitted. Each129+ // issue_closed, issue_resolved, issue_reopened and issue_commented, and
129- // one is delivered on the "repo:<name>" topic of its repository and on130+ // issue_submitted. Each one is delivered on the "repo:<name>" topic of its
130- // "home", subject to the visibility of the repository, except131+ // repository and on "home", subject to the visibility of the repository,
132+ // except
131 // issue_submitted: it is delivered only on the "owner" topic, never on133 // issue_submitted: it is delivered only on the "owner" topic, never on
132 // "home" or "repo:<name>", and carries no content (see IssueSubmitted).134 // "home" or "repo:<name>", and carries no content (see IssueSubmitted).
133 //135 //
M gen/ermite/ermiteconnect/issue.connect.go +35 -2
@@ -47,6 +47,9 @@ const (
4747 IssueServiceAddIssueCommentProcedure = "/ermite.IssueService/AddIssueComment"
4848 // IssueServiceCloseIssueProcedure is the fully-qualified name of the IssueService's CloseIssue RPC.
4949 IssueServiceCloseIssueProcedure = "/ermite.IssueService/CloseIssue"
50+ // IssueServiceResolveIssueProcedure is the fully-qualified name of the IssueService's ResolveIssue
51+ // RPC.
52+ IssueServiceResolveIssueProcedure = "/ermite.IssueService/ResolveIssue"
5053 // IssueServiceReopenIssueProcedure is the fully-qualified name of the IssueService's ReopenIssue
5154 // RPC.
5255 IssueServiceReopenIssueProcedure = "/ermite.IssueService/ReopenIssue"
@@ -73,7 +76,10 @@ type IssueServiceClient interface {
7376 AddIssueComment(context.Context, *connect.Request[ermite.AddIssueCommentRequest]) (*connect.Response[ermite.AddIssueCommentResponse], error)
7477 // CloseIssue closes an issue. Needs the issue:write scope.
7578 CloseIssue(context.Context, *connect.Request[ermite.CloseIssueRequest]) (*connect.Response[ermite.CloseIssueResponse], error)
76- // ReopenIssue reopens an issue. Needs the issue:write scope.
79+ // ResolveIssue marks an open issue as resolved. Needs the issue:write scope.
80+ ResolveIssue(context.Context, *connect.Request[ermite.ResolveIssueRequest]) (*connect.Response[ermite.ResolveIssueResponse], error)
81+ // ReopenIssue reopens a closed or resolved issue. Needs the issue:write
82+ // scope.
7783 ReopenIssue(context.Context, *connect.Request[ermite.ReopenIssueRequest]) (*connect.Response[ermite.ReopenIssueResponse], error)
7884 // ListPendingIssues lists issues awaiting moderation, oldest first. Owner
7985 // rights only; anyone else gets NOT_FOUND.
@@ -127,6 +133,12 @@ func NewIssueServiceClient(httpClient connect.HTTPClient, baseURL string, opts .
127133 connect.WithSchema(issueServiceMethods.ByName("CloseIssue")),
128134 connect.WithClientOptions(opts...),
129135 ),
136+ resolveIssue: connect.NewClient[ermite.ResolveIssueRequest, ermite.ResolveIssueResponse](
137+ httpClient,
138+ baseURL+IssueServiceResolveIssueProcedure,
139+ connect.WithSchema(issueServiceMethods.ByName("ResolveIssue")),
140+ connect.WithClientOptions(opts...),
141+ ),
130142 reopenIssue: connect.NewClient[ermite.ReopenIssueRequest, ermite.ReopenIssueResponse](
131143 httpClient,
132144 baseURL+IssueServiceReopenIssueProcedure,
@@ -161,6 +173,7 @@ type issueServiceClient struct {
161173 getIssue *connect.Client[ermite.GetIssueRequest, ermite.GetIssueResponse]
162174 addIssueComment *connect.Client[ermite.AddIssueCommentRequest, ermite.AddIssueCommentResponse]
163175 closeIssue *connect.Client[ermite.CloseIssueRequest, ermite.CloseIssueResponse]
176+ resolveIssue *connect.Client[ermite.ResolveIssueRequest, ermite.ResolveIssueResponse]
164177 reopenIssue *connect.Client[ermite.ReopenIssueRequest, ermite.ReopenIssueResponse]
165178 listPendingIssues *connect.Client[ermite.ListPendingIssuesRequest, ermite.ListPendingIssuesResponse]
166179 approveIssue *connect.Client[ermite.ApproveIssueRequest, ermite.ApproveIssueResponse]
@@ -192,6 +205,11 @@ func (c *issueServiceClient) CloseIssue(ctx context.Context, req *connect.Reques
192205 return c.closeIssue.CallUnary(ctx, req)
193206 }
194207
208+// ResolveIssue calls ermite.IssueService.ResolveIssue.
209+func (c *issueServiceClient) ResolveIssue(ctx context.Context, req *connect.Request[ermite.ResolveIssueRequest]) (*connect.Response[ermite.ResolveIssueResponse], error) {
210+ return c.resolveIssue.CallUnary(ctx, req)
211+}
212+
195213 // ReopenIssue calls ermite.IssueService.ReopenIssue.
196214 func (c *issueServiceClient) ReopenIssue(ctx context.Context, req *connect.Request[ermite.ReopenIssueRequest]) (*connect.Response[ermite.ReopenIssueResponse], error) {
197215 return c.reopenIssue.CallUnary(ctx, req)
@@ -224,7 +242,10 @@ type IssueServiceHandler interface {
224242 AddIssueComment(context.Context, *connect.Request[ermite.AddIssueCommentRequest]) (*connect.Response[ermite.AddIssueCommentResponse], error)
225243 // CloseIssue closes an issue. Needs the issue:write scope.
226244 CloseIssue(context.Context, *connect.Request[ermite.CloseIssueRequest]) (*connect.Response[ermite.CloseIssueResponse], error)
227- // ReopenIssue reopens an issue. Needs the issue:write scope.
245+ // ResolveIssue marks an open issue as resolved. Needs the issue:write scope.
246+ ResolveIssue(context.Context, *connect.Request[ermite.ResolveIssueRequest]) (*connect.Response[ermite.ResolveIssueResponse], error)
247+ // ReopenIssue reopens a closed or resolved issue. Needs the issue:write
248+ // scope.
228249 ReopenIssue(context.Context, *connect.Request[ermite.ReopenIssueRequest]) (*connect.Response[ermite.ReopenIssueResponse], error)
229250 // ListPendingIssues lists issues awaiting moderation, oldest first. Owner
230251 // rights only; anyone else gets NOT_FOUND.
@@ -274,6 +295,12 @@ func NewIssueServiceHandler(svc IssueServiceHandler, opts ...connect.HandlerOpti
274295 connect.WithSchema(issueServiceMethods.ByName("CloseIssue")),
275296 connect.WithHandlerOptions(opts...),
276297 )
298+ issueServiceResolveIssueHandler := connect.NewUnaryHandler(
299+ IssueServiceResolveIssueProcedure,
300+ svc.ResolveIssue,
301+ connect.WithSchema(issueServiceMethods.ByName("ResolveIssue")),
302+ connect.WithHandlerOptions(opts...),
303+ )
277304 issueServiceReopenIssueHandler := connect.NewUnaryHandler(
278305 IssueServiceReopenIssueProcedure,
279306 svc.ReopenIssue,
@@ -310,6 +337,8 @@ func NewIssueServiceHandler(svc IssueServiceHandler, opts ...connect.HandlerOpti
310337 issueServiceAddIssueCommentHandler.ServeHTTP(w, r)
311338 case IssueServiceCloseIssueProcedure:
312339 issueServiceCloseIssueHandler.ServeHTTP(w, r)
340+ case IssueServiceResolveIssueProcedure:
341+ issueServiceResolveIssueHandler.ServeHTTP(w, r)
313342 case IssueServiceReopenIssueProcedure:
314343 issueServiceReopenIssueHandler.ServeHTTP(w, r)
315344 case IssueServiceListPendingIssuesProcedure:
@@ -347,6 +376,10 @@ func (UnimplementedIssueServiceHandler) CloseIssue(context.Context, *connect.Req
347376 return nil, connect.NewError(connect.CodeUnimplemented, errors.New("ermite.IssueService.CloseIssue is not implemented"))
348377 }
349378
379+func (UnimplementedIssueServiceHandler) ResolveIssue(context.Context, *connect.Request[ermite.ResolveIssueRequest]) (*connect.Response[ermite.ResolveIssueResponse], error) {
380+ return nil, connect.NewError(connect.CodeUnimplemented, errors.New("ermite.IssueService.ResolveIssue is not implemented"))
381+}
382+
350383 func (UnimplementedIssueServiceHandler) ReopenIssue(context.Context, *connect.Request[ermite.ReopenIssueRequest]) (*connect.Response[ermite.ReopenIssueResponse], error) {
351384 return nil, connect.NewError(connect.CodeUnimplemented, errors.New("ermite.IssueService.ReopenIssue is not implemented"))
352385 }
@@ -47,6 +47,9 @@ const (
47 IssueServiceAddIssueCommentProcedure = "/ermite.IssueService/AddIssueComment"47 IssueServiceAddIssueCommentProcedure = "/ermite.IssueService/AddIssueComment"
48 // IssueServiceCloseIssueProcedure is the fully-qualified name of the IssueService's CloseIssue RPC.48 // IssueServiceCloseIssueProcedure is the fully-qualified name of the IssueService's CloseIssue RPC.
49 IssueServiceCloseIssueProcedure = "/ermite.IssueService/CloseIssue"49 IssueServiceCloseIssueProcedure = "/ermite.IssueService/CloseIssue"
50+ // IssueServiceResolveIssueProcedure is the fully-qualified name of the IssueService's ResolveIssue
51+ // RPC.
52+ IssueServiceResolveIssueProcedure = "/ermite.IssueService/ResolveIssue"
50 // IssueServiceReopenIssueProcedure is the fully-qualified name of the IssueService's ReopenIssue53 // IssueServiceReopenIssueProcedure is the fully-qualified name of the IssueService's ReopenIssue
51 // RPC.54 // RPC.
52 IssueServiceReopenIssueProcedure = "/ermite.IssueService/ReopenIssue"55 IssueServiceReopenIssueProcedure = "/ermite.IssueService/ReopenIssue"
@@ -73,7 +76,10 @@ type IssueServiceClient interface {
73 AddIssueComment(context.Context, *connect.Request[ermite.AddIssueCommentRequest]) (*connect.Response[ermite.AddIssueCommentResponse], error)76 AddIssueComment(context.Context, *connect.Request[ermite.AddIssueCommentRequest]) (*connect.Response[ermite.AddIssueCommentResponse], error)
74 // CloseIssue closes an issue. Needs the issue:write scope.77 // CloseIssue closes an issue. Needs the issue:write scope.
75 CloseIssue(context.Context, *connect.Request[ermite.CloseIssueRequest]) (*connect.Response[ermite.CloseIssueResponse], error)78 CloseIssue(context.Context, *connect.Request[ermite.CloseIssueRequest]) (*connect.Response[ermite.CloseIssueResponse], error)
76- // ReopenIssue reopens an issue. Needs the issue:write scope.79+ // ResolveIssue marks an open issue as resolved. Needs the issue:write scope.
80+ ResolveIssue(context.Context, *connect.Request[ermite.ResolveIssueRequest]) (*connect.Response[ermite.ResolveIssueResponse], error)
81+ // ReopenIssue reopens a closed or resolved issue. Needs the issue:write
82+ // scope.
77 ReopenIssue(context.Context, *connect.Request[ermite.ReopenIssueRequest]) (*connect.Response[ermite.ReopenIssueResponse], error)83 ReopenIssue(context.Context, *connect.Request[ermite.ReopenIssueRequest]) (*connect.Response[ermite.ReopenIssueResponse], error)
78 // ListPendingIssues lists issues awaiting moderation, oldest first. Owner84 // ListPendingIssues lists issues awaiting moderation, oldest first. Owner
79 // rights only; anyone else gets NOT_FOUND.85 // rights only; anyone else gets NOT_FOUND.
@@ -127,6 +133,12 @@ func NewIssueServiceClient(httpClient connect.HTTPClient, baseURL string, opts .
127 connect.WithSchema(issueServiceMethods.ByName("CloseIssue")),133 connect.WithSchema(issueServiceMethods.ByName("CloseIssue")),
128 connect.WithClientOptions(opts...),134 connect.WithClientOptions(opts...),
129 ),135 ),
136+ resolveIssue: connect.NewClient[ermite.ResolveIssueRequest, ermite.ResolveIssueResponse](
137+ httpClient,
138+ baseURL+IssueServiceResolveIssueProcedure,
139+ connect.WithSchema(issueServiceMethods.ByName("ResolveIssue")),
140+ connect.WithClientOptions(opts...),
141+ ),
130 reopenIssue: connect.NewClient[ermite.ReopenIssueRequest, ermite.ReopenIssueResponse](142 reopenIssue: connect.NewClient[ermite.ReopenIssueRequest, ermite.ReopenIssueResponse](
131 httpClient,143 httpClient,
132 baseURL+IssueServiceReopenIssueProcedure,144 baseURL+IssueServiceReopenIssueProcedure,
@@ -161,6 +173,7 @@ type issueServiceClient struct {
161 getIssue *connect.Client[ermite.GetIssueRequest, ermite.GetIssueResponse]173 getIssue *connect.Client[ermite.GetIssueRequest, ermite.GetIssueResponse]
162 addIssueComment *connect.Client[ermite.AddIssueCommentRequest, ermite.AddIssueCommentResponse]174 addIssueComment *connect.Client[ermite.AddIssueCommentRequest, ermite.AddIssueCommentResponse]
163 closeIssue *connect.Client[ermite.CloseIssueRequest, ermite.CloseIssueResponse]175 closeIssue *connect.Client[ermite.CloseIssueRequest, ermite.CloseIssueResponse]
176+ resolveIssue *connect.Client[ermite.ResolveIssueRequest, ermite.ResolveIssueResponse]
164 reopenIssue *connect.Client[ermite.ReopenIssueRequest, ermite.ReopenIssueResponse]177 reopenIssue *connect.Client[ermite.ReopenIssueRequest, ermite.ReopenIssueResponse]
165 listPendingIssues *connect.Client[ermite.ListPendingIssuesRequest, ermite.ListPendingIssuesResponse]178 listPendingIssues *connect.Client[ermite.ListPendingIssuesRequest, ermite.ListPendingIssuesResponse]
166 approveIssue *connect.Client[ermite.ApproveIssueRequest, ermite.ApproveIssueResponse]179 approveIssue *connect.Client[ermite.ApproveIssueRequest, ermite.ApproveIssueResponse]
@@ -192,6 +205,11 @@ func (c *issueServiceClient) CloseIssue(ctx context.Context, req *connect.Reques
192 return c.closeIssue.CallUnary(ctx, req)205 return c.closeIssue.CallUnary(ctx, req)
193 }206 }
194 207
208+// ResolveIssue calls ermite.IssueService.ResolveIssue.
209+func (c *issueServiceClient) ResolveIssue(ctx context.Context, req *connect.Request[ermite.ResolveIssueRequest]) (*connect.Response[ermite.ResolveIssueResponse], error) {
210+ return c.resolveIssue.CallUnary(ctx, req)
211+}
212+
195 // ReopenIssue calls ermite.IssueService.ReopenIssue.213 // ReopenIssue calls ermite.IssueService.ReopenIssue.
196 func (c *issueServiceClient) ReopenIssue(ctx context.Context, req *connect.Request[ermite.ReopenIssueRequest]) (*connect.Response[ermite.ReopenIssueResponse], error) {214 func (c *issueServiceClient) ReopenIssue(ctx context.Context, req *connect.Request[ermite.ReopenIssueRequest]) (*connect.Response[ermite.ReopenIssueResponse], error) {
197 return c.reopenIssue.CallUnary(ctx, req)215 return c.reopenIssue.CallUnary(ctx, req)
@@ -224,7 +242,10 @@ type IssueServiceHandler interface {
224 AddIssueComment(context.Context, *connect.Request[ermite.AddIssueCommentRequest]) (*connect.Response[ermite.AddIssueCommentResponse], error)242 AddIssueComment(context.Context, *connect.Request[ermite.AddIssueCommentRequest]) (*connect.Response[ermite.AddIssueCommentResponse], error)
225 // CloseIssue closes an issue. Needs the issue:write scope.243 // CloseIssue closes an issue. Needs the issue:write scope.
226 CloseIssue(context.Context, *connect.Request[ermite.CloseIssueRequest]) (*connect.Response[ermite.CloseIssueResponse], error)244 CloseIssue(context.Context, *connect.Request[ermite.CloseIssueRequest]) (*connect.Response[ermite.CloseIssueResponse], error)
227- // ReopenIssue reopens an issue. Needs the issue:write scope.245+ // ResolveIssue marks an open issue as resolved. Needs the issue:write scope.
246+ ResolveIssue(context.Context, *connect.Request[ermite.ResolveIssueRequest]) (*connect.Response[ermite.ResolveIssueResponse], error)
247+ // ReopenIssue reopens a closed or resolved issue. Needs the issue:write
248+ // scope.
228 ReopenIssue(context.Context, *connect.Request[ermite.ReopenIssueRequest]) (*connect.Response[ermite.ReopenIssueResponse], error)249 ReopenIssue(context.Context, *connect.Request[ermite.ReopenIssueRequest]) (*connect.Response[ermite.ReopenIssueResponse], error)
229 // ListPendingIssues lists issues awaiting moderation, oldest first. Owner250 // ListPendingIssues lists issues awaiting moderation, oldest first. Owner
230 // rights only; anyone else gets NOT_FOUND.251 // rights only; anyone else gets NOT_FOUND.
@@ -274,6 +295,12 @@ func NewIssueServiceHandler(svc IssueServiceHandler, opts ...connect.HandlerOpti
274 connect.WithSchema(issueServiceMethods.ByName("CloseIssue")),295 connect.WithSchema(issueServiceMethods.ByName("CloseIssue")),
275 connect.WithHandlerOptions(opts...),296 connect.WithHandlerOptions(opts...),
276 )297 )
298+ issueServiceResolveIssueHandler := connect.NewUnaryHandler(
299+ IssueServiceResolveIssueProcedure,
300+ svc.ResolveIssue,
301+ connect.WithSchema(issueServiceMethods.ByName("ResolveIssue")),
302+ connect.WithHandlerOptions(opts...),
303+ )
277 issueServiceReopenIssueHandler := connect.NewUnaryHandler(304 issueServiceReopenIssueHandler := connect.NewUnaryHandler(
278 IssueServiceReopenIssueProcedure,305 IssueServiceReopenIssueProcedure,
279 svc.ReopenIssue,306 svc.ReopenIssue,
@@ -310,6 +337,8 @@ func NewIssueServiceHandler(svc IssueServiceHandler, opts ...connect.HandlerOpti
310 issueServiceAddIssueCommentHandler.ServeHTTP(w, r)337 issueServiceAddIssueCommentHandler.ServeHTTP(w, r)
311 case IssueServiceCloseIssueProcedure:338 case IssueServiceCloseIssueProcedure:
312 issueServiceCloseIssueHandler.ServeHTTP(w, r)339 issueServiceCloseIssueHandler.ServeHTTP(w, r)
340+ case IssueServiceResolveIssueProcedure:
341+ issueServiceResolveIssueHandler.ServeHTTP(w, r)
313 case IssueServiceReopenIssueProcedure:342 case IssueServiceReopenIssueProcedure:
314 issueServiceReopenIssueHandler.ServeHTTP(w, r)343 issueServiceReopenIssueHandler.ServeHTTP(w, r)
315 case IssueServiceListPendingIssuesProcedure:344 case IssueServiceListPendingIssuesProcedure:
@@ -347,6 +376,10 @@ func (UnimplementedIssueServiceHandler) CloseIssue(context.Context, *connect.Req
347 return nil, connect.NewError(connect.CodeUnimplemented, errors.New("ermite.IssueService.CloseIssue is not implemented"))376 return nil, connect.NewError(connect.CodeUnimplemented, errors.New("ermite.IssueService.CloseIssue is not implemented"))
348 }377 }
349 378
379+func (UnimplementedIssueServiceHandler) ResolveIssue(context.Context, *connect.Request[ermite.ResolveIssueRequest]) (*connect.Response[ermite.ResolveIssueResponse], error) {
380+ return nil, connect.NewError(connect.CodeUnimplemented, errors.New("ermite.IssueService.ResolveIssue is not implemented"))
381+}
382+
350 func (UnimplementedIssueServiceHandler) ReopenIssue(context.Context, *connect.Request[ermite.ReopenIssueRequest]) (*connect.Response[ermite.ReopenIssueResponse], error) {383 func (UnimplementedIssueServiceHandler) ReopenIssue(context.Context, *connect.Request[ermite.ReopenIssueRequest]) (*connect.Response[ermite.ReopenIssueResponse], error) {
351 return nil, connect.NewError(connect.CodeUnimplemented, errors.New("ermite.IssueService.ReopenIssue is not implemented"))384 return nil, connect.NewError(connect.CodeUnimplemented, errors.New("ermite.IssueService.ReopenIssue is not implemented"))
352 }385 }
M gen/ermite/event.pb.go +175 -103
@@ -179,6 +179,7 @@ type Event struct {
179179 // *Event_ReleaseUpdated
180180 // *Event_ReleaseDeleted
181181 // *Event_ReleaseUnpublished
182+ // *Event_IssueResolved
182183 Kind isEvent_Kind `protobuf_oneof:"kind"`
183184 unknownFields protoimpl.UnknownFields
184185 sizeCache protoimpl.SizeCache
@@ -487,6 +488,15 @@ func (x *Event) GetReleaseUnpublished() *ReleaseUnpublished {
487488 return nil
488489 }
489490
491+func (x *Event) GetIssueResolved() *IssueResolved {
492+ if x != nil {
493+ if x, ok := x.Kind.(*Event_IssueResolved); ok {
494+ return x.IssueResolved
495+ }
496+ }
497+ return nil
498+}
499+
490500 type isEvent_Kind interface {
491501 isEvent_Kind()
492502 }
@@ -634,6 +644,11 @@ type Event_ReleaseUnpublished struct {
634644 ReleaseUnpublished *ReleaseUnpublished `protobuf:"bytes,30,opt,name=release_unpublished,json=releaseUnpublished,proto3,oneof"`
635645 }
636646
647+type Event_IssueResolved struct {
648+ // IssueResolved: an issue was resolved.
649+ IssueResolved *IssueResolved `protobuf:"bytes,31,opt,name=issue_resolved,json=issueResolved,proto3,oneof"`
650+}
651+
637652 func (*Event_RepoCreated) isEvent_Kind() {}
638653
639654 func (*Event_RepoUpdated) isEvent_Kind() {}
@@ -690,6 +705,8 @@ func (*Event_ReleaseDeleted) isEvent_Kind() {}
690705
691706 func (*Event_ReleaseUnpublished) isEvent_Kind() {}
692707
708+func (*Event_IssueResolved) isEvent_Kind() {}
709+
693710 // RepoCreated reports a new repository.
694711 type RepoCreated struct {
695712 state protoimpl.MessageState `protogen:"open.v1"`
@@ -1569,7 +1586,8 @@ func (x *IssueOpened) GetIssue() *Issue {
15691586 return nil
15701587 }
15711588
1572-// IssueClosed reports a closed issue.
1589+// IssueClosed reports a closed issue. A merge that resolves an issue sends
1590+// issue_resolved, not issue_closed.
15731591 type IssueClosed struct {
15741592 state protoimpl.MessageState `protogen:"open.v1"`
15751593 // Issue is the issue after closing, including its repository and number.
@@ -1615,6 +1633,53 @@ func (x *IssueClosed) GetIssue() *Issue {
16151633 return nil
16161634 }
16171635
1636+// IssueResolved reports a resolved issue.
1637+type IssueResolved struct {
1638+ state protoimpl.MessageState `protogen:"open.v1"`
1639+ // Issue is the issue after resolving, including its repository, number and
1640+ // closed_by_merge_request.
1641+ Issue *Issue `protobuf:"bytes,1,opt,name=issue,proto3" json:"issue,omitempty"`
1642+ unknownFields protoimpl.UnknownFields
1643+ sizeCache protoimpl.SizeCache
1644+}
1645+
1646+func (x *IssueResolved) Reset() {
1647+ *x = IssueResolved{}
1648+ mi := &file_ermite_event_proto_msgTypes[20]
1649+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
1650+ ms.StoreMessageInfo(mi)
1651+}
1652+
1653+func (x *IssueResolved) String() string {
1654+ return protoimpl.X.MessageStringOf(x)
1655+}
1656+
1657+func (*IssueResolved) ProtoMessage() {}
1658+
1659+func (x *IssueResolved) ProtoReflect() protoreflect.Message {
1660+ mi := &file_ermite_event_proto_msgTypes[20]
1661+ if x != nil {
1662+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
1663+ if ms.LoadMessageInfo() == nil {
1664+ ms.StoreMessageInfo(mi)
1665+ }
1666+ return ms
1667+ }
1668+ return mi.MessageOf(x)
1669+}
1670+
1671+// Deprecated: Use IssueResolved.ProtoReflect.Descriptor instead.
1672+func (*IssueResolved) Descriptor() ([]byte, []int) {
1673+ return file_ermite_event_proto_rawDescGZIP(), []int{20}
1674+}
1675+
1676+func (x *IssueResolved) GetIssue() *Issue {
1677+ if x != nil {
1678+ return x.Issue
1679+ }
1680+ return nil
1681+}
1682+
16181683 // IssueReopened reports a reopened issue.
16191684 type IssueReopened struct {
16201685 state protoimpl.MessageState `protogen:"open.v1"`
@@ -1626,7 +1691,7 @@ type IssueReopened struct {
16261691
16271692 func (x *IssueReopened) Reset() {
16281693 *x = IssueReopened{}
1629- mi := &file_ermite_event_proto_msgTypes[20]
1694+ mi := &file_ermite_event_proto_msgTypes[21]
16301695 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
16311696 ms.StoreMessageInfo(mi)
16321697 }
@@ -1638,7 +1703,7 @@ func (x *IssueReopened) String() string {
16381703 func (*IssueReopened) ProtoMessage() {}
16391704
16401705 func (x *IssueReopened) ProtoReflect() protoreflect.Message {
1641- mi := &file_ermite_event_proto_msgTypes[20]
1706+ mi := &file_ermite_event_proto_msgTypes[21]
16421707 if x != nil {
16431708 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
16441709 if ms.LoadMessageInfo() == nil {
@@ -1651,7 +1716,7 @@ func (x *IssueReopened) ProtoReflect() protoreflect.Message {
16511716
16521717 // Deprecated: Use IssueReopened.ProtoReflect.Descriptor instead.
16531718 func (*IssueReopened) Descriptor() ([]byte, []int) {
1654- return file_ermite_event_proto_rawDescGZIP(), []int{20}
1719+ return file_ermite_event_proto_rawDescGZIP(), []int{21}
16551720 }
16561721
16571722 func (x *IssueReopened) GetIssue() *Issue {
@@ -1676,7 +1741,7 @@ type IssueCommented struct {
16761741
16771742 func (x *IssueCommented) Reset() {
16781743 *x = IssueCommented{}
1679- mi := &file_ermite_event_proto_msgTypes[21]
1744+ mi := &file_ermite_event_proto_msgTypes[22]
16801745 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
16811746 ms.StoreMessageInfo(mi)
16821747 }
@@ -1688,7 +1753,7 @@ func (x *IssueCommented) String() string {
16881753 func (*IssueCommented) ProtoMessage() {}
16891754
16901755 func (x *IssueCommented) ProtoReflect() protoreflect.Message {
1691- mi := &file_ermite_event_proto_msgTypes[21]
1756+ mi := &file_ermite_event_proto_msgTypes[22]
16921757 if x != nil {
16931758 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
16941759 if ms.LoadMessageInfo() == nil {
@@ -1701,7 +1766,7 @@ func (x *IssueCommented) ProtoReflect() protoreflect.Message {
17011766
17021767 // Deprecated: Use IssueCommented.ProtoReflect.Descriptor instead.
17031768 func (*IssueCommented) Descriptor() ([]byte, []int) {
1704- return file_ermite_event_proto_rawDescGZIP(), []int{21}
1769+ return file_ermite_event_proto_rawDescGZIP(), []int{22}
17051770 }
17061771
17071772 func (x *IssueCommented) GetRepo() string {
@@ -1740,7 +1805,7 @@ type IssueSubmitted struct {
17401805
17411806 func (x *IssueSubmitted) Reset() {
17421807 *x = IssueSubmitted{}
1743- mi := &file_ermite_event_proto_msgTypes[22]
1808+ mi := &file_ermite_event_proto_msgTypes[23]
17441809 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
17451810 ms.StoreMessageInfo(mi)
17461811 }
@@ -1752,7 +1817,7 @@ func (x *IssueSubmitted) String() string {
17521817 func (*IssueSubmitted) ProtoMessage() {}
17531818
17541819 func (x *IssueSubmitted) ProtoReflect() protoreflect.Message {
1755- mi := &file_ermite_event_proto_msgTypes[22]
1820+ mi := &file_ermite_event_proto_msgTypes[23]
17561821 if x != nil {
17571822 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
17581823 if ms.LoadMessageInfo() == nil {
@@ -1765,7 +1830,7 @@ func (x *IssueSubmitted) ProtoReflect() protoreflect.Message {
17651830
17661831 // Deprecated: Use IssueSubmitted.ProtoReflect.Descriptor instead.
17671832 func (*IssueSubmitted) Descriptor() ([]byte, []int) {
1768- return file_ermite_event_proto_rawDescGZIP(), []int{22}
1833+ return file_ermite_event_proto_rawDescGZIP(), []int{23}
17691834 }
17701835
17711836 func (x *IssueSubmitted) GetRepo() string {
@@ -1795,7 +1860,7 @@ type Gap struct {
17951860
17961861 func (x *Gap) Reset() {
17971862 *x = Gap{}
1798- mi := &file_ermite_event_proto_msgTypes[23]
1863+ mi := &file_ermite_event_proto_msgTypes[24]
17991864 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
18001865 ms.StoreMessageInfo(mi)
18011866 }
@@ -1807,7 +1872,7 @@ func (x *Gap) String() string {
18071872 func (*Gap) ProtoMessage() {}
18081873
18091874 func (x *Gap) ProtoReflect() protoreflect.Message {
1810- mi := &file_ermite_event_proto_msgTypes[23]
1875+ mi := &file_ermite_event_proto_msgTypes[24]
18111876 if x != nil {
18121877 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
18131878 if ms.LoadMessageInfo() == nil {
@@ -1820,7 +1885,7 @@ func (x *Gap) ProtoReflect() protoreflect.Message {
18201885
18211886 // Deprecated: Use Gap.ProtoReflect.Descriptor instead.
18221887 func (*Gap) Descriptor() ([]byte, []int) {
1823- return file_ermite_event_proto_rawDescGZIP(), []int{23}
1888+ return file_ermite_event_proto_rawDescGZIP(), []int{24}
18241889 }
18251890
18261891 // RunUpdated reports a CI run that was created or whose status, conclusion or
@@ -1835,7 +1900,7 @@ type RunUpdated struct {
18351900
18361901 func (x *RunUpdated) Reset() {
18371902 *x = RunUpdated{}
1838- mi := &file_ermite_event_proto_msgTypes[24]
1903+ mi := &file_ermite_event_proto_msgTypes[25]
18391904 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
18401905 ms.StoreMessageInfo(mi)
18411906 }
@@ -1847,7 +1912,7 @@ func (x *RunUpdated) String() string {
18471912 func (*RunUpdated) ProtoMessage() {}
18481913
18491914 func (x *RunUpdated) ProtoReflect() protoreflect.Message {
1850- mi := &file_ermite_event_proto_msgTypes[24]
1915+ mi := &file_ermite_event_proto_msgTypes[25]
18511916 if x != nil {
18521917 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
18531918 if ms.LoadMessageInfo() == nil {
@@ -1860,7 +1925,7 @@ func (x *RunUpdated) ProtoReflect() protoreflect.Message {
18601925
18611926 // Deprecated: Use RunUpdated.ProtoReflect.Descriptor instead.
18621927 func (*RunUpdated) Descriptor() ([]byte, []int) {
1863- return file_ermite_event_proto_rawDescGZIP(), []int{24}
1928+ return file_ermite_event_proto_rawDescGZIP(), []int{25}
18641929 }
18651930
18661931 func (x *RunUpdated) GetRun() *Run {
@@ -1882,7 +1947,7 @@ type JobUpdated struct {
18821947
18831948 func (x *JobUpdated) Reset() {
18841949 *x = JobUpdated{}
1885- mi := &file_ermite_event_proto_msgTypes[25]
1950+ mi := &file_ermite_event_proto_msgTypes[26]
18861951 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
18871952 ms.StoreMessageInfo(mi)
18881953 }
@@ -1894,7 +1959,7 @@ func (x *JobUpdated) String() string {
18941959 func (*JobUpdated) ProtoMessage() {}
18951960
18961961 func (x *JobUpdated) ProtoReflect() protoreflect.Message {
1897- mi := &file_ermite_event_proto_msgTypes[25]
1962+ mi := &file_ermite_event_proto_msgTypes[26]
18981963 if x != nil {
18991964 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
19001965 if ms.LoadMessageInfo() == nil {
@@ -1907,7 +1972,7 @@ func (x *JobUpdated) ProtoReflect() protoreflect.Message {
19071972
19081973 // Deprecated: Use JobUpdated.ProtoReflect.Descriptor instead.
19091974 func (*JobUpdated) Descriptor() ([]byte, []int) {
1910- return file_ermite_event_proto_rawDescGZIP(), []int{25}
1975+ return file_ermite_event_proto_rawDescGZIP(), []int{26}
19111976 }
19121977
19131978 func (x *JobUpdated) GetJob() *RunJob {
@@ -1936,7 +2001,7 @@ type MirrorFailed struct {
19362001
19372002 func (x *MirrorFailed) Reset() {
19382003 *x = MirrorFailed{}
1939- mi := &file_ermite_event_proto_msgTypes[26]
2004+ mi := &file_ermite_event_proto_msgTypes[27]
19402005 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
19412006 ms.StoreMessageInfo(mi)
19422007 }
@@ -1948,7 +2013,7 @@ func (x *MirrorFailed) String() string {
19482013 func (*MirrorFailed) ProtoMessage() {}
19492014
19502015 func (x *MirrorFailed) ProtoReflect() protoreflect.Message {
1951- mi := &file_ermite_event_proto_msgTypes[26]
2016+ mi := &file_ermite_event_proto_msgTypes[27]
19522017 if x != nil {
19532018 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
19542019 if ms.LoadMessageInfo() == nil {
@@ -1961,7 +2026,7 @@ func (x *MirrorFailed) ProtoReflect() protoreflect.Message {
19612026
19622027 // Deprecated: Use MirrorFailed.ProtoReflect.Descriptor instead.
19632028 func (*MirrorFailed) Descriptor() ([]byte, []int) {
1964- return file_ermite_event_proto_rawDescGZIP(), []int{26}
2029+ return file_ermite_event_proto_rawDescGZIP(), []int{27}
19652030 }
19662031
19672032 func (x *MirrorFailed) GetRepo() string {
@@ -1997,7 +2062,7 @@ type MirrorRecovered struct {
19972062
19982063 func (x *MirrorRecovered) Reset() {
19992064 *x = MirrorRecovered{}
2000- mi := &file_ermite_event_proto_msgTypes[27]
2065+ mi := &file_ermite_event_proto_msgTypes[28]
20012066 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
20022067 ms.StoreMessageInfo(mi)
20032068 }
@@ -2009,7 +2074,7 @@ func (x *MirrorRecovered) String() string {
20092074 func (*MirrorRecovered) ProtoMessage() {}
20102075
20112076 func (x *MirrorRecovered) ProtoReflect() protoreflect.Message {
2012- mi := &file_ermite_event_proto_msgTypes[27]
2077+ mi := &file_ermite_event_proto_msgTypes[28]
20132078 if x != nil {
20142079 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
20152080 if ms.LoadMessageInfo() == nil {
@@ -2022,7 +2087,7 @@ func (x *MirrorRecovered) ProtoReflect() protoreflect.Message {
20222087
20232088 // Deprecated: Use MirrorRecovered.ProtoReflect.Descriptor instead.
20242089 func (*MirrorRecovered) Descriptor() ([]byte, []int) {
2025- return file_ermite_event_proto_rawDescGZIP(), []int{27}
2090+ return file_ermite_event_proto_rawDescGZIP(), []int{28}
20262091 }
20272092
20282093 func (x *MirrorRecovered) GetRepo() string {
@@ -2046,7 +2111,7 @@ type ReleasePublished struct {
20462111
20472112 func (x *ReleasePublished) Reset() {
20482113 *x = ReleasePublished{}
2049- mi := &file_ermite_event_proto_msgTypes[28]
2114+ mi := &file_ermite_event_proto_msgTypes[29]
20502115 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
20512116 ms.StoreMessageInfo(mi)
20522117 }
@@ -2058,7 +2123,7 @@ func (x *ReleasePublished) String() string {
20582123 func (*ReleasePublished) ProtoMessage() {}
20592124
20602125 func (x *ReleasePublished) ProtoReflect() protoreflect.Message {
2061- mi := &file_ermite_event_proto_msgTypes[28]
2126+ mi := &file_ermite_event_proto_msgTypes[29]
20622127 if x != nil {
20632128 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
20642129 if ms.LoadMessageInfo() == nil {
@@ -2071,7 +2136,7 @@ func (x *ReleasePublished) ProtoReflect() protoreflect.Message {
20712136
20722137 // Deprecated: Use ReleasePublished.ProtoReflect.Descriptor instead.
20732138 func (*ReleasePublished) Descriptor() ([]byte, []int) {
2074- return file_ermite_event_proto_rawDescGZIP(), []int{28}
2139+ return file_ermite_event_proto_rawDescGZIP(), []int{29}
20752140 }
20762141
20772142 func (x *ReleasePublished) GetRepo() string {
@@ -2123,7 +2188,7 @@ type ReleaseUpdated struct {
21232188
21242189 func (x *ReleaseUpdated) Reset() {
21252190 *x = ReleaseUpdated{}
2126- mi := &file_ermite_event_proto_msgTypes[29]
2191+ mi := &file_ermite_event_proto_msgTypes[30]
21272192 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
21282193 ms.StoreMessageInfo(mi)
21292194 }
@@ -2135,7 +2200,7 @@ func (x *ReleaseUpdated) String() string {
21352200 func (*ReleaseUpdated) ProtoMessage() {}
21362201
21372202 func (x *ReleaseUpdated) ProtoReflect() protoreflect.Message {
2138- mi := &file_ermite_event_proto_msgTypes[29]
2203+ mi := &file_ermite_event_proto_msgTypes[30]
21392204 if x != nil {
21402205 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
21412206 if ms.LoadMessageInfo() == nil {
@@ -2148,7 +2213,7 @@ func (x *ReleaseUpdated) ProtoReflect() protoreflect.Message {
21482213
21492214 // Deprecated: Use ReleaseUpdated.ProtoReflect.Descriptor instead.
21502215 func (*ReleaseUpdated) Descriptor() ([]byte, []int) {
2151- return file_ermite_event_proto_rawDescGZIP(), []int{29}
2216+ return file_ermite_event_proto_rawDescGZIP(), []int{30}
21522217 }
21532218
21542219 func (x *ReleaseUpdated) GetRepo() string {
@@ -2198,7 +2263,7 @@ type ReleaseDeleted struct {
21982263
21992264 func (x *ReleaseDeleted) Reset() {
22002265 *x = ReleaseDeleted{}
2201- mi := &file_ermite_event_proto_msgTypes[30]
2266+ mi := &file_ermite_event_proto_msgTypes[31]
22022267 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
22032268 ms.StoreMessageInfo(mi)
22042269 }
@@ -2210,7 +2275,7 @@ func (x *ReleaseDeleted) String() string {
22102275 func (*ReleaseDeleted) ProtoMessage() {}
22112276
22122277 func (x *ReleaseDeleted) ProtoReflect() protoreflect.Message {
2213- mi := &file_ermite_event_proto_msgTypes[30]
2278+ mi := &file_ermite_event_proto_msgTypes[31]
22142279 if x != nil {
22152280 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
22162281 if ms.LoadMessageInfo() == nil {
@@ -2223,7 +2288,7 @@ func (x *ReleaseDeleted) ProtoReflect() protoreflect.Message {
22232288
22242289 // Deprecated: Use ReleaseDeleted.ProtoReflect.Descriptor instead.
22252290 func (*ReleaseDeleted) Descriptor() ([]byte, []int) {
2226- return file_ermite_event_proto_rawDescGZIP(), []int{30}
2291+ return file_ermite_event_proto_rawDescGZIP(), []int{31}
22272292 }
22282293
22292294 func (x *ReleaseDeleted) GetRepo() string {
@@ -2261,7 +2326,7 @@ type ReleaseUnpublished struct {
22612326
22622327 func (x *ReleaseUnpublished) Reset() {
22632328 *x = ReleaseUnpublished{}
2264- mi := &file_ermite_event_proto_msgTypes[31]
2329+ mi := &file_ermite_event_proto_msgTypes[32]
22652330 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
22662331 ms.StoreMessageInfo(mi)
22672332 }
@@ -2273,7 +2338,7 @@ func (x *ReleaseUnpublished) String() string {
22732338 func (*ReleaseUnpublished) ProtoMessage() {}
22742339
22752340 func (x *ReleaseUnpublished) ProtoReflect() protoreflect.Message {
2276- mi := &file_ermite_event_proto_msgTypes[31]
2341+ mi := &file_ermite_event_proto_msgTypes[32]
22772342 if x != nil {
22782343 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
22792344 if ms.LoadMessageInfo() == nil {
@@ -2286,7 +2351,7 @@ func (x *ReleaseUnpublished) ProtoReflect() protoreflect.Message {
22862351
22872352 // Deprecated: Use ReleaseUnpublished.ProtoReflect.Descriptor instead.
22882353 func (*ReleaseUnpublished) Descriptor() ([]byte, []int) {
2289- return file_ermite_event_proto_rawDescGZIP(), []int{31}
2354+ return file_ermite_event_proto_rawDescGZIP(), []int{32}
22902355 }
22912356
22922357 func (x *ReleaseUnpublished) GetRepo() string {
@@ -2333,7 +2398,7 @@ const file_ermite_event_proto_rawDesc = "" +
23332398 "\x06topics\x18\x01 \x03(\tR\x06topics\x12!\n" +
23342399 "\fresume_after\x18\x02 \x01(\tR\vresumeAfter\"4\n" +
23352400 "\rWatchResponse\x12#\n" +
2336- "\x05event\x18\x01 \x01(\v2\r.ermite.EventR\x05event\"\xcf\x0f\n" +
2401+ "\x05event\x18\x01 \x01(\v2\r.ermite.EventR\x05event\"\x8f\x10\n" +
23372402 "\x05Event\x12\x0e\n" +
23382403 "\x02id\x18\x01 \x01(\tR\x02id\x12.\n" +
23392404 "\x04time\x18\x02 \x01(\v2\x1a.google.protobuf.TimestampR\x04time\x128\n" +
@@ -2367,7 +2432,8 @@ const file_ermite_event_proto_rawDesc = "" +
23672432 "\x11release_published\x18\x1b \x01(\v2\x18.ermite.ReleasePublishedH\x00R\x10releasePublished\x12A\n" +
23682433 "\x0frelease_updated\x18\x1c \x01(\v2\x16.ermite.ReleaseUpdatedH\x00R\x0ereleaseUpdated\x12A\n" +
23692434 "\x0frelease_deleted\x18\x1d \x01(\v2\x16.ermite.ReleaseDeletedH\x00R\x0ereleaseDeleted\x12M\n" +
2370- "\x13release_unpublished\x18\x1e \x01(\v2\x1a.ermite.ReleaseUnpublishedH\x00R\x12releaseUnpublishedB\x06\n" +
2435+ "\x13release_unpublished\x18\x1e \x01(\v2\x1a.ermite.ReleaseUnpublishedH\x00R\x12releaseUnpublished\x12>\n" +
2436+ "\x0eissue_resolved\x18\x1f \x01(\v2\x15.ermite.IssueResolvedH\x00R\rissueResolvedB\x06\n" +
23712437 "\x04kind\"/\n" +
23722438 "\vRepoCreated\x12 \n" +
23732439 "\x04repo\x18\x01 \x01(\v2\f.ermite.RepoR\x04repo\"/\n" +
@@ -2419,6 +2485,8 @@ const file_ermite_event_proto_rawDesc = "" +
24192485 "\x05issue\x18\x01 \x01(\v2\r.ermite.IssueR\x05issue\"2\n" +
24202486 "\vIssueClosed\x12#\n" +
24212487 "\x05issue\x18\x01 \x01(\v2\r.ermite.IssueR\x05issue\"4\n" +
2488+ "\rIssueResolved\x12#\n" +
2489+ "\x05issue\x18\x01 \x01(\v2\r.ermite.IssueR\x05issue\"4\n" +
24222490 "\rIssueReopened\x12#\n" +
24232491 "\x05issue\x18\x01 \x01(\v2\r.ermite.IssueR\x05issue\"l\n" +
24242492 "\x0eIssueCommented\x12\x12\n" +
@@ -2487,7 +2555,7 @@ func file_ermite_event_proto_rawDescGZIP() []byte {
24872555 return file_ermite_event_proto_rawDescData
24882556 }
24892557
2490-var file_ermite_event_proto_msgTypes = make([]protoimpl.MessageInfo, 32)
2558+var file_ermite_event_proto_msgTypes = make([]protoimpl.MessageInfo, 33)
24912559 var file_ermite_event_proto_goTypes = []any{
24922560 (*WatchRequest)(nil), // 0: ermite.WatchRequest
24932561 (*WatchResponse)(nil), // 1: ermite.WatchResponse
@@ -2509,87 +2577,90 @@ var file_ermite_event_proto_goTypes = []any{
25092577 (*CommentResolved)(nil), // 17: ermite.CommentResolved
25102578 (*IssueOpened)(nil), // 18: ermite.IssueOpened
25112579 (*IssueClosed)(nil), // 19: ermite.IssueClosed
2512- (*IssueReopened)(nil), // 20: ermite.IssueReopened
2513- (*IssueCommented)(nil), // 21: ermite.IssueCommented
2514- (*IssueSubmitted)(nil), // 22: ermite.IssueSubmitted
2515- (*Gap)(nil), // 23: ermite.Gap
2516- (*RunUpdated)(nil), // 24: ermite.RunUpdated
2517- (*JobUpdated)(nil), // 25: ermite.JobUpdated
2518- (*MirrorFailed)(nil), // 26: ermite.MirrorFailed
2519- (*MirrorRecovered)(nil), // 27: ermite.MirrorRecovered
2520- (*ReleasePublished)(nil), // 28: ermite.ReleasePublished
2521- (*ReleaseUpdated)(nil), // 29: ermite.ReleaseUpdated
2522- (*ReleaseDeleted)(nil), // 30: ermite.ReleaseDeleted
2523- (*ReleaseUnpublished)(nil), // 31: ermite.ReleaseUnpublished
2524- (*timestamppb.Timestamp)(nil), // 32: google.protobuf.Timestamp
2525- (*Repo)(nil), // 33: ermite.Repo
2526- (*MergeRequest)(nil), // 34: ermite.MergeRequest
2527- (*Mergeability)(nil), // 35: ermite.Mergeability
2528- (*Comment)(nil), // 36: ermite.Comment
2529- (*Issue)(nil), // 37: ermite.Issue
2530- (*IssueComment)(nil), // 38: ermite.IssueComment
2531- (*Run)(nil), // 39: ermite.Run
2532- (*RunJob)(nil), // 40: ermite.RunJob
2533- (MirrorState)(0), // 41: ermite.MirrorState
2580+ (*IssueResolved)(nil), // 20: ermite.IssueResolved
2581+ (*IssueReopened)(nil), // 21: ermite.IssueReopened
2582+ (*IssueCommented)(nil), // 22: ermite.IssueCommented
2583+ (*IssueSubmitted)(nil), // 23: ermite.IssueSubmitted
2584+ (*Gap)(nil), // 24: ermite.Gap
2585+ (*RunUpdated)(nil), // 25: ermite.RunUpdated
2586+ (*JobUpdated)(nil), // 26: ermite.JobUpdated
2587+ (*MirrorFailed)(nil), // 27: ermite.MirrorFailed
2588+ (*MirrorRecovered)(nil), // 28: ermite.MirrorRecovered
2589+ (*ReleasePublished)(nil), // 29: ermite.ReleasePublished
2590+ (*ReleaseUpdated)(nil), // 30: ermite.ReleaseUpdated
2591+ (*ReleaseDeleted)(nil), // 31: ermite.ReleaseDeleted
2592+ (*ReleaseUnpublished)(nil), // 32: ermite.ReleaseUnpublished
2593+ (*timestamppb.Timestamp)(nil), // 33: google.protobuf.Timestamp
2594+ (*Repo)(nil), // 34: ermite.Repo
2595+ (*MergeRequest)(nil), // 35: ermite.MergeRequest
2596+ (*Mergeability)(nil), // 36: ermite.Mergeability
2597+ (*Comment)(nil), // 37: ermite.Comment
2598+ (*Issue)(nil), // 38: ermite.Issue
2599+ (*IssueComment)(nil), // 39: ermite.IssueComment
2600+ (*Run)(nil), // 40: ermite.Run
2601+ (*RunJob)(nil), // 41: ermite.RunJob
2602+ (MirrorState)(0), // 42: ermite.MirrorState
25342603 }
25352604 var file_ermite_event_proto_depIdxs = []int32{
25362605 2, // 0: ermite.WatchResponse.event:type_name -> ermite.Event
2537- 32, // 1: ermite.Event.time:type_name -> google.protobuf.Timestamp
2606+ 33, // 1: ermite.Event.time:type_name -> google.protobuf.Timestamp
25382607 3, // 2: ermite.Event.repo_created:type_name -> ermite.RepoCreated
25392608 4, // 3: ermite.Event.repo_updated:type_name -> ermite.RepoUpdated
25402609 5, // 4: ermite.Event.repo_deleted:type_name -> ermite.RepoDeleted
25412610 6, // 5: ermite.Event.pushed:type_name -> ermite.Pushed
2542- 23, // 6: ermite.Event.gap:type_name -> ermite.Gap
2611+ 24, // 6: ermite.Event.gap:type_name -> ermite.Gap
25432612 8, // 7: ermite.Event.merge_request_opened:type_name -> ermite.MergeRequestOpened
25442613 9, // 8: ermite.Event.merge_request_merged:type_name -> ermite.MergeRequestMerged
25452614 13, // 9: ermite.Event.merge_request_closed:type_name -> ermite.MergeRequestClosed
25462615 14, // 10: ermite.Event.comment_added:type_name -> ermite.CommentAdded
2547- 24, // 11: ermite.Event.run_updated:type_name -> ermite.RunUpdated
2548- 25, // 12: ermite.Event.job_updated:type_name -> ermite.JobUpdated
2616+ 25, // 11: ermite.Event.run_updated:type_name -> ermite.RunUpdated
2617+ 26, // 12: ermite.Event.job_updated:type_name -> ermite.JobUpdated
25492618 15, // 13: ermite.Event.comment_edited:type_name -> ermite.CommentEdited
25502619 16, // 14: ermite.Event.comment_deleted:type_name -> ermite.CommentDeleted
25512620 17, // 15: ermite.Event.comment_resolved:type_name -> ermite.CommentResolved
25522621 18, // 16: ermite.Event.issue_opened:type_name -> ermite.IssueOpened
25532622 19, // 17: ermite.Event.issue_closed:type_name -> ermite.IssueClosed
2554- 20, // 18: ermite.Event.issue_reopened:type_name -> ermite.IssueReopened
2555- 21, // 19: ermite.Event.issue_commented:type_name -> ermite.IssueCommented
2556- 22, // 20: ermite.Event.issue_submitted:type_name -> ermite.IssueSubmitted
2623+ 21, // 18: ermite.Event.issue_reopened:type_name -> ermite.IssueReopened
2624+ 22, // 19: ermite.Event.issue_commented:type_name -> ermite.IssueCommented
2625+ 23, // 20: ermite.Event.issue_submitted:type_name -> ermite.IssueSubmitted
25572626 12, // 21: ermite.Event.merge_request_mergeability:type_name -> ermite.MergeRequestMergeability
2558- 26, // 22: ermite.Event.mirror_failed:type_name -> ermite.MirrorFailed
2559- 27, // 23: ermite.Event.mirror_recovered:type_name -> ermite.MirrorRecovered
2627+ 27, // 22: ermite.Event.mirror_failed:type_name -> ermite.MirrorFailed
2628+ 28, // 23: ermite.Event.mirror_recovered:type_name -> ermite.MirrorRecovered
25602629 10, // 24: ermite.Event.merge_request_auto_merge_enabled:type_name -> ermite.MergeRequestAutoMergeEnabled
25612630 11, // 25: ermite.Event.merge_request_auto_merge_cancelled:type_name -> ermite.MergeRequestAutoMergeCancelled
2562- 28, // 26: ermite.Event.release_published:type_name -> ermite.ReleasePublished
2563- 29, // 27: ermite.Event.release_updated:type_name -> ermite.ReleaseUpdated
2564- 30, // 28: ermite.Event.release_deleted:type_name -> ermite.ReleaseDeleted
2565- 31, // 29: ermite.Event.release_unpublished:type_name -> ermite.ReleaseUnpublished
2566- 33, // 30: ermite.RepoCreated.repo:type_name -> ermite.Repo
2567- 33, // 31: ermite.RepoUpdated.repo:type_name -> ermite.Repo
2568- 7, // 32: ermite.Pushed.ref_updates:type_name -> ermite.RefUpdate
2569- 34, // 33: ermite.MergeRequestOpened.merge_request:type_name -> ermite.MergeRequest
2570- 34, // 34: ermite.MergeRequestMerged.merge_request:type_name -> ermite.MergeRequest
2571- 34, // 35: ermite.MergeRequestAutoMergeEnabled.merge_request:type_name -> ermite.MergeRequest
2572- 34, // 36: ermite.MergeRequestAutoMergeCancelled.merge_request:type_name -> ermite.MergeRequest
2573- 35, // 37: ermite.MergeRequestMergeability.mergeability:type_name -> ermite.Mergeability
2574- 34, // 38: ermite.MergeRequestClosed.merge_request:type_name -> ermite.MergeRequest
2575- 36, // 39: ermite.CommentAdded.comment:type_name -> ermite.Comment
2576- 36, // 40: ermite.CommentEdited.comment:type_name -> ermite.Comment
2577- 36, // 41: ermite.CommentDeleted.comment:type_name -> ermite.Comment
2578- 36, // 42: ermite.CommentResolved.comment:type_name -> ermite.Comment
2579- 37, // 43: ermite.IssueOpened.issue:type_name -> ermite.Issue
2580- 37, // 44: ermite.IssueClosed.issue:type_name -> ermite.Issue
2581- 37, // 45: ermite.IssueReopened.issue:type_name -> ermite.Issue
2582- 38, // 46: ermite.IssueCommented.comment:type_name -> ermite.IssueComment
2583- 39, // 47: ermite.RunUpdated.run:type_name -> ermite.Run
2584- 40, // 48: ermite.JobUpdated.job:type_name -> ermite.RunJob
2585- 41, // 49: ermite.MirrorFailed.state:type_name -> ermite.MirrorState
2586- 0, // 50: ermite.EventService.Watch:input_type -> ermite.WatchRequest
2587- 1, // 51: ermite.EventService.Watch:output_type -> ermite.WatchResponse
2588- 51, // [51:52] is the sub-list for method output_type
2589- 50, // [50:51] is the sub-list for method input_type
2590- 50, // [50:50] is the sub-list for extension type_name
2591- 50, // [50:50] is the sub-list for extension extendee
2592- 0, // [0:50] is the sub-list for field type_name
2631+ 29, // 26: ermite.Event.release_published:type_name -> ermite.ReleasePublished
2632+ 30, // 27: ermite.Event.release_updated:type_name -> ermite.ReleaseUpdated
2633+ 31, // 28: ermite.Event.release_deleted:type_name -> ermite.ReleaseDeleted
2634+ 32, // 29: ermite.Event.release_unpublished:type_name -> ermite.ReleaseUnpublished
2635+ 20, // 30: ermite.Event.issue_resolved:type_name -> ermite.IssueResolved
2636+ 34, // 31: ermite.RepoCreated.repo:type_name -> ermite.Repo
2637+ 34, // 32: ermite.RepoUpdated.repo:type_name -> ermite.Repo
2638+ 7, // 33: ermite.Pushed.ref_updates:type_name -> ermite.RefUpdate
2639+ 35, // 34: ermite.MergeRequestOpened.merge_request:type_name -> ermite.MergeRequest
2640+ 35, // 35: ermite.MergeRequestMerged.merge_request:type_name -> ermite.MergeRequest
2641+ 35, // 36: ermite.MergeRequestAutoMergeEnabled.merge_request:type_name -> ermite.MergeRequest
2642+ 35, // 37: ermite.MergeRequestAutoMergeCancelled.merge_request:type_name -> ermite.MergeRequest
2643+ 36, // 38: ermite.MergeRequestMergeability.mergeability:type_name -> ermite.Mergeability
2644+ 35, // 39: ermite.MergeRequestClosed.merge_request:type_name -> ermite.MergeRequest
2645+ 37, // 40: ermite.CommentAdded.comment:type_name -> ermite.Comment
2646+ 37, // 41: ermite.CommentEdited.comment:type_name -> ermite.Comment
2647+ 37, // 42: ermite.CommentDeleted.comment:type_name -> ermite.Comment
2648+ 37, // 43: ermite.CommentResolved.comment:type_name -> ermite.Comment
2649+ 38, // 44: ermite.IssueOpened.issue:type_name -> ermite.Issue
2650+ 38, // 45: ermite.IssueClosed.issue:type_name -> ermite.Issue
2651+ 38, // 46: ermite.IssueResolved.issue:type_name -> ermite.Issue
2652+ 38, // 47: ermite.IssueReopened.issue:type_name -> ermite.Issue
2653+ 39, // 48: ermite.IssueCommented.comment:type_name -> ermite.IssueComment
2654+ 40, // 49: ermite.RunUpdated.run:type_name -> ermite.Run
2655+ 41, // 50: ermite.JobUpdated.job:type_name -> ermite.RunJob
2656+ 42, // 51: ermite.MirrorFailed.state:type_name -> ermite.MirrorState
2657+ 0, // 52: ermite.EventService.Watch:input_type -> ermite.WatchRequest
2658+ 1, // 53: ermite.EventService.Watch:output_type -> ermite.WatchResponse
2659+ 53, // [53:54] is the sub-list for method output_type
2660+ 52, // [52:53] is the sub-list for method input_type
2661+ 52, // [52:52] is the sub-list for extension type_name
2662+ 52, // [52:52] is the sub-list for extension extendee
2663+ 0, // [0:52] is the sub-list for field type_name
25932664 }
25942665
25952666 func init() { file_ermite_event_proto_init() }
@@ -2631,6 +2702,7 @@ func file_ermite_event_proto_init() {
26312702 (*Event_ReleaseUpdated)(nil),
26322703 (*Event_ReleaseDeleted)(nil),
26332704 (*Event_ReleaseUnpublished)(nil),
2705+ (*Event_IssueResolved)(nil),
26342706 }
26352707 type x struct{}
26362708 out := protoimpl.TypeBuilder{
@@ -2638,7 +2710,7 @@ func file_ermite_event_proto_init() {
26382710 GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
26392711 RawDescriptor: unsafe.Slice(unsafe.StringData(file_ermite_event_proto_rawDesc), len(file_ermite_event_proto_rawDesc)),
26402712 NumEnums: 0,
2641- NumMessages: 32,
2713+ NumMessages: 33,
26422714 NumExtensions: 0,
26432715 NumServices: 1,
26442716 },
@@ -179,6 +179,7 @@ type Event struct {
179 // *Event_ReleaseUpdated179 // *Event_ReleaseUpdated
180 // *Event_ReleaseDeleted180 // *Event_ReleaseDeleted
181 // *Event_ReleaseUnpublished181 // *Event_ReleaseUnpublished
182+ // *Event_IssueResolved
182 Kind isEvent_Kind `protobuf_oneof:"kind"`183 Kind isEvent_Kind `protobuf_oneof:"kind"`
183 unknownFields protoimpl.UnknownFields184 unknownFields protoimpl.UnknownFields
184 sizeCache protoimpl.SizeCache185 sizeCache protoimpl.SizeCache
@@ -487,6 +488,15 @@ func (x *Event) GetReleaseUnpublished() *ReleaseUnpublished {
487 return nil488 return nil
488 }489 }
489 490
491+func (x *Event) GetIssueResolved() *IssueResolved {
492+ if x != nil {
493+ if x, ok := x.Kind.(*Event_IssueResolved); ok {
494+ return x.IssueResolved
495+ }
496+ }
497+ return nil
498+}
499+
490 type isEvent_Kind interface {500 type isEvent_Kind interface {
491 isEvent_Kind()501 isEvent_Kind()
492 }502 }
@@ -634,6 +644,11 @@ type Event_ReleaseUnpublished struct {
634 ReleaseUnpublished *ReleaseUnpublished `protobuf:"bytes,30,opt,name=release_unpublished,json=releaseUnpublished,proto3,oneof"`644 ReleaseUnpublished *ReleaseUnpublished `protobuf:"bytes,30,opt,name=release_unpublished,json=releaseUnpublished,proto3,oneof"`
635 }645 }
636 646
647+type Event_IssueResolved struct {
648+ // IssueResolved: an issue was resolved.
649+ IssueResolved *IssueResolved `protobuf:"bytes,31,opt,name=issue_resolved,json=issueResolved,proto3,oneof"`
650+}
651+
637 func (*Event_RepoCreated) isEvent_Kind() {}652 func (*Event_RepoCreated) isEvent_Kind() {}
638 653
639 func (*Event_RepoUpdated) isEvent_Kind() {}654 func (*Event_RepoUpdated) isEvent_Kind() {}
@@ -690,6 +705,8 @@ func (*Event_ReleaseDeleted) isEvent_Kind() {}
690 705
691 func (*Event_ReleaseUnpublished) isEvent_Kind() {}706 func (*Event_ReleaseUnpublished) isEvent_Kind() {}
692 707
708+func (*Event_IssueResolved) isEvent_Kind() {}
709+
693 // RepoCreated reports a new repository.710 // RepoCreated reports a new repository.
694 type RepoCreated struct {711 type RepoCreated struct {
695 state protoimpl.MessageState `protogen:"open.v1"`712 state protoimpl.MessageState `protogen:"open.v1"`
@@ -1569,7 +1586,8 @@ func (x *IssueOpened) GetIssue() *Issue {
1569 return nil1586 return nil
1570 }1587 }
1571 1588
1572-// IssueClosed reports a closed issue.1589+// IssueClosed reports a closed issue. A merge that resolves an issue sends
1590+// issue_resolved, not issue_closed.
1573 type IssueClosed struct {1591 type IssueClosed struct {
1574 state protoimpl.MessageState `protogen:"open.v1"`1592 state protoimpl.MessageState `protogen:"open.v1"`
1575 // Issue is the issue after closing, including its repository and number.1593 // Issue is the issue after closing, including its repository and number.
@@ -1615,6 +1633,53 @@ func (x *IssueClosed) GetIssue() *Issue {
1615 return nil1633 return nil
1616 }1634 }
1617 1635
1636+// IssueResolved reports a resolved issue.
1637+type IssueResolved struct {
1638+ state protoimpl.MessageState `protogen:"open.v1"`
1639+ // Issue is the issue after resolving, including its repository, number and
1640+ // closed_by_merge_request.
1641+ Issue *Issue `protobuf:"bytes,1,opt,name=issue,proto3" json:"issue,omitempty"`
1642+ unknownFields protoimpl.UnknownFields
1643+ sizeCache protoimpl.SizeCache
1644+}
1645+
1646+func (x *IssueResolved) Reset() {
1647+ *x = IssueResolved{}
1648+ mi := &file_ermite_event_proto_msgTypes[20]
1649+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
1650+ ms.StoreMessageInfo(mi)
1651+}
1652+
1653+func (x *IssueResolved) String() string {
1654+ return protoimpl.X.MessageStringOf(x)
1655+}
1656+
1657+func (*IssueResolved) ProtoMessage() {}
1658+
1659+func (x *IssueResolved) ProtoReflect() protoreflect.Message {
1660+ mi := &file_ermite_event_proto_msgTypes[20]
1661+ if x != nil {
1662+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
1663+ if ms.LoadMessageInfo() == nil {
1664+ ms.StoreMessageInfo(mi)
1665+ }
1666+ return ms
1667+ }
1668+ return mi.MessageOf(x)
1669+}
1670+
1671+// Deprecated: Use IssueResolved.ProtoReflect.Descriptor instead.
1672+func (*IssueResolved) Descriptor() ([]byte, []int) {
1673+ return file_ermite_event_proto_rawDescGZIP(), []int{20}
1674+}
1675+
1676+func (x *IssueResolved) GetIssue() *Issue {
1677+ if x != nil {
1678+ return x.Issue
1679+ }
1680+ return nil
1681+}
1682+
1618 // IssueReopened reports a reopened issue.1683 // IssueReopened reports a reopened issue.
1619 type IssueReopened struct {1684 type IssueReopened struct {
1620 state protoimpl.MessageState `protogen:"open.v1"`1685 state protoimpl.MessageState `protogen:"open.v1"`
@@ -1626,7 +1691,7 @@ type IssueReopened struct {
1626 1691
1627 func (x *IssueReopened) Reset() {1692 func (x *IssueReopened) Reset() {
1628 *x = IssueReopened{}1693 *x = IssueReopened{}
1629- mi := &file_ermite_event_proto_msgTypes[20]1694+ mi := &file_ermite_event_proto_msgTypes[21]
1630 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))1695 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
1631 ms.StoreMessageInfo(mi)1696 ms.StoreMessageInfo(mi)
1632 }1697 }
@@ -1638,7 +1703,7 @@ func (x *IssueReopened) String() string {
1638 func (*IssueReopened) ProtoMessage() {}1703 func (*IssueReopened) ProtoMessage() {}
1639 1704
1640 func (x *IssueReopened) ProtoReflect() protoreflect.Message {1705 func (x *IssueReopened) ProtoReflect() protoreflect.Message {
1641- mi := &file_ermite_event_proto_msgTypes[20]1706+ mi := &file_ermite_event_proto_msgTypes[21]
1642 if x != nil {1707 if x != nil {
1643 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))1708 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
1644 if ms.LoadMessageInfo() == nil {1709 if ms.LoadMessageInfo() == nil {
@@ -1651,7 +1716,7 @@ func (x *IssueReopened) ProtoReflect() protoreflect.Message {
1651 1716
1652 // Deprecated: Use IssueReopened.ProtoReflect.Descriptor instead.1717 // Deprecated: Use IssueReopened.ProtoReflect.Descriptor instead.
1653 func (*IssueReopened) Descriptor() ([]byte, []int) {1718 func (*IssueReopened) Descriptor() ([]byte, []int) {
1654- return file_ermite_event_proto_rawDescGZIP(), []int{20}1719+ return file_ermite_event_proto_rawDescGZIP(), []int{21}
1655 }1720 }
1656 1721
1657 func (x *IssueReopened) GetIssue() *Issue {1722 func (x *IssueReopened) GetIssue() *Issue {
@@ -1676,7 +1741,7 @@ type IssueCommented struct {
1676 1741
1677 func (x *IssueCommented) Reset() {1742 func (x *IssueCommented) Reset() {
1678 *x = IssueCommented{}1743 *x = IssueCommented{}
1679- mi := &file_ermite_event_proto_msgTypes[21]1744+ mi := &file_ermite_event_proto_msgTypes[22]
1680 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))1745 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
1681 ms.StoreMessageInfo(mi)1746 ms.StoreMessageInfo(mi)
1682 }1747 }
@@ -1688,7 +1753,7 @@ func (x *IssueCommented) String() string {
1688 func (*IssueCommented) ProtoMessage() {}1753 func (*IssueCommented) ProtoMessage() {}
1689 1754
1690 func (x *IssueCommented) ProtoReflect() protoreflect.Message {1755 func (x *IssueCommented) ProtoReflect() protoreflect.Message {
1691- mi := &file_ermite_event_proto_msgTypes[21]1756+ mi := &file_ermite_event_proto_msgTypes[22]
1692 if x != nil {1757 if x != nil {
1693 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))1758 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
1694 if ms.LoadMessageInfo() == nil {1759 if ms.LoadMessageInfo() == nil {
@@ -1701,7 +1766,7 @@ func (x *IssueCommented) ProtoReflect() protoreflect.Message {
1701 1766
1702 // Deprecated: Use IssueCommented.ProtoReflect.Descriptor instead.1767 // Deprecated: Use IssueCommented.ProtoReflect.Descriptor instead.
1703 func (*IssueCommented) Descriptor() ([]byte, []int) {1768 func (*IssueCommented) Descriptor() ([]byte, []int) {
1704- return file_ermite_event_proto_rawDescGZIP(), []int{21}1769+ return file_ermite_event_proto_rawDescGZIP(), []int{22}
1705 }1770 }
1706 1771
1707 func (x *IssueCommented) GetRepo() string {1772 func (x *IssueCommented) GetRepo() string {
@@ -1740,7 +1805,7 @@ type IssueSubmitted struct {
1740 1805
1741 func (x *IssueSubmitted) Reset() {1806 func (x *IssueSubmitted) Reset() {
1742 *x = IssueSubmitted{}1807 *x = IssueSubmitted{}
1743- mi := &file_ermite_event_proto_msgTypes[22]1808+ mi := &file_ermite_event_proto_msgTypes[23]
1744 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))1809 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
1745 ms.StoreMessageInfo(mi)1810 ms.StoreMessageInfo(mi)
1746 }1811 }
@@ -1752,7 +1817,7 @@ func (x *IssueSubmitted) String() string {
1752 func (*IssueSubmitted) ProtoMessage() {}1817 func (*IssueSubmitted) ProtoMessage() {}
1753 1818
1754 func (x *IssueSubmitted) ProtoReflect() protoreflect.Message {1819 func (x *IssueSubmitted) ProtoReflect() protoreflect.Message {
1755- mi := &file_ermite_event_proto_msgTypes[22]1820+ mi := &file_ermite_event_proto_msgTypes[23]
1756 if x != nil {1821 if x != nil {
1757 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))1822 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
1758 if ms.LoadMessageInfo() == nil {1823 if ms.LoadMessageInfo() == nil {
@@ -1765,7 +1830,7 @@ func (x *IssueSubmitted) ProtoReflect() protoreflect.Message {
1765 1830
1766 // Deprecated: Use IssueSubmitted.ProtoReflect.Descriptor instead.1831 // Deprecated: Use IssueSubmitted.ProtoReflect.Descriptor instead.
1767 func (*IssueSubmitted) Descriptor() ([]byte, []int) {1832 func (*IssueSubmitted) Descriptor() ([]byte, []int) {
1768- return file_ermite_event_proto_rawDescGZIP(), []int{22}1833+ return file_ermite_event_proto_rawDescGZIP(), []int{23}
1769 }1834 }
1770 1835
1771 func (x *IssueSubmitted) GetRepo() string {1836 func (x *IssueSubmitted) GetRepo() string {
@@ -1795,7 +1860,7 @@ type Gap struct {
1795 1860
1796 func (x *Gap) Reset() {1861 func (x *Gap) Reset() {
1797 *x = Gap{}1862 *x = Gap{}
1798- mi := &file_ermite_event_proto_msgTypes[23]1863+ mi := &file_ermite_event_proto_msgTypes[24]
1799 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))1864 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
1800 ms.StoreMessageInfo(mi)1865 ms.StoreMessageInfo(mi)
1801 }1866 }
@@ -1807,7 +1872,7 @@ func (x *Gap) String() string {
1807 func (*Gap) ProtoMessage() {}1872 func (*Gap) ProtoMessage() {}
1808 1873
1809 func (x *Gap) ProtoReflect() protoreflect.Message {1874 func (x *Gap) ProtoReflect() protoreflect.Message {
1810- mi := &file_ermite_event_proto_msgTypes[23]1875+ mi := &file_ermite_event_proto_msgTypes[24]
1811 if x != nil {1876 if x != nil {
1812 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))1877 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
1813 if ms.LoadMessageInfo() == nil {1878 if ms.LoadMessageInfo() == nil {
@@ -1820,7 +1885,7 @@ func (x *Gap) ProtoReflect() protoreflect.Message {
1820 1885
1821 // Deprecated: Use Gap.ProtoReflect.Descriptor instead.1886 // Deprecated: Use Gap.ProtoReflect.Descriptor instead.
1822 func (*Gap) Descriptor() ([]byte, []int) {1887 func (*Gap) Descriptor() ([]byte, []int) {
1823- return file_ermite_event_proto_rawDescGZIP(), []int{23}1888+ return file_ermite_event_proto_rawDescGZIP(), []int{24}
1824 }1889 }
1825 1890
1826 // RunUpdated reports a CI run that was created or whose status, conclusion or1891 // RunUpdated reports a CI run that was created or whose status, conclusion or
@@ -1835,7 +1900,7 @@ type RunUpdated struct {
1835 1900
1836 func (x *RunUpdated) Reset() {1901 func (x *RunUpdated) Reset() {
1837 *x = RunUpdated{}1902 *x = RunUpdated{}
1838- mi := &file_ermite_event_proto_msgTypes[24]1903+ mi := &file_ermite_event_proto_msgTypes[25]
1839 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))1904 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
1840 ms.StoreMessageInfo(mi)1905 ms.StoreMessageInfo(mi)
1841 }1906 }
@@ -1847,7 +1912,7 @@ func (x *RunUpdated) String() string {
1847 func (*RunUpdated) ProtoMessage() {}1912 func (*RunUpdated) ProtoMessage() {}
1848 1913
1849 func (x *RunUpdated) ProtoReflect() protoreflect.Message {1914 func (x *RunUpdated) ProtoReflect() protoreflect.Message {
1850- mi := &file_ermite_event_proto_msgTypes[24]1915+ mi := &file_ermite_event_proto_msgTypes[25]
1851 if x != nil {1916 if x != nil {
1852 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))1917 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
1853 if ms.LoadMessageInfo() == nil {1918 if ms.LoadMessageInfo() == nil {
@@ -1860,7 +1925,7 @@ func (x *RunUpdated) ProtoReflect() protoreflect.Message {
1860 1925
1861 // Deprecated: Use RunUpdated.ProtoReflect.Descriptor instead.1926 // Deprecated: Use RunUpdated.ProtoReflect.Descriptor instead.
1862 func (*RunUpdated) Descriptor() ([]byte, []int) {1927 func (*RunUpdated) Descriptor() ([]byte, []int) {
1863- return file_ermite_event_proto_rawDescGZIP(), []int{24}1928+ return file_ermite_event_proto_rawDescGZIP(), []int{25}
1864 }1929 }
1865 1930
1866 func (x *RunUpdated) GetRun() *Run {1931 func (x *RunUpdated) GetRun() *Run {
@@ -1882,7 +1947,7 @@ type JobUpdated struct {
1882 1947
1883 func (x *JobUpdated) Reset() {1948 func (x *JobUpdated) Reset() {
1884 *x = JobUpdated{}1949 *x = JobUpdated{}
1885- mi := &file_ermite_event_proto_msgTypes[25]1950+ mi := &file_ermite_event_proto_msgTypes[26]
1886 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))1951 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
1887 ms.StoreMessageInfo(mi)1952 ms.StoreMessageInfo(mi)
1888 }1953 }
@@ -1894,7 +1959,7 @@ func (x *JobUpdated) String() string {
1894 func (*JobUpdated) ProtoMessage() {}1959 func (*JobUpdated) ProtoMessage() {}
1895 1960
1896 func (x *JobUpdated) ProtoReflect() protoreflect.Message {1961 func (x *JobUpdated) ProtoReflect() protoreflect.Message {
1897- mi := &file_ermite_event_proto_msgTypes[25]1962+ mi := &file_ermite_event_proto_msgTypes[26]
1898 if x != nil {1963 if x != nil {
1899 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))1964 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
1900 if ms.LoadMessageInfo() == nil {1965 if ms.LoadMessageInfo() == nil {
@@ -1907,7 +1972,7 @@ func (x *JobUpdated) ProtoReflect() protoreflect.Message {
1907 1972
1908 // Deprecated: Use JobUpdated.ProtoReflect.Descriptor instead.1973 // Deprecated: Use JobUpdated.ProtoReflect.Descriptor instead.
1909 func (*JobUpdated) Descriptor() ([]byte, []int) {1974 func (*JobUpdated) Descriptor() ([]byte, []int) {
1910- return file_ermite_event_proto_rawDescGZIP(), []int{25}1975+ return file_ermite_event_proto_rawDescGZIP(), []int{26}
1911 }1976 }
1912 1977
1913 func (x *JobUpdated) GetJob() *RunJob {1978 func (x *JobUpdated) GetJob() *RunJob {
@@ -1936,7 +2001,7 @@ type MirrorFailed struct {
1936 2001
1937 func (x *MirrorFailed) Reset() {2002 func (x *MirrorFailed) Reset() {
1938 *x = MirrorFailed{}2003 *x = MirrorFailed{}
1939- mi := &file_ermite_event_proto_msgTypes[26]2004+ mi := &file_ermite_event_proto_msgTypes[27]
1940 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))2005 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
1941 ms.StoreMessageInfo(mi)2006 ms.StoreMessageInfo(mi)
1942 }2007 }
@@ -1948,7 +2013,7 @@ func (x *MirrorFailed) String() string {
1948 func (*MirrorFailed) ProtoMessage() {}2013 func (*MirrorFailed) ProtoMessage() {}
1949 2014
1950 func (x *MirrorFailed) ProtoReflect() protoreflect.Message {2015 func (x *MirrorFailed) ProtoReflect() protoreflect.Message {
1951- mi := &file_ermite_event_proto_msgTypes[26]2016+ mi := &file_ermite_event_proto_msgTypes[27]
1952 if x != nil {2017 if x != nil {
1953 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))2018 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
1954 if ms.LoadMessageInfo() == nil {2019 if ms.LoadMessageInfo() == nil {
@@ -1961,7 +2026,7 @@ func (x *MirrorFailed) ProtoReflect() protoreflect.Message {
1961 2026
1962 // Deprecated: Use MirrorFailed.ProtoReflect.Descriptor instead.2027 // Deprecated: Use MirrorFailed.ProtoReflect.Descriptor instead.
1963 func (*MirrorFailed) Descriptor() ([]byte, []int) {2028 func (*MirrorFailed) Descriptor() ([]byte, []int) {
1964- return file_ermite_event_proto_rawDescGZIP(), []int{26}2029+ return file_ermite_event_proto_rawDescGZIP(), []int{27}
1965 }2030 }
1966 2031
1967 func (x *MirrorFailed) GetRepo() string {2032 func (x *MirrorFailed) GetRepo() string {
@@ -1997,7 +2062,7 @@ type MirrorRecovered struct {
1997 2062
1998 func (x *MirrorRecovered) Reset() {2063 func (x *MirrorRecovered) Reset() {
1999 *x = MirrorRecovered{}2064 *x = MirrorRecovered{}
2000- mi := &file_ermite_event_proto_msgTypes[27]2065+ mi := &file_ermite_event_proto_msgTypes[28]
2001 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))2066 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
2002 ms.StoreMessageInfo(mi)2067 ms.StoreMessageInfo(mi)
2003 }2068 }
@@ -2009,7 +2074,7 @@ func (x *MirrorRecovered) String() string {
2009 func (*MirrorRecovered) ProtoMessage() {}2074 func (*MirrorRecovered) ProtoMessage() {}
2010 2075
2011 func (x *MirrorRecovered) ProtoReflect() protoreflect.Message {2076 func (x *MirrorRecovered) ProtoReflect() protoreflect.Message {
2012- mi := &file_ermite_event_proto_msgTypes[27]2077+ mi := &file_ermite_event_proto_msgTypes[28]
2013 if x != nil {2078 if x != nil {
2014 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))2079 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
2015 if ms.LoadMessageInfo() == nil {2080 if ms.LoadMessageInfo() == nil {
@@ -2022,7 +2087,7 @@ func (x *MirrorRecovered) ProtoReflect() protoreflect.Message {
2022 2087
2023 // Deprecated: Use MirrorRecovered.ProtoReflect.Descriptor instead.2088 // Deprecated: Use MirrorRecovered.ProtoReflect.Descriptor instead.
2024 func (*MirrorRecovered) Descriptor() ([]byte, []int) {2089 func (*MirrorRecovered) Descriptor() ([]byte, []int) {
2025- return file_ermite_event_proto_rawDescGZIP(), []int{27}2090+ return file_ermite_event_proto_rawDescGZIP(), []int{28}
2026 }2091 }
2027 2092
2028 func (x *MirrorRecovered) GetRepo() string {2093 func (x *MirrorRecovered) GetRepo() string {
@@ -2046,7 +2111,7 @@ type ReleasePublished struct {
2046 2111
2047 func (x *ReleasePublished) Reset() {2112 func (x *ReleasePublished) Reset() {
2048 *x = ReleasePublished{}2113 *x = ReleasePublished{}
2049- mi := &file_ermite_event_proto_msgTypes[28]2114+ mi := &file_ermite_event_proto_msgTypes[29]
2050 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))2115 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
2051 ms.StoreMessageInfo(mi)2116 ms.StoreMessageInfo(mi)
2052 }2117 }
@@ -2058,7 +2123,7 @@ func (x *ReleasePublished) String() string {
2058 func (*ReleasePublished) ProtoMessage() {}2123 func (*ReleasePublished) ProtoMessage() {}
2059 2124
2060 func (x *ReleasePublished) ProtoReflect() protoreflect.Message {2125 func (x *ReleasePublished) ProtoReflect() protoreflect.Message {
2061- mi := &file_ermite_event_proto_msgTypes[28]2126+ mi := &file_ermite_event_proto_msgTypes[29]
2062 if x != nil {2127 if x != nil {
2063 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))2128 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
2064 if ms.LoadMessageInfo() == nil {2129 if ms.LoadMessageInfo() == nil {
@@ -2071,7 +2136,7 @@ func (x *ReleasePublished) ProtoReflect() protoreflect.Message {
2071 2136
2072 // Deprecated: Use ReleasePublished.ProtoReflect.Descriptor instead.2137 // Deprecated: Use ReleasePublished.ProtoReflect.Descriptor instead.
2073 func (*ReleasePublished) Descriptor() ([]byte, []int) {2138 func (*ReleasePublished) Descriptor() ([]byte, []int) {
2074- return file_ermite_event_proto_rawDescGZIP(), []int{28}2139+ return file_ermite_event_proto_rawDescGZIP(), []int{29}
2075 }2140 }
2076 2141
2077 func (x *ReleasePublished) GetRepo() string {2142 func (x *ReleasePublished) GetRepo() string {
@@ -2123,7 +2188,7 @@ type ReleaseUpdated struct {
2123 2188
2124 func (x *ReleaseUpdated) Reset() {2189 func (x *ReleaseUpdated) Reset() {
2125 *x = ReleaseUpdated{}2190 *x = ReleaseUpdated{}
2126- mi := &file_ermite_event_proto_msgTypes[29]2191+ mi := &file_ermite_event_proto_msgTypes[30]
2127 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))2192 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
2128 ms.StoreMessageInfo(mi)2193 ms.StoreMessageInfo(mi)
2129 }2194 }
@@ -2135,7 +2200,7 @@ func (x *ReleaseUpdated) String() string {
2135 func (*ReleaseUpdated) ProtoMessage() {}2200 func (*ReleaseUpdated) ProtoMessage() {}
2136 2201
2137 func (x *ReleaseUpdated) ProtoReflect() protoreflect.Message {2202 func (x *ReleaseUpdated) ProtoReflect() protoreflect.Message {
2138- mi := &file_ermite_event_proto_msgTypes[29]2203+ mi := &file_ermite_event_proto_msgTypes[30]
2139 if x != nil {2204 if x != nil {
2140 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))2205 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
2141 if ms.LoadMessageInfo() == nil {2206 if ms.LoadMessageInfo() == nil {
@@ -2148,7 +2213,7 @@ func (x *ReleaseUpdated) ProtoReflect() protoreflect.Message {
2148 2213
2149 // Deprecated: Use ReleaseUpdated.ProtoReflect.Descriptor instead.2214 // Deprecated: Use ReleaseUpdated.ProtoReflect.Descriptor instead.
2150 func (*ReleaseUpdated) Descriptor() ([]byte, []int) {2215 func (*ReleaseUpdated) Descriptor() ([]byte, []int) {
2151- return file_ermite_event_proto_rawDescGZIP(), []int{29}2216+ return file_ermite_event_proto_rawDescGZIP(), []int{30}
2152 }2217 }
2153 2218
2154 func (x *ReleaseUpdated) GetRepo() string {2219 func (x *ReleaseUpdated) GetRepo() string {
@@ -2198,7 +2263,7 @@ type ReleaseDeleted struct {
2198 2263
2199 func (x *ReleaseDeleted) Reset() {2264 func (x *ReleaseDeleted) Reset() {
2200 *x = ReleaseDeleted{}2265 *x = ReleaseDeleted{}
2201- mi := &file_ermite_event_proto_msgTypes[30]2266+ mi := &file_ermite_event_proto_msgTypes[31]
2202 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))2267 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
2203 ms.StoreMessageInfo(mi)2268 ms.StoreMessageInfo(mi)
2204 }2269 }
@@ -2210,7 +2275,7 @@ func (x *ReleaseDeleted) String() string {
2210 func (*ReleaseDeleted) ProtoMessage() {}2275 func (*ReleaseDeleted) ProtoMessage() {}
2211 2276
2212 func (x *ReleaseDeleted) ProtoReflect() protoreflect.Message {2277 func (x *ReleaseDeleted) ProtoReflect() protoreflect.Message {
2213- mi := &file_ermite_event_proto_msgTypes[30]2278+ mi := &file_ermite_event_proto_msgTypes[31]
2214 if x != nil {2279 if x != nil {
2215 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))2280 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
2216 if ms.LoadMessageInfo() == nil {2281 if ms.LoadMessageInfo() == nil {
@@ -2223,7 +2288,7 @@ func (x *ReleaseDeleted) ProtoReflect() protoreflect.Message {
2223 2288
2224 // Deprecated: Use ReleaseDeleted.ProtoReflect.Descriptor instead.2289 // Deprecated: Use ReleaseDeleted.ProtoReflect.Descriptor instead.
2225 func (*ReleaseDeleted) Descriptor() ([]byte, []int) {2290 func (*ReleaseDeleted) Descriptor() ([]byte, []int) {
2226- return file_ermite_event_proto_rawDescGZIP(), []int{30}2291+ return file_ermite_event_proto_rawDescGZIP(), []int{31}
2227 }2292 }
2228 2293
2229 func (x *ReleaseDeleted) GetRepo() string {2294 func (x *ReleaseDeleted) GetRepo() string {
@@ -2261,7 +2326,7 @@ type ReleaseUnpublished struct {
2261 2326
2262 func (x *ReleaseUnpublished) Reset() {2327 func (x *ReleaseUnpublished) Reset() {
2263 *x = ReleaseUnpublished{}2328 *x = ReleaseUnpublished{}
2264- mi := &file_ermite_event_proto_msgTypes[31]2329+ mi := &file_ermite_event_proto_msgTypes[32]
2265 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))2330 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
2266 ms.StoreMessageInfo(mi)2331 ms.StoreMessageInfo(mi)
2267 }2332 }
@@ -2273,7 +2338,7 @@ func (x *ReleaseUnpublished) String() string {
2273 func (*ReleaseUnpublished) ProtoMessage() {}2338 func (*ReleaseUnpublished) ProtoMessage() {}
2274 2339
2275 func (x *ReleaseUnpublished) ProtoReflect() protoreflect.Message {2340 func (x *ReleaseUnpublished) ProtoReflect() protoreflect.Message {
2276- mi := &file_ermite_event_proto_msgTypes[31]2341+ mi := &file_ermite_event_proto_msgTypes[32]
2277 if x != nil {2342 if x != nil {
2278 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))2343 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
2279 if ms.LoadMessageInfo() == nil {2344 if ms.LoadMessageInfo() == nil {
@@ -2286,7 +2351,7 @@ func (x *ReleaseUnpublished) ProtoReflect() protoreflect.Message {
2286 2351
2287 // Deprecated: Use ReleaseUnpublished.ProtoReflect.Descriptor instead.2352 // Deprecated: Use ReleaseUnpublished.ProtoReflect.Descriptor instead.
2288 func (*ReleaseUnpublished) Descriptor() ([]byte, []int) {2353 func (*ReleaseUnpublished) Descriptor() ([]byte, []int) {
2289- return file_ermite_event_proto_rawDescGZIP(), []int{31}2354+ return file_ermite_event_proto_rawDescGZIP(), []int{32}
2290 }2355 }
2291 2356
2292 func (x *ReleaseUnpublished) GetRepo() string {2357 func (x *ReleaseUnpublished) GetRepo() string {
@@ -2333,7 +2398,7 @@ const file_ermite_event_proto_rawDesc = "" +
2333 "\x06topics\x18\x01 \x03(\tR\x06topics\x12!\n" +2398 "\x06topics\x18\x01 \x03(\tR\x06topics\x12!\n" +
2334 "\fresume_after\x18\x02 \x01(\tR\vresumeAfter\"4\n" +2399 "\fresume_after\x18\x02 \x01(\tR\vresumeAfter\"4\n" +
2335 "\rWatchResponse\x12#\n" +2400 "\rWatchResponse\x12#\n" +
2336- "\x05event\x18\x01 \x01(\v2\r.ermite.EventR\x05event\"\xcf\x0f\n" +2401+ "\x05event\x18\x01 \x01(\v2\r.ermite.EventR\x05event\"\x8f\x10\n" +
2337 "\x05Event\x12\x0e\n" +2402 "\x05Event\x12\x0e\n" +
2338 "\x02id\x18\x01 \x01(\tR\x02id\x12.\n" +2403 "\x02id\x18\x01 \x01(\tR\x02id\x12.\n" +
2339 "\x04time\x18\x02 \x01(\v2\x1a.google.protobuf.TimestampR\x04time\x128\n" +2404 "\x04time\x18\x02 \x01(\v2\x1a.google.protobuf.TimestampR\x04time\x128\n" +
@@ -2367,7 +2432,8 @@ const file_ermite_event_proto_rawDesc = "" +
2367 "\x11release_published\x18\x1b \x01(\v2\x18.ermite.ReleasePublishedH\x00R\x10releasePublished\x12A\n" +2432 "\x11release_published\x18\x1b \x01(\v2\x18.ermite.ReleasePublishedH\x00R\x10releasePublished\x12A\n" +
2368 "\x0frelease_updated\x18\x1c \x01(\v2\x16.ermite.ReleaseUpdatedH\x00R\x0ereleaseUpdated\x12A\n" +2433 "\x0frelease_updated\x18\x1c \x01(\v2\x16.ermite.ReleaseUpdatedH\x00R\x0ereleaseUpdated\x12A\n" +
2369 "\x0frelease_deleted\x18\x1d \x01(\v2\x16.ermite.ReleaseDeletedH\x00R\x0ereleaseDeleted\x12M\n" +2434 "\x0frelease_deleted\x18\x1d \x01(\v2\x16.ermite.ReleaseDeletedH\x00R\x0ereleaseDeleted\x12M\n" +
2370- "\x13release_unpublished\x18\x1e \x01(\v2\x1a.ermite.ReleaseUnpublishedH\x00R\x12releaseUnpublishedB\x06\n" +2435+ "\x13release_unpublished\x18\x1e \x01(\v2\x1a.ermite.ReleaseUnpublishedH\x00R\x12releaseUnpublished\x12>\n" +
2436+ "\x0eissue_resolved\x18\x1f \x01(\v2\x15.ermite.IssueResolvedH\x00R\rissueResolvedB\x06\n" +
2371 "\x04kind\"/\n" +2437 "\x04kind\"/\n" +
2372 "\vRepoCreated\x12 \n" +2438 "\vRepoCreated\x12 \n" +
2373 "\x04repo\x18\x01 \x01(\v2\f.ermite.RepoR\x04repo\"/\n" +2439 "\x04repo\x18\x01 \x01(\v2\f.ermite.RepoR\x04repo\"/\n" +
@@ -2419,6 +2485,8 @@ const file_ermite_event_proto_rawDesc = "" +
2419 "\x05issue\x18\x01 \x01(\v2\r.ermite.IssueR\x05issue\"2\n" +2485 "\x05issue\x18\x01 \x01(\v2\r.ermite.IssueR\x05issue\"2\n" +
2420 "\vIssueClosed\x12#\n" +2486 "\vIssueClosed\x12#\n" +
2421 "\x05issue\x18\x01 \x01(\v2\r.ermite.IssueR\x05issue\"4\n" +2487 "\x05issue\x18\x01 \x01(\v2\r.ermite.IssueR\x05issue\"4\n" +
2488+ "\rIssueResolved\x12#\n" +
2489+ "\x05issue\x18\x01 \x01(\v2\r.ermite.IssueR\x05issue\"4\n" +
2422 "\rIssueReopened\x12#\n" +2490 "\rIssueReopened\x12#\n" +
2423 "\x05issue\x18\x01 \x01(\v2\r.ermite.IssueR\x05issue\"l\n" +2491 "\x05issue\x18\x01 \x01(\v2\r.ermite.IssueR\x05issue\"l\n" +
2424 "\x0eIssueCommented\x12\x12\n" +2492 "\x0eIssueCommented\x12\x12\n" +
@@ -2487,7 +2555,7 @@ func file_ermite_event_proto_rawDescGZIP() []byte {
2487 return file_ermite_event_proto_rawDescData2555 return file_ermite_event_proto_rawDescData
2488 }2556 }
2489 2557
2490-var file_ermite_event_proto_msgTypes = make([]protoimpl.MessageInfo, 32)2558+var file_ermite_event_proto_msgTypes = make([]protoimpl.MessageInfo, 33)
2491 var file_ermite_event_proto_goTypes = []any{2559 var file_ermite_event_proto_goTypes = []any{
2492 (*WatchRequest)(nil), // 0: ermite.WatchRequest2560 (*WatchRequest)(nil), // 0: ermite.WatchRequest
2493 (*WatchResponse)(nil), // 1: ermite.WatchResponse2561 (*WatchResponse)(nil), // 1: ermite.WatchResponse
@@ -2509,87 +2577,90 @@ var file_ermite_event_proto_goTypes = []any{
2509 (*CommentResolved)(nil), // 17: ermite.CommentResolved2577 (*CommentResolved)(nil), // 17: ermite.CommentResolved
2510 (*IssueOpened)(nil), // 18: ermite.IssueOpened2578 (*IssueOpened)(nil), // 18: ermite.IssueOpened
2511 (*IssueClosed)(nil), // 19: ermite.IssueClosed2579 (*IssueClosed)(nil), // 19: ermite.IssueClosed
2512- (*IssueReopened)(nil), // 20: ermite.IssueReopened2580+ (*IssueResolved)(nil), // 20: ermite.IssueResolved
2513- (*IssueCommented)(nil), // 21: ermite.IssueCommented2581+ (*IssueReopened)(nil), // 21: ermite.IssueReopened
2514- (*IssueSubmitted)(nil), // 22: ermite.IssueSubmitted2582+ (*IssueCommented)(nil), // 22: ermite.IssueCommented
2515- (*Gap)(nil), // 23: ermite.Gap2583+ (*IssueSubmitted)(nil), // 23: ermite.IssueSubmitted
2516- (*RunUpdated)(nil), // 24: ermite.RunUpdated2584+ (*Gap)(nil), // 24: ermite.Gap
2517- (*JobUpdated)(nil), // 25: ermite.JobUpdated2585+ (*RunUpdated)(nil), // 25: ermite.RunUpdated
2518- (*MirrorFailed)(nil), // 26: ermite.MirrorFailed2586+ (*JobUpdated)(nil), // 26: ermite.JobUpdated
2519- (*MirrorRecovered)(nil), // 27: ermite.MirrorRecovered2587+ (*MirrorFailed)(nil), // 27: ermite.MirrorFailed
2520- (*ReleasePublished)(nil), // 28: ermite.ReleasePublished2588+ (*MirrorRecovered)(nil), // 28: ermite.MirrorRecovered
2521- (*ReleaseUpdated)(nil), // 29: ermite.ReleaseUpdated2589+ (*ReleasePublished)(nil), // 29: ermite.ReleasePublished
2522- (*ReleaseDeleted)(nil), // 30: ermite.ReleaseDeleted2590+ (*ReleaseUpdated)(nil), // 30: ermite.ReleaseUpdated
2523- (*ReleaseUnpublished)(nil), // 31: ermite.ReleaseUnpublished2591+ (*ReleaseDeleted)(nil), // 31: ermite.ReleaseDeleted
2524- (*timestamppb.Timestamp)(nil), // 32: google.protobuf.Timestamp2592+ (*ReleaseUnpublished)(nil), // 32: ermite.ReleaseUnpublished
2525- (*Repo)(nil), // 33: ermite.Repo2593+ (*timestamppb.Timestamp)(nil), // 33: google.protobuf.Timestamp
2526- (*MergeRequest)(nil), // 34: ermite.MergeRequest2594+ (*Repo)(nil), // 34: ermite.Repo
2527- (*Mergeability)(nil), // 35: ermite.Mergeability2595+ (*MergeRequest)(nil), // 35: ermite.MergeRequest
2528- (*Comment)(nil), // 36: ermite.Comment2596+ (*Mergeability)(nil), // 36: ermite.Mergeability
2529- (*Issue)(nil), // 37: ermite.Issue2597+ (*Comment)(nil), // 37: ermite.Comment
2530- (*IssueComment)(nil), // 38: ermite.IssueComment2598+ (*Issue)(nil), // 38: ermite.Issue
2531- (*Run)(nil), // 39: ermite.Run2599+ (*IssueComment)(nil), // 39: ermite.IssueComment
2532- (*RunJob)(nil), // 40: ermite.RunJob2600+ (*Run)(nil), // 40: ermite.Run
2533- (MirrorState)(0), // 41: ermite.MirrorState2601+ (*RunJob)(nil), // 41: ermite.RunJob
2602+ (MirrorState)(0), // 42: ermite.MirrorState
2534 }2603 }
2535 var file_ermite_event_proto_depIdxs = []int32{2604 var file_ermite_event_proto_depIdxs = []int32{
2536 2, // 0: ermite.WatchResponse.event:type_name -> ermite.Event2605 2, // 0: ermite.WatchResponse.event:type_name -> ermite.Event
2537- 32, // 1: ermite.Event.time:type_name -> google.protobuf.Timestamp2606+ 33, // 1: ermite.Event.time:type_name -> google.protobuf.Timestamp
2538 3, // 2: ermite.Event.repo_created:type_name -> ermite.RepoCreated2607 3, // 2: ermite.Event.repo_created:type_name -> ermite.RepoCreated
2539 4, // 3: ermite.Event.repo_updated:type_name -> ermite.RepoUpdated2608 4, // 3: ermite.Event.repo_updated:type_name -> ermite.RepoUpdated
2540 5, // 4: ermite.Event.repo_deleted:type_name -> ermite.RepoDeleted2609 5, // 4: ermite.Event.repo_deleted:type_name -> ermite.RepoDeleted
2541 6, // 5: ermite.Event.pushed:type_name -> ermite.Pushed2610 6, // 5: ermite.Event.pushed:type_name -> ermite.Pushed
2542- 23, // 6: ermite.Event.gap:type_name -> ermite.Gap2611+ 24, // 6: ermite.Event.gap:type_name -> ermite.Gap
2543 8, // 7: ermite.Event.merge_request_opened:type_name -> ermite.MergeRequestOpened2612 8, // 7: ermite.Event.merge_request_opened:type_name -> ermite.MergeRequestOpened
2544 9, // 8: ermite.Event.merge_request_merged:type_name -> ermite.MergeRequestMerged2613 9, // 8: ermite.Event.merge_request_merged:type_name -> ermite.MergeRequestMerged
2545 13, // 9: ermite.Event.merge_request_closed:type_name -> ermite.MergeRequestClosed2614 13, // 9: ermite.Event.merge_request_closed:type_name -> ermite.MergeRequestClosed
2546 14, // 10: ermite.Event.comment_added:type_name -> ermite.CommentAdded2615 14, // 10: ermite.Event.comment_added:type_name -> ermite.CommentAdded
2547- 24, // 11: ermite.Event.run_updated:type_name -> ermite.RunUpdated2616+ 25, // 11: ermite.Event.run_updated:type_name -> ermite.RunUpdated
2548- 25, // 12: ermite.Event.job_updated:type_name -> ermite.JobUpdated2617+ 26, // 12: ermite.Event.job_updated:type_name -> ermite.JobUpdated
2549 15, // 13: ermite.Event.comment_edited:type_name -> ermite.CommentEdited2618 15, // 13: ermite.Event.comment_edited:type_name -> ermite.CommentEdited
2550 16, // 14: ermite.Event.comment_deleted:type_name -> ermite.CommentDeleted2619 16, // 14: ermite.Event.comment_deleted:type_name -> ermite.CommentDeleted
2551 17, // 15: ermite.Event.comment_resolved:type_name -> ermite.CommentResolved2620 17, // 15: ermite.Event.comment_resolved:type_name -> ermite.CommentResolved
2552 18, // 16: ermite.Event.issue_opened:type_name -> ermite.IssueOpened2621 18, // 16: ermite.Event.issue_opened:type_name -> ermite.IssueOpened
2553 19, // 17: ermite.Event.issue_closed:type_name -> ermite.IssueClosed2622 19, // 17: ermite.Event.issue_closed:type_name -> ermite.IssueClosed
2554- 20, // 18: ermite.Event.issue_reopened:type_name -> ermite.IssueReopened2623+ 21, // 18: ermite.Event.issue_reopened:type_name -> ermite.IssueReopened
2555- 21, // 19: ermite.Event.issue_commented:type_name -> ermite.IssueCommented2624+ 22, // 19: ermite.Event.issue_commented:type_name -> ermite.IssueCommented
2556- 22, // 20: ermite.Event.issue_submitted:type_name -> ermite.IssueSubmitted2625+ 23, // 20: ermite.Event.issue_submitted:type_name -> ermite.IssueSubmitted
2557 12, // 21: ermite.Event.merge_request_mergeability:type_name -> ermite.MergeRequestMergeability2626 12, // 21: ermite.Event.merge_request_mergeability:type_name -> ermite.MergeRequestMergeability
2558- 26, // 22: ermite.Event.mirror_failed:type_name -> ermite.MirrorFailed2627+ 27, // 22: ermite.Event.mirror_failed:type_name -> ermite.MirrorFailed
2559- 27, // 23: ermite.Event.mirror_recovered:type_name -> ermite.MirrorRecovered2628+ 28, // 23: ermite.Event.mirror_recovered:type_name -> ermite.MirrorRecovered
2560 10, // 24: ermite.Event.merge_request_auto_merge_enabled:type_name -> ermite.MergeRequestAutoMergeEnabled2629 10, // 24: ermite.Event.merge_request_auto_merge_enabled:type_name -> ermite.MergeRequestAutoMergeEnabled
2561 11, // 25: ermite.Event.merge_request_auto_merge_cancelled:type_name -> ermite.MergeRequestAutoMergeCancelled2630 11, // 25: ermite.Event.merge_request_auto_merge_cancelled:type_name -> ermite.MergeRequestAutoMergeCancelled
2562- 28, // 26: ermite.Event.release_published:type_name -> ermite.ReleasePublished2631+ 29, // 26: ermite.Event.release_published:type_name -> ermite.ReleasePublished
2563- 29, // 27: ermite.Event.release_updated:type_name -> ermite.ReleaseUpdated2632+ 30, // 27: ermite.Event.release_updated:type_name -> ermite.ReleaseUpdated
2564- 30, // 28: ermite.Event.release_deleted:type_name -> ermite.ReleaseDeleted2633+ 31, // 28: ermite.Event.release_deleted:type_name -> ermite.ReleaseDeleted
2565- 31, // 29: ermite.Event.release_unpublished:type_name -> ermite.ReleaseUnpublished2634+ 32, // 29: ermite.Event.release_unpublished:type_name -> ermite.ReleaseUnpublished
2566- 33, // 30: ermite.RepoCreated.repo:type_name -> ermite.Repo2635+ 20, // 30: ermite.Event.issue_resolved:type_name -> ermite.IssueResolved
2567- 33, // 31: ermite.RepoUpdated.repo:type_name -> ermite.Repo2636+ 34, // 31: ermite.RepoCreated.repo:type_name -> ermite.Repo
2568- 7, // 32: ermite.Pushed.ref_updates:type_name -> ermite.RefUpdate2637+ 34, // 32: ermite.RepoUpdated.repo:type_name -> ermite.Repo
2569- 34, // 33: ermite.MergeRequestOpened.merge_request:type_name -> ermite.MergeRequest2638+ 7, // 33: ermite.Pushed.ref_updates:type_name -> ermite.RefUpdate
2570- 34, // 34: ermite.MergeRequestMerged.merge_request:type_name -> ermite.MergeRequest2639+ 35, // 34: ermite.MergeRequestOpened.merge_request:type_name -> ermite.MergeRequest
2571- 34, // 35: ermite.MergeRequestAutoMergeEnabled.merge_request:type_name -> ermite.MergeRequest2640+ 35, // 35: ermite.MergeRequestMerged.merge_request:type_name -> ermite.MergeRequest
2572- 34, // 36: ermite.MergeRequestAutoMergeCancelled.merge_request:type_name -> ermite.MergeRequest2641+ 35, // 36: ermite.MergeRequestAutoMergeEnabled.merge_request:type_name -> ermite.MergeRequest
2573- 35, // 37: ermite.MergeRequestMergeability.mergeability:type_name -> ermite.Mergeability2642+ 35, // 37: ermite.MergeRequestAutoMergeCancelled.merge_request:type_name -> ermite.MergeRequest
2574- 34, // 38: ermite.MergeRequestClosed.merge_request:type_name -> ermite.MergeRequest2643+ 36, // 38: ermite.MergeRequestMergeability.mergeability:type_name -> ermite.Mergeability
2575- 36, // 39: ermite.CommentAdded.comment:type_name -> ermite.Comment2644+ 35, // 39: ermite.MergeRequestClosed.merge_request:type_name -> ermite.MergeRequest
2576- 36, // 40: ermite.CommentEdited.comment:type_name -> ermite.Comment2645+ 37, // 40: ermite.CommentAdded.comment:type_name -> ermite.Comment
2577- 36, // 41: ermite.CommentDeleted.comment:type_name -> ermite.Comment2646+ 37, // 41: ermite.CommentEdited.comment:type_name -> ermite.Comment
2578- 36, // 42: ermite.CommentResolved.comment:type_name -> ermite.Comment2647+ 37, // 42: ermite.CommentDeleted.comment:type_name -> ermite.Comment
2579- 37, // 43: ermite.IssueOpened.issue:type_name -> ermite.Issue2648+ 37, // 43: ermite.CommentResolved.comment:type_name -> ermite.Comment
2580- 37, // 44: ermite.IssueClosed.issue:type_name -> ermite.Issue2649+ 38, // 44: ermite.IssueOpened.issue:type_name -> ermite.Issue
2581- 37, // 45: ermite.IssueReopened.issue:type_name -> ermite.Issue2650+ 38, // 45: ermite.IssueClosed.issue:type_name -> ermite.Issue
2582- 38, // 46: ermite.IssueCommented.comment:type_name -> ermite.IssueComment2651+ 38, // 46: ermite.IssueResolved.issue:type_name -> ermite.Issue
2583- 39, // 47: ermite.RunUpdated.run:type_name -> ermite.Run2652+ 38, // 47: ermite.IssueReopened.issue:type_name -> ermite.Issue
2584- 40, // 48: ermite.JobUpdated.job:type_name -> ermite.RunJob2653+ 39, // 48: ermite.IssueCommented.comment:type_name -> ermite.IssueComment
2585- 41, // 49: ermite.MirrorFailed.state:type_name -> ermite.MirrorState2654+ 40, // 49: ermite.RunUpdated.run:type_name -> ermite.Run
2586- 0, // 50: ermite.EventService.Watch:input_type -> ermite.WatchRequest2655+ 41, // 50: ermite.JobUpdated.job:type_name -> ermite.RunJob
2587- 1, // 51: ermite.EventService.Watch:output_type -> ermite.WatchResponse2656+ 42, // 51: ermite.MirrorFailed.state:type_name -> ermite.MirrorState
2588- 51, // [51:52] is the sub-list for method output_type2657+ 0, // 52: ermite.EventService.Watch:input_type -> ermite.WatchRequest
2589- 50, // [50:51] is the sub-list for method input_type2658+ 1, // 53: ermite.EventService.Watch:output_type -> ermite.WatchResponse
2590- 50, // [50:50] is the sub-list for extension type_name2659+ 53, // [53:54] is the sub-list for method output_type
2591- 50, // [50:50] is the sub-list for extension extendee2660+ 52, // [52:53] is the sub-list for method input_type
2592- 0, // [0:50] is the sub-list for field type_name2661+ 52, // [52:52] is the sub-list for extension type_name
2662+ 52, // [52:52] is the sub-list for extension extendee
2663+ 0, // [0:52] is the sub-list for field type_name
2593 }2664 }
2594 2665
2595 func init() { file_ermite_event_proto_init() }2666 func init() { file_ermite_event_proto_init() }
@@ -2631,6 +2702,7 @@ func file_ermite_event_proto_init() {
2631 (*Event_ReleaseUpdated)(nil),2702 (*Event_ReleaseUpdated)(nil),
2632 (*Event_ReleaseDeleted)(nil),2703 (*Event_ReleaseDeleted)(nil),
2633 (*Event_ReleaseUnpublished)(nil),2704 (*Event_ReleaseUnpublished)(nil),
2705+ (*Event_IssueResolved)(nil),
2634 }2706 }
2635 type x struct{}2707 type x struct{}
2636 out := protoimpl.TypeBuilder{2708 out := protoimpl.TypeBuilder{
@@ -2638,7 +2710,7 @@ func file_ermite_event_proto_init() {
2638 GoPackagePath: reflect.TypeOf(x{}).PkgPath(),2710 GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
2639 RawDescriptor: unsafe.Slice(unsafe.StringData(file_ermite_event_proto_rawDesc), len(file_ermite_event_proto_rawDesc)),2711 RawDescriptor: unsafe.Slice(unsafe.StringData(file_ermite_event_proto_rawDesc), len(file_ermite_event_proto_rawDesc)),
2640 NumEnums: 0,2712 NumEnums: 0,
2641- NumMessages: 32,2713+ NumMessages: 33,
2642 NumExtensions: 0,2714 NumExtensions: 0,
2643 NumServices: 1,2715 NumServices: 1,
2644 },2716 },
M gen/ermite/issue.pb.go +216 -83 generated file: collapsed
M gen/ermite/merge_request.pb.go +546 -174 generated file: collapsed
M issue_test.go +2 -1
@@ -19,6 +19,7 @@ func TestIssueProcedures(t *testing.T) {
1919 ermiteconnect.IssueServiceAddIssueCommentProcedure: "AddIssueComment",
2020 ermiteconnect.IssueServiceCloseIssueProcedure: "CloseIssue",
2121 ermiteconnect.IssueServiceReopenIssueProcedure: "ReopenIssue",
22+ ermiteconnect.IssueServiceResolveIssueProcedure: "ResolveIssue",
2223 ermiteconnect.IssueServiceListPendingIssuesProcedure: "ListPendingIssues",
2324 ermiteconnect.IssueServiceApproveIssueProcedure: "ApproveIssue",
2425 ermiteconnect.IssueServiceRejectIssueProcedure: "RejectIssue",
@@ -58,7 +59,7 @@ func TestIssueContract(t *testing.T) {
5859 if ermite.Scope_SCOPE_ISSUE_WRITE != 11 {
5960 t.Fatal("issue:write scope number changed")
6061 }
61- for name, want := range map[string]int32{"ISSUE_STATE_UNSPECIFIED": 0, "ISSUE_STATE_OPEN": 1, "ISSUE_STATE_CLOSED": 2, "ISSUE_STATE_PENDING": 3} {
62+ for name, want := range map[string]int32{"ISSUE_STATE_UNSPECIFIED": 0, "ISSUE_STATE_OPEN": 1, "ISSUE_STATE_CLOSED": 2, "ISSUE_STATE_PENDING": 3, "ISSUE_STATE_RESOLVED": 4} {
6263 if got := ermite.IssueState_value[name]; got != want {
6364 t.Errorf("%s = %d, want %d", name, got, want)
6465 }
@@ -19,6 +19,7 @@ func TestIssueProcedures(t *testing.T) {
19 ermiteconnect.IssueServiceAddIssueCommentProcedure: "AddIssueComment",19 ermiteconnect.IssueServiceAddIssueCommentProcedure: "AddIssueComment",
20 ermiteconnect.IssueServiceCloseIssueProcedure: "CloseIssue",20 ermiteconnect.IssueServiceCloseIssueProcedure: "CloseIssue",
21 ermiteconnect.IssueServiceReopenIssueProcedure: "ReopenIssue",21 ermiteconnect.IssueServiceReopenIssueProcedure: "ReopenIssue",
22+ ermiteconnect.IssueServiceResolveIssueProcedure: "ResolveIssue",
22 ermiteconnect.IssueServiceListPendingIssuesProcedure: "ListPendingIssues",23 ermiteconnect.IssueServiceListPendingIssuesProcedure: "ListPendingIssues",
23 ermiteconnect.IssueServiceApproveIssueProcedure: "ApproveIssue",24 ermiteconnect.IssueServiceApproveIssueProcedure: "ApproveIssue",
24 ermiteconnect.IssueServiceRejectIssueProcedure: "RejectIssue",25 ermiteconnect.IssueServiceRejectIssueProcedure: "RejectIssue",
@@ -58,7 +59,7 @@ func TestIssueContract(t *testing.T) {
58 if ermite.Scope_SCOPE_ISSUE_WRITE != 11 {59 if ermite.Scope_SCOPE_ISSUE_WRITE != 11 {
59 t.Fatal("issue:write scope number changed")60 t.Fatal("issue:write scope number changed")
60 }61 }
61- for name, want := range map[string]int32{"ISSUE_STATE_UNSPECIFIED": 0, "ISSUE_STATE_OPEN": 1, "ISSUE_STATE_CLOSED": 2, "ISSUE_STATE_PENDING": 3} {62+ for name, want := range map[string]int32{"ISSUE_STATE_UNSPECIFIED": 0, "ISSUE_STATE_OPEN": 1, "ISSUE_STATE_CLOSED": 2, "ISSUE_STATE_PENDING": 3, "ISSUE_STATE_RESOLVED": 4} {
62 if got := ermite.IssueState_value[name]; got != want {63 if got := ermite.IssueState_value[name]; got != want {
63 t.Errorf("%s = %d, want %d", name, got, want)64 t.Errorf("%s = %d, want %d", name, got, want)
64 }65 }
M proto/ermite/event.proto +15 -4
@@ -21,9 +21,10 @@ service EventService {
2121 // for merge requests, merge_request_opened, merge_request_merged,
2222 // merge_request_closed, comment_added, comment_edited, comment_deleted and
2323 // comment_resolved (a thread resolved or reopened); for issues, issue_opened,
24- // issue_closed, issue_reopened and issue_commented, and issue_submitted. Each
25- // one is delivered on the "repo:<name>" topic of its repository and on
26- // "home", subject to the visibility of the repository, except
24+ // issue_closed, issue_resolved, issue_reopened and issue_commented, and
25+ // issue_submitted. Each one is delivered on the "repo:<name>" topic of its
26+ // repository and on "home", subject to the visibility of the repository,
27+ // except
2728 // issue_submitted: it is delivered only on the "owner" topic, never on
2829 // "home" or "repo:<name>", and carries no content (see IssueSubmitted).
2930 //
@@ -153,6 +154,8 @@ message Event {
153154 ReleaseDeleted release_deleted = 29;
154155 // ReleaseUnpublished reports a release turned into a draft after tag deletion.
155156 ReleaseUnpublished release_unpublished = 30;
157+ // IssueResolved: an issue was resolved.
158+ IssueResolved issue_resolved = 31;
156159 }
157160 }
158161
@@ -290,12 +293,20 @@ message IssueOpened {
290293 Issue issue = 1;
291294 }
292295
293-// IssueClosed reports a closed issue.
296+// IssueClosed reports a closed issue. A merge that resolves an issue sends
297+// issue_resolved, not issue_closed.
294298 message IssueClosed {
295299 // Issue is the issue after closing, including its repository and number.
296300 Issue issue = 1;
297301 }
298302
303+// IssueResolved reports a resolved issue.
304+message IssueResolved {
305+ // Issue is the issue after resolving, including its repository, number and
306+ // closed_by_merge_request.
307+ Issue issue = 1;
308+}
309+
299310 // IssueReopened reports a reopened issue.
300311 message IssueReopened {
301312 // Issue is the issue after reopening, including its repository and number.
@@ -21,9 +21,10 @@ service EventService {
21 // for merge requests, merge_request_opened, merge_request_merged,21 // for merge requests, merge_request_opened, merge_request_merged,
22 // merge_request_closed, comment_added, comment_edited, comment_deleted and22 // merge_request_closed, comment_added, comment_edited, comment_deleted and
23 // comment_resolved (a thread resolved or reopened); for issues, issue_opened,23 // comment_resolved (a thread resolved or reopened); for issues, issue_opened,
24- // issue_closed, issue_reopened and issue_commented, and issue_submitted. Each24+ // issue_closed, issue_resolved, issue_reopened and issue_commented, and
25- // one is delivered on the "repo:<name>" topic of its repository and on25+ // issue_submitted. Each one is delivered on the "repo:<name>" topic of its
26- // "home", subject to the visibility of the repository, except26+ // repository and on "home", subject to the visibility of the repository,
27+ // except
27 // issue_submitted: it is delivered only on the "owner" topic, never on28 // issue_submitted: it is delivered only on the "owner" topic, never on
28 // "home" or "repo:<name>", and carries no content (see IssueSubmitted).29 // "home" or "repo:<name>", and carries no content (see IssueSubmitted).
29 //30 //
@@ -153,6 +154,8 @@ message Event {
153 ReleaseDeleted release_deleted = 29;154 ReleaseDeleted release_deleted = 29;
154 // ReleaseUnpublished reports a release turned into a draft after tag deletion.155 // ReleaseUnpublished reports a release turned into a draft after tag deletion.
155 ReleaseUnpublished release_unpublished = 30;156 ReleaseUnpublished release_unpublished = 30;
157+ // IssueResolved: an issue was resolved.
158+ IssueResolved issue_resolved = 31;
156 }159 }
157 }160 }
158 161
@@ -290,12 +293,20 @@ message IssueOpened {
290 Issue issue = 1;293 Issue issue = 1;
291 }294 }
292 295
293-// IssueClosed reports a closed issue.296+// IssueClosed reports a closed issue. A merge that resolves an issue sends
297+// issue_resolved, not issue_closed.
294 message IssueClosed {298 message IssueClosed {
295 // Issue is the issue after closing, including its repository and number.299 // Issue is the issue after closing, including its repository and number.
296 Issue issue = 1;300 Issue issue = 1;
297 }301 }
298 302
303+// IssueResolved reports a resolved issue.
304+message IssueResolved {
305+ // Issue is the issue after resolving, including its repository, number and
306+ // closed_by_merge_request.
307+ Issue issue = 1;
308+}
309+
299 // IssueReopened reports a reopened issue.310 // IssueReopened reports a reopened issue.
300 message IssueReopened {311 message IssueReopened {
301 // Issue is the issue after reopening, including its repository and number.312 // Issue is the issue after reopening, including its repository and number.
M proto/ermite/issue.proto +46 -15
@@ -14,10 +14,14 @@ enum IssueState {
1414 ISSUE_STATE_UNSPECIFIED = 0;
1515 // The issue is open.
1616 ISSUE_STATE_OPEN = 1;
17- // The issue is closed.
17+ // The issue is closed without being resolved (won't fix, duplicate, ...).
1818 ISSUE_STATE_CLOSED = 2;
1919 // Reserved for later use: awaiting moderation, owner-only.
2020 ISSUE_STATE_PENDING = 3;
21+ // The issue was fixed: by the merge of a merge request with a closing
22+ // reference, or by hand (ResolveIssue). CLOSED means closed without being
23+ // resolved.
24+ ISSUE_STATE_RESOLVED = 4;
2125 }
2226
2327 // Issue is a discussion in a repository.
@@ -45,9 +49,10 @@ message Issue {
4549 google.protobuf.Timestamp updated_at = 8;
4650 // CommentCount is the number of comments on the issue.
4751 int32 comment_count = 9;
48- // ClosedByMergeRequest is the number of the merge request whose merge closed
49- // the issue (a closing reference such as "Fixes #N"); 0 when the issue was
50- // closed by hand or is open. Reset when the issue is reopened.
52+ // ClosedByMergeRequest is the number of the merge request whose merge
53+ // resolved the issue (a closing reference such as "Fixes #N"); 0 when the
54+ // issue was resolved by hand, is closed, or is open. Reset when the issue is
55+ // reopened.
5156 int64 closed_by_merge_request = 10;
5257 }
5358
@@ -86,29 +91,35 @@ message IssueComment {
8691 //
8792 // Reading (ListIssues, GetIssue) needs the same access as reading the
8893 // repository: nothing for a public one, the repo:read scope for a private one.
89-// Writing (CreateIssue, AddIssueComment, CloseIssue, ReopenIssue) needs the
94+// Writing (CreateIssue, AddIssueComment, CloseIssue, ResolveIssue,
95+// ReopenIssue) needs the
9096 // owner or a token with the issue:write scope on the repository; branch
9197 // prefixes do not restrict it. A caller without credentials gets
9298 // unauthenticated, one with an insufficient scope gets permission_denied, and
9399 // one that cannot read the repository gets not_found.
94100 //
95101 // A closing reference ("Fixes #N", "Closes #N", "Resolves #N") in the title,
96-// description or commit messages of a merge request closes the issue when the
97-// request is merged, and only then; the issue.closed event and Issue carry
98-// closed_by_merge_request. Servers that report these links (GetIssueResponse.
99-// references, Issue.closed_by_merge_request) list "issues.links" in
100-// GetVersionResponse.features; older servers leave them empty.
102+// description or commit messages of a merge request resolves the issue when the
103+// request is merged, and only then: the issue gets the state RESOLVED, an
104+// issue.resolved event is sent, and Issue carries closed_by_merge_request.
105+// Servers that report these links (GetIssueResponse.references,
106+// Issue.closed_by_merge_request) list "issues.links" in
107+// GetVersionResponse.features; older servers leave them empty. Servers that
108+// also keep the history of issues (GetIssueResponse.events), implement
109+// ResolveIssue and the RESOLVED state list "issues.resolve".
101110 //
102111 // Text fields are normalized to NFC and stripped of control and Unicode
103112 // bidirectional characters (line breaks and tabs stay in bodies and comments).
104113 // The title is one line of 1 to 120 code points; body and comment text are at
105114 // most 10,000 code points and a comment must not be blank. A text that breaks
106115 // a rule is rejected with invalid_argument. A comment on an issue that already
107-// holds 1,000 comments gives resource_exhausted. Closing an issue that is not
108-// open, or reopening one that is not closed, gives failed_precondition.
116+// holds 1,000 comments gives resource_exhausted. Closing or resolving an issue
117+// that is not open, or reopening one that is neither closed nor resolved,
118+// gives failed_precondition.
109119 //
110-// The ordinary RPCs only return issues in state OPEN or CLOSED, and
111-// ListIssues with state ISSUE_STATE_PENDING is invalid_argument. Submissions
120+// The ordinary RPCs return issues in state OPEN, CLOSED or RESOLVED, and
121+// ListIssues accepts these three states; ISSUE_STATE_PENDING is
122+// invalid_argument. Submissions
112123 // from the public form wait as PendingIssue records, reachable only through
113124 // the three moderation RPCs (ListPendingIssues, ApproveIssue, RejectIssue).
114125 // These need owner rights (root, an owner session, or a token holding every
@@ -126,7 +137,10 @@ service IssueService {
126137 rpc AddIssueComment(AddIssueCommentRequest) returns (AddIssueCommentResponse);
127138 // CloseIssue closes an issue. Needs the issue:write scope.
128139 rpc CloseIssue(CloseIssueRequest) returns (CloseIssueResponse);
129- // ReopenIssue reopens an issue. Needs the issue:write scope.
140+ // ResolveIssue marks an open issue as resolved. Needs the issue:write scope.
141+ rpc ResolveIssue(ResolveIssueRequest) returns (ResolveIssueResponse);
142+ // ReopenIssue reopens a closed or resolved issue. Needs the issue:write
143+ // scope.
130144 rpc ReopenIssue(ReopenIssueRequest) returns (ReopenIssueResponse);
131145 // ListPendingIssues lists issues awaiting moderation, oldest first. Owner
132146 // rights only; anyone else gets NOT_FOUND.
@@ -196,6 +210,9 @@ message GetIssueResponse {
196210 // References are the merge requests naming the issue, ascending by number,
197211 // at most 100.
198212 repeated IssueReference references = 3;
213+ // Events are the history of the issue, oldest first, at most 500 (a server
214+ // limit). Clients interleave them with the comments by created_at.
215+ repeated IssueEvent events = 4;
199216 }
200217
201218 // AddIssueCommentRequest describes the comment to add.
@@ -228,6 +245,20 @@ message CloseIssueResponse {
228245 Issue issue = 1;
229246 }
230247
248+// ResolveIssueRequest names the issue to resolve.
249+message ResolveIssueRequest {
250+ // Repo is the repository name.
251+ string repo = 1;
252+ // Number is the issue number.
253+ int64 number = 2;
254+}
255+
256+// ResolveIssueResponse holds the issue after resolving.
257+message ResolveIssueResponse {
258+ // Issue is the resolved issue.
259+ Issue issue = 1;
260+}
261+
231262 // ReopenIssueRequest names the issue to reopen.
232263 message ReopenIssueRequest {
233264 // Repo is the repository name.
@@ -14,10 +14,14 @@ enum IssueState {
14 ISSUE_STATE_UNSPECIFIED = 0;14 ISSUE_STATE_UNSPECIFIED = 0;
15 // The issue is open.15 // The issue is open.
16 ISSUE_STATE_OPEN = 1;16 ISSUE_STATE_OPEN = 1;
17- // The issue is closed.17+ // The issue is closed without being resolved (won't fix, duplicate, ...).
18 ISSUE_STATE_CLOSED = 2;18 ISSUE_STATE_CLOSED = 2;
19 // Reserved for later use: awaiting moderation, owner-only.19 // Reserved for later use: awaiting moderation, owner-only.
20 ISSUE_STATE_PENDING = 3;20 ISSUE_STATE_PENDING = 3;
21+ // The issue was fixed: by the merge of a merge request with a closing
22+ // reference, or by hand (ResolveIssue). CLOSED means closed without being
23+ // resolved.
24+ ISSUE_STATE_RESOLVED = 4;
21 }25 }
22 26
23 // Issue is a discussion in a repository.27 // Issue is a discussion in a repository.
@@ -45,9 +49,10 @@ message Issue {
45 google.protobuf.Timestamp updated_at = 8;49 google.protobuf.Timestamp updated_at = 8;
46 // CommentCount is the number of comments on the issue.50 // CommentCount is the number of comments on the issue.
47 int32 comment_count = 9;51 int32 comment_count = 9;
48- // ClosedByMergeRequest is the number of the merge request whose merge closed52+ // ClosedByMergeRequest is the number of the merge request whose merge
49- // the issue (a closing reference such as "Fixes #N"); 0 when the issue was53+ // resolved the issue (a closing reference such as "Fixes #N"); 0 when the
50- // closed by hand or is open. Reset when the issue is reopened.54+ // issue was resolved by hand, is closed, or is open. Reset when the issue is
55+ // reopened.
51 int64 closed_by_merge_request = 10;56 int64 closed_by_merge_request = 10;
52 }57 }
53 58
@@ -86,29 +91,35 @@ message IssueComment {
86 //91 //
87 // Reading (ListIssues, GetIssue) needs the same access as reading the92 // Reading (ListIssues, GetIssue) needs the same access as reading the
88 // repository: nothing for a public one, the repo:read scope for a private one.93 // repository: nothing for a public one, the repo:read scope for a private one.
89-// Writing (CreateIssue, AddIssueComment, CloseIssue, ReopenIssue) needs the94+// Writing (CreateIssue, AddIssueComment, CloseIssue, ResolveIssue,
95+// ReopenIssue) needs the
90 // owner or a token with the issue:write scope on the repository; branch96 // owner or a token with the issue:write scope on the repository; branch
91 // prefixes do not restrict it. A caller without credentials gets97 // prefixes do not restrict it. A caller without credentials gets
92 // unauthenticated, one with an insufficient scope gets permission_denied, and98 // unauthenticated, one with an insufficient scope gets permission_denied, and
93 // one that cannot read the repository gets not_found.99 // one that cannot read the repository gets not_found.
94 //100 //
95 // A closing reference ("Fixes #N", "Closes #N", "Resolves #N") in the title,101 // A closing reference ("Fixes #N", "Closes #N", "Resolves #N") in the title,
96-// description or commit messages of a merge request closes the issue when the102+// description or commit messages of a merge request resolves the issue when the
97-// request is merged, and only then; the issue.closed event and Issue carry103+// request is merged, and only then: the issue gets the state RESOLVED, an
98-// closed_by_merge_request. Servers that report these links (GetIssueResponse.104+// issue.resolved event is sent, and Issue carries closed_by_merge_request.
99-// references, Issue.closed_by_merge_request) list "issues.links" in105+// Servers that report these links (GetIssueResponse.references,
100-// GetVersionResponse.features; older servers leave them empty.106+// Issue.closed_by_merge_request) list "issues.links" in
107+// GetVersionResponse.features; older servers leave them empty. Servers that
108+// also keep the history of issues (GetIssueResponse.events), implement
109+// ResolveIssue and the RESOLVED state list "issues.resolve".
101 //110 //
102 // Text fields are normalized to NFC and stripped of control and Unicode111 // Text fields are normalized to NFC and stripped of control and Unicode
103 // bidirectional characters (line breaks and tabs stay in bodies and comments).112 // bidirectional characters (line breaks and tabs stay in bodies and comments).
104 // The title is one line of 1 to 120 code points; body and comment text are at113 // The title is one line of 1 to 120 code points; body and comment text are at
105 // most 10,000 code points and a comment must not be blank. A text that breaks114 // most 10,000 code points and a comment must not be blank. A text that breaks
106 // a rule is rejected with invalid_argument. A comment on an issue that already115 // a rule is rejected with invalid_argument. A comment on an issue that already
107-// holds 1,000 comments gives resource_exhausted. Closing an issue that is not116+// holds 1,000 comments gives resource_exhausted. Closing or resolving an issue
108-// open, or reopening one that is not closed, gives failed_precondition.117+// that is not open, or reopening one that is neither closed nor resolved,
118+// gives failed_precondition.
109 //119 //
110-// The ordinary RPCs only return issues in state OPEN or CLOSED, and120+// The ordinary RPCs return issues in state OPEN, CLOSED or RESOLVED, and
111-// ListIssues with state ISSUE_STATE_PENDING is invalid_argument. Submissions121+// ListIssues accepts these three states; ISSUE_STATE_PENDING is
122+// invalid_argument. Submissions
112 // from the public form wait as PendingIssue records, reachable only through123 // from the public form wait as PendingIssue records, reachable only through
113 // the three moderation RPCs (ListPendingIssues, ApproveIssue, RejectIssue).124 // the three moderation RPCs (ListPendingIssues, ApproveIssue, RejectIssue).
114 // These need owner rights (root, an owner session, or a token holding every125 // These need owner rights (root, an owner session, or a token holding every
@@ -126,7 +137,10 @@ service IssueService {
126 rpc AddIssueComment(AddIssueCommentRequest) returns (AddIssueCommentResponse);137 rpc AddIssueComment(AddIssueCommentRequest) returns (AddIssueCommentResponse);
127 // CloseIssue closes an issue. Needs the issue:write scope.138 // CloseIssue closes an issue. Needs the issue:write scope.
128 rpc CloseIssue(CloseIssueRequest) returns (CloseIssueResponse);139 rpc CloseIssue(CloseIssueRequest) returns (CloseIssueResponse);
129- // ReopenIssue reopens an issue. Needs the issue:write scope.140+ // ResolveIssue marks an open issue as resolved. Needs the issue:write scope.
141+ rpc ResolveIssue(ResolveIssueRequest) returns (ResolveIssueResponse);
142+ // ReopenIssue reopens a closed or resolved issue. Needs the issue:write
143+ // scope.
130 rpc ReopenIssue(ReopenIssueRequest) returns (ReopenIssueResponse);144 rpc ReopenIssue(ReopenIssueRequest) returns (ReopenIssueResponse);
131 // ListPendingIssues lists issues awaiting moderation, oldest first. Owner145 // ListPendingIssues lists issues awaiting moderation, oldest first. Owner
132 // rights only; anyone else gets NOT_FOUND.146 // rights only; anyone else gets NOT_FOUND.
@@ -196,6 +210,9 @@ message GetIssueResponse {
196 // References are the merge requests naming the issue, ascending by number,210 // References are the merge requests naming the issue, ascending by number,
197 // at most 100.211 // at most 100.
198 repeated IssueReference references = 3;212 repeated IssueReference references = 3;
213+ // Events are the history of the issue, oldest first, at most 500 (a server
214+ // limit). Clients interleave them with the comments by created_at.
215+ repeated IssueEvent events = 4;
199 }216 }
200 217
201 // AddIssueCommentRequest describes the comment to add.218 // AddIssueCommentRequest describes the comment to add.
@@ -228,6 +245,20 @@ message CloseIssueResponse {
228 Issue issue = 1;245 Issue issue = 1;
229 }246 }
230 247
248+// ResolveIssueRequest names the issue to resolve.
249+message ResolveIssueRequest {
250+ // Repo is the repository name.
251+ string repo = 1;
252+ // Number is the issue number.
253+ int64 number = 2;
254+}
255+
256+// ResolveIssueResponse holds the issue after resolving.
257+message ResolveIssueResponse {
258+ // Issue is the resolved issue.
259+ Issue issue = 1;
260+}
261+
231 // ReopenIssueRequest names the issue to reopen.262 // ReopenIssueRequest names the issue to reopen.
232 message ReopenIssueRequest {263 message ReopenIssueRequest {
233 // Repo is the repository name.264 // Repo is the repository name.
M proto/ermite/merge_request.proto +78 -0
@@ -402,6 +402,76 @@ message ListMergeRequestsResponse {
402402 string next_page_token = 2;
403403 }
404404
405+// MergeRequestIssueState is where an issue named by a merge request is in its
406+// life. Values share their numbers with IssueState (3, awaiting moderation,
407+// is never shown here). It exists because issue.proto imports this file and
408+// cannot be imported back.
409+enum MergeRequestIssueState {
410+ // Not set. Never returned by the server.
411+ MERGE_REQUEST_ISSUE_STATE_UNSPECIFIED = 0;
412+ // The issue is open.
413+ MERGE_REQUEST_ISSUE_STATE_OPEN = 1;
414+ // The issue is closed without being resolved.
415+ MERGE_REQUEST_ISSUE_STATE_CLOSED = 2;
416+ // The issue was resolved, by a merge or by hand.
417+ MERGE_REQUEST_ISSUE_STATE_RESOLVED = 4;
418+}
419+
420+// MergeRequestIssue is an issue of the same repository that a merge request
421+// names ("#N").
422+message MergeRequestIssue {
423+ // Number is the number of the issue.
424+ int64 number = 1;
425+ // Title is the title of the issue.
426+ string title = 2;
427+ // State is where the issue is in its life.
428+ MergeRequestIssueState state = 3;
429+ // Closes says that a closing reference names the issue: merging the request
430+ // resolves it.
431+ bool closes = 4;
432+}
433+
434+// IssueEventKind is what happened in an IssueEvent.
435+enum IssueEventKind {
436+ // Not set. Never returned by the server.
437+ ISSUE_EVENT_KIND_UNSPECIFIED = 0;
438+ // A merge request started naming the issue; closes says whether with a
439+ // closing reference.
440+ ISSUE_EVENT_KIND_REFERENCED = 1;
441+ // The issue was closed without being resolved.
442+ ISSUE_EVENT_KIND_CLOSED = 2;
443+ // The issue was reopened.
444+ ISSUE_EVENT_KIND_REOPENED = 3;
445+ // The issue was resolved; merge_request is set when a merge resolved it.
446+ ISSUE_EVENT_KIND_RESOLVED = 4;
447+}
448+
449+// IssueEvent is one entry in the history of an issue. Events are append-only:
450+// a reference that later disappears does not remove its event.
451+message IssueEvent {
452+ // Id identifies the event within its issue. Opaque. Events of different
453+ // issues can share an id: key them by (issue, id).
454+ string id = 1;
455+ // Kind is what happened.
456+ IssueEventKind kind = 2;
457+ // Issue is the number of the issue.
458+ int64 issue = 3;
459+ // MergeRequest is the number of the merge request involved; 0 if none.
460+ int64 merge_request = 4;
461+ // MergeRequestTitle is the title of that merge request at read time; empty
462+ // if none.
463+ string merge_request_title = 5;
464+ // Closes says that the reference was a closing one. Only set for
465+ // ISSUE_EVENT_KIND_REFERENCED.
466+ bool closes = 6;
467+ // Actor names who caused the event, like Issue.author: the label of the
468+ // token or session. For events triggered by a merge, the label of who
469+ // merged.
470+ string actor = 7;
471+ // CreatedAt is when the event happened.
472+ google.protobuf.Timestamp created_at = 8;
473+}
474+
405475 // GetMergeRequestRequest selects a merge request.
406476 message GetMergeRequestRequest {
407477 // Repo is the repository name.
@@ -452,6 +522,14 @@ message GetMergeRequestResponse {
452522 // Verdicts are the current verdicts, one per author who gave one, ordered
453523 // by the comment that carries them, oldest first.
454524 repeated AuthorVerdict verdicts = 10;
525+ // Issues are the issues of the same repository that the merge request names,
526+ // ascending by number, at most 100. Empty when issues are off.
527+ repeated MergeRequestIssue issues = 11;
528+ // IssueEvents are the history entries that involve this merge request: the
529+ // REFERENCED and RESOLVED events of the issues it names or once named,
530+ // oldest first, at most 500. An event can name an issue that is no longer
531+ // in issues. Empty when issues are off.
532+ repeated IssueEvent issue_events = 12;
455533 }
456534
457535 // AddCommentRequest describes the comment to add.
@@ -402,6 +402,76 @@ message ListMergeRequestsResponse {
402 string next_page_token = 2;402 string next_page_token = 2;
403 }403 }
404 404
405+// MergeRequestIssueState is where an issue named by a merge request is in its
406+// life. Values share their numbers with IssueState (3, awaiting moderation,
407+// is never shown here). It exists because issue.proto imports this file and
408+// cannot be imported back.
409+enum MergeRequestIssueState {
410+ // Not set. Never returned by the server.
411+ MERGE_REQUEST_ISSUE_STATE_UNSPECIFIED = 0;
412+ // The issue is open.
413+ MERGE_REQUEST_ISSUE_STATE_OPEN = 1;
414+ // The issue is closed without being resolved.
415+ MERGE_REQUEST_ISSUE_STATE_CLOSED = 2;
416+ // The issue was resolved, by a merge or by hand.
417+ MERGE_REQUEST_ISSUE_STATE_RESOLVED = 4;
418+}
419+
420+// MergeRequestIssue is an issue of the same repository that a merge request
421+// names ("#N").
422+message MergeRequestIssue {
423+ // Number is the number of the issue.
424+ int64 number = 1;
425+ // Title is the title of the issue.
426+ string title = 2;
427+ // State is where the issue is in its life.
428+ MergeRequestIssueState state = 3;
429+ // Closes says that a closing reference names the issue: merging the request
430+ // resolves it.
431+ bool closes = 4;
432+}
433+
434+// IssueEventKind is what happened in an IssueEvent.
435+enum IssueEventKind {
436+ // Not set. Never returned by the server.
437+ ISSUE_EVENT_KIND_UNSPECIFIED = 0;
438+ // A merge request started naming the issue; closes says whether with a
439+ // closing reference.
440+ ISSUE_EVENT_KIND_REFERENCED = 1;
441+ // The issue was closed without being resolved.
442+ ISSUE_EVENT_KIND_CLOSED = 2;
443+ // The issue was reopened.
444+ ISSUE_EVENT_KIND_REOPENED = 3;
445+ // The issue was resolved; merge_request is set when a merge resolved it.
446+ ISSUE_EVENT_KIND_RESOLVED = 4;
447+}
448+
449+// IssueEvent is one entry in the history of an issue. Events are append-only:
450+// a reference that later disappears does not remove its event.
451+message IssueEvent {
452+ // Id identifies the event within its issue. Opaque. Events of different
453+ // issues can share an id: key them by (issue, id).
454+ string id = 1;
455+ // Kind is what happened.
456+ IssueEventKind kind = 2;
457+ // Issue is the number of the issue.
458+ int64 issue = 3;
459+ // MergeRequest is the number of the merge request involved; 0 if none.
460+ int64 merge_request = 4;
461+ // MergeRequestTitle is the title of that merge request at read time; empty
462+ // if none.
463+ string merge_request_title = 5;
464+ // Closes says that the reference was a closing one. Only set for
465+ // ISSUE_EVENT_KIND_REFERENCED.
466+ bool closes = 6;
467+ // Actor names who caused the event, like Issue.author: the label of the
468+ // token or session. For events triggered by a merge, the label of who
469+ // merged.
470+ string actor = 7;
471+ // CreatedAt is when the event happened.
472+ google.protobuf.Timestamp created_at = 8;
473+}
474+
405 // GetMergeRequestRequest selects a merge request.475 // GetMergeRequestRequest selects a merge request.
406 message GetMergeRequestRequest {476 message GetMergeRequestRequest {
407 // Repo is the repository name.477 // Repo is the repository name.
@@ -452,6 +522,14 @@ message GetMergeRequestResponse {
452 // Verdicts are the current verdicts, one per author who gave one, ordered522 // Verdicts are the current verdicts, one per author who gave one, ordered
453 // by the comment that carries them, oldest first.523 // by the comment that carries them, oldest first.
454 repeated AuthorVerdict verdicts = 10;524 repeated AuthorVerdict verdicts = 10;
525+ // Issues are the issues of the same repository that the merge request names,
526+ // ascending by number, at most 100. Empty when issues are off.
527+ repeated MergeRequestIssue issues = 11;
528+ // IssueEvents are the history entries that involve this merge request: the
529+ // REFERENCED and RESOLVED events of the issues it names or once named,
530+ // oldest first, at most 500. An event can name an issue that is no longer
531+ // in issues. Empty when issues are off.
532+ repeated IssueEvent issue_events = 12;
455 }533 }
456 534
457 // AddCommentRequest describes the comment to add.535 // AddCommentRequest describes the comment to add.

Keyboard shortcuts

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

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

Branches 2

Tags 18

↑↓ moveenter openesc close