detached 5b21a8b

Merge b97dc8626c51d183d4f3373be9b3fd8f6b155755 into acbb5c20351995c53de7df85d8c5f1880bbe3307

commit
5b21a8b57e6de225e26b36a6f5695ab02fc13c85
author
ermite · · 2026-10-20 15:28 UTC
merge of
acbb5c2 + b97dc86 · diff against the first parent
signature
unsigned
3 files · +269 -129
M docs/services.md +1 -1
@@ -6,7 +6,7 @@
66 | `GitService` | `ListRefs`, `GetTree`, `ListPaths`, `GetBlob` (streamed), `ListCommits`, `GetCommit` (structured diff), `ResolveRevision` |
77 | `TokenService` | `CreateToken` (secret shown once), `ListTokens`, `RevokeToken` |
88 | `MergeRequestService` | `CreateMergeRequest`, `ListMergeRequests`, `GetMergeRequest` (commits, diff, comments), `AddComment`, `EditComment`, `DeleteComment`, `ResolveComment`, `CloseMergeRequest`, `MergeMergeRequest` (modes fast-forward, squash, merge commit), `MarkRead`. Open merge requests carry `mergeability` (up to date, behind, conflict, or checking) and `Watch` publishes `MergeRequestMergeability` each time a result is settled for new branch tips (feature `merge_requests.mergeability`) |
9-| `IssueService` | `CreateIssue`, `ListIssues`, `GetIssue` (comments), `AddIssueComment`, `CloseIssue`, `ReopenIssue`; owner only: `ListPendingIssues`, `ApproveIssue`, `RejectIssue`. Feature `issues`. Issues share numbers with merge requests |
9+| `IssueService` | `CreateIssue`, `ListIssues`, `GetIssue` (comments, merge requests naming the issue, `closed_by_merge_request`), `AddIssueComment`, `CloseIssue`, `ReopenIssue`; owner only: `ListPendingIssues`, `ApproveIssue`, `RejectIssue`. Features `issues`, `issues.links`. Issues share numbers with merge requests |
1010 | `SessionService` | `CreateLoginLink`, `SignOutEverywhere` (owner only) |
1111 | `EventService` | `Watch` (streamed, resumable). Topics `home`, `repo:<name>` and `owner` (owner rights only). Events 17–21: `issue_opened`, `issue_closed`, `issue_reopened`, `issue_commented`, and `issue_submitted` (only on `owner`, no content). Event 22: `merge_request_mergeability` |
1212 | `ServerService` | `GetVersion` (version and features), `GetSigningKey`, `RotateOIDCKey` (owner only) |
@@ -6,7 +6,7 @@
6 | `GitService` | `ListRefs`, `GetTree`, `ListPaths`, `GetBlob` (streamed), `ListCommits`, `GetCommit` (structured diff), `ResolveRevision` |6 | `GitService` | `ListRefs`, `GetTree`, `ListPaths`, `GetBlob` (streamed), `ListCommits`, `GetCommit` (structured diff), `ResolveRevision` |
7 | `TokenService` | `CreateToken` (secret shown once), `ListTokens`, `RevokeToken` |7 | `TokenService` | `CreateToken` (secret shown once), `ListTokens`, `RevokeToken` |
8 | `MergeRequestService` | `CreateMergeRequest`, `ListMergeRequests`, `GetMergeRequest` (commits, diff, comments), `AddComment`, `EditComment`, `DeleteComment`, `ResolveComment`, `CloseMergeRequest`, `MergeMergeRequest` (modes fast-forward, squash, merge commit), `MarkRead`. Open merge requests carry `mergeability` (up to date, behind, conflict, or checking) and `Watch` publishes `MergeRequestMergeability` each time a result is settled for new branch tips (feature `merge_requests.mergeability`) |8 | `MergeRequestService` | `CreateMergeRequest`, `ListMergeRequests`, `GetMergeRequest` (commits, diff, comments), `AddComment`, `EditComment`, `DeleteComment`, `ResolveComment`, `CloseMergeRequest`, `MergeMergeRequest` (modes fast-forward, squash, merge commit), `MarkRead`. Open merge requests carry `mergeability` (up to date, behind, conflict, or checking) and `Watch` publishes `MergeRequestMergeability` each time a result is settled for new branch tips (feature `merge_requests.mergeability`) |
9-| `IssueService` | `CreateIssue`, `ListIssues`, `GetIssue` (comments), `AddIssueComment`, `CloseIssue`, `ReopenIssue`; owner only: `ListPendingIssues`, `ApproveIssue`, `RejectIssue`. Feature `issues`. Issues share numbers with merge requests |9+| `IssueService` | `CreateIssue`, `ListIssues`, `GetIssue` (comments, merge requests naming the issue, `closed_by_merge_request`), `AddIssueComment`, `CloseIssue`, `ReopenIssue`; owner only: `ListPendingIssues`, `ApproveIssue`, `RejectIssue`. Features `issues`, `issues.links`. Issues share numbers with merge requests |
10 | `SessionService` | `CreateLoginLink`, `SignOutEverywhere` (owner only) |10 | `SessionService` | `CreateLoginLink`, `SignOutEverywhere` (owner only) |
11 | `EventService` | `Watch` (streamed, resumable). Topics `home`, `repo:<name>` and `owner` (owner rights only). Events 17–21: `issue_opened`, `issue_closed`, `issue_reopened`, `issue_commented`, and `issue_submitted` (only on `owner`, no content). Event 22: `merge_request_mergeability` |11 | `EventService` | `Watch` (streamed, resumable). Topics `home`, `repo:<name>` and `owner` (owner rights only). Events 17–21: `issue_opened`, `issue_closed`, `issue_reopened`, `issue_commented`, and `issue_submitted` (only on `owner`, no content). Event 22: `merge_request_mergeability` |
12 | `ServerService` | `GetVersion` (version and features), `GetSigningKey`, `RotateOIDCKey` (owner only) |12 | `ServerService` | `GetVersion` (version and features), `GetSigningKey`, `RotateOIDCKey` (owner only) |
M gen/ermite/issue.pb.go +239 -128 generated file: collapsed
M proto/ermite/issue.proto +29 -0
@@ -4,6 +4,7 @@ syntax = "proto3";
44
55 package ermite;
66
7+import "ermite/merge_request.proto";
78 import "google/protobuf/timestamp.proto";
89
910 // IssueState is where an issue is in its life.
@@ -44,6 +45,24 @@ message Issue {
4445 google.protobuf.Timestamp updated_at = 8;
4546 // CommentCount is the number of comments on the issue.
4647 int32 comment_count = 9;
48+ // ClosedByMergeRequest is the number of the merge request whose merge closed
49+ // the issue (a closing reference such as "Fixes #N"); 0 when the issue was
50+ // closed by hand or is open. Reset when the issue is reopened.
51+ int64 closed_by_merge_request = 10;
52+}
53+
54+// IssueReference is a merge request of the same repository that names the
55+// issue ("#N") in its title, description, notes or commit messages.
56+message IssueReference {
57+ // Number is the number of the merge request.
58+ int64 number = 1;
59+ // Title is the title of the merge request.
60+ string title = 2;
61+ // State is where the merge request is in its life.
62+ MergeRequestState state = 3;
63+ // Closes says that a closing reference ("Fixes #N") names the issue:
64+ // merging the request closes it.
65+ bool closes = 4;
4766 }
4867
4968 // IssueComment is a note on an issue.
@@ -73,6 +92,13 @@ message IssueComment {
7392 // unauthenticated, one with an insufficient scope gets permission_denied, and
7493 // one that cannot read the repository gets not_found.
7594 //
95+// A closing reference ("Fixes #N", "Closes #N", "Resolves #N") in the title,
96+// description or commit messages of a merge request closes the issue when the
97+// request is merged, and only then; the issue.closed event and Issue carry
98+// closed_by_merge_request. Servers that report these links (GetIssueResponse.
99+// references, Issue.closed_by_merge_request) list "issues.links" in
100+// GetVersionResponse.features; older servers leave them empty.
101+//
76102 // Text fields are normalized to NFC and stripped of control and Unicode
77103 // bidirectional characters (line breaks and tabs stay in bodies and comments).
78104 // The title is one line of 1 to 120 code points; body and comment text are at
@@ -167,6 +193,9 @@ message GetIssueResponse {
167193 Issue issue = 1;
168194 // Comments are every comment of the issue, oldest first.
169195 repeated IssueComment comments = 2;
196+ // References are the merge requests naming the issue, ascending by number,
197+ // at most 100.
198+ repeated IssueReference references = 3;
170199 }
171200
172201 // AddIssueCommentRequest describes the comment to add.
@@ -4,6 +4,7 @@ syntax = "proto3";
4 4
5 package ermite;5 package ermite;
6 6
7+import "ermite/merge_request.proto";
7 import "google/protobuf/timestamp.proto";8 import "google/protobuf/timestamp.proto";
8 9
9 // IssueState is where an issue is in its life.10 // IssueState is where an issue is in its life.
@@ -44,6 +45,24 @@ message Issue {
44 google.protobuf.Timestamp updated_at = 8;45 google.protobuf.Timestamp updated_at = 8;
45 // CommentCount is the number of comments on the issue.46 // CommentCount is the number of comments on the issue.
46 int32 comment_count = 9;47 int32 comment_count = 9;
48+ // ClosedByMergeRequest is the number of the merge request whose merge closed
49+ // the issue (a closing reference such as "Fixes #N"); 0 when the issue was
50+ // closed by hand or is open. Reset when the issue is reopened.
51+ int64 closed_by_merge_request = 10;
52+}
53+
54+// IssueReference is a merge request of the same repository that names the
55+// issue ("#N") in its title, description, notes or commit messages.
56+message IssueReference {
57+ // Number is the number of the merge request.
58+ int64 number = 1;
59+ // Title is the title of the merge request.
60+ string title = 2;
61+ // State is where the merge request is in its life.
62+ MergeRequestState state = 3;
63+ // Closes says that a closing reference ("Fixes #N") names the issue:
64+ // merging the request closes it.
65+ bool closes = 4;
47 }66 }
48 67
49 // IssueComment is a note on an issue.68 // IssueComment is a note on an issue.
@@ -73,6 +92,13 @@ message IssueComment {
73 // unauthenticated, one with an insufficient scope gets permission_denied, and92 // unauthenticated, one with an insufficient scope gets permission_denied, and
74 // one that cannot read the repository gets not_found.93 // one that cannot read the repository gets not_found.
75 //94 //
95+// A closing reference ("Fixes #N", "Closes #N", "Resolves #N") in the title,
96+// description or commit messages of a merge request closes the issue when the
97+// request is merged, and only then; the issue.closed event and Issue carry
98+// closed_by_merge_request. Servers that report these links (GetIssueResponse.
99+// references, Issue.closed_by_merge_request) list "issues.links" in
100+// GetVersionResponse.features; older servers leave them empty.
101+//
76 // Text fields are normalized to NFC and stripped of control and Unicode102 // Text fields are normalized to NFC and stripped of control and Unicode
77 // bidirectional characters (line breaks and tabs stay in bodies and comments).103 // bidirectional characters (line breaks and tabs stay in bodies and comments).
78 // The title is one line of 1 to 120 code points; body and comment text are at104 // The title is one line of 1 to 120 code points; body and comment text are at
@@ -167,6 +193,9 @@ message GetIssueResponse {
167 Issue issue = 1;193 Issue issue = 1;
168 // Comments are every comment of the issue, oldest first.194 // Comments are every comment of the issue, oldest first.
169 repeated IssueComment comments = 2;195 repeated IssueComment comments = 2;
196+ // References are the merge requests naming the issue, ascending by number,
197+ // at most 100.
198+ repeated IssueReference references = 3;
170 }199 }
171 200
172 // AddIssueCommentRequest describes the comment to add.201 // AddIssueCommentRequest describes the comment to add.

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