detached 6c7e2b3

docs(api): document Watch limits and revocation, and the commit page depth

commit
6c7e2b344114b6cf2593f905ab14b144c01330c9
author
brice · · 2026-10-10 10:57 UTC
parent
dca0ed7
signature
GPG VerifiedCD88F9E564E0102646FB6077A1A07C7C7C3E349D · arch-gpg Verified for the committer email
4 files · +33 -3
M gen/ermite/ermiteconnect/event.connect.go +18 -0
@@ -50,6 +50,15 @@ type EventServiceClient interface {
5050 // When resume_after is no longer buffered (or unknown), the stream begins
5151 // with a Gap event, then continues with the oldest buffered event: the client
5252 // must reload its state. Without resume_after, only new events are sent.
53+ //
54+ // The access of the caller is checked again for every event: the stream ends
55+ // with unauthenticated when the token was revoked or has expired (the server
56+ // may take a few seconds to notice). A repository that becomes private
57+ // sends one last repo_updated to the callers who could read it before, with
58+ // the new visibility and nothing else about it; no later event of it
59+ // reaches them. The server limits the watchers: more than 64 topics is
60+ // invalid_argument, and too many concurrent streams, in total or from one
61+ // client, is resource_exhausted.
5362 Watch(context.Context, *connect.Request[ermite.WatchRequest]) (*connect.ServerStreamForClient[ermite.WatchResponse], error)
5463 }
5564
@@ -94,6 +103,15 @@ type EventServiceHandler interface {
94103 // When resume_after is no longer buffered (or unknown), the stream begins
95104 // with a Gap event, then continues with the oldest buffered event: the client
96105 // must reload its state. Without resume_after, only new events are sent.
106+ //
107+ // The access of the caller is checked again for every event: the stream ends
108+ // with unauthenticated when the token was revoked or has expired (the server
109+ // may take a few seconds to notice). A repository that becomes private
110+ // sends one last repo_updated to the callers who could read it before, with
111+ // the new visibility and nothing else about it; no later event of it
112+ // reaches them. The server limits the watchers: more than 64 topics is
113+ // invalid_argument, and too many concurrent streams, in total or from one
114+ // client, is resource_exhausted.
97115 Watch(context.Context, *connect.Request[ermite.WatchRequest], *connect.ServerStream[ermite.WatchResponse]) error
98116 }
99117
@@ -50,6 +50,15 @@ type EventServiceClient interface {
50 // When resume_after is no longer buffered (or unknown), the stream begins50 // When resume_after is no longer buffered (or unknown), the stream begins
51 // with a Gap event, then continues with the oldest buffered event: the client51 // with a Gap event, then continues with the oldest buffered event: the client
52 // must reload its state. Without resume_after, only new events are sent.52 // must reload its state. Without resume_after, only new events are sent.
53+ //
54+ // The access of the caller is checked again for every event: the stream ends
55+ // with unauthenticated when the token was revoked or has expired (the server
56+ // may take a few seconds to notice). A repository that becomes private
57+ // sends one last repo_updated to the callers who could read it before, with
58+ // the new visibility and nothing else about it; no later event of it
59+ // reaches them. The server limits the watchers: more than 64 topics is
60+ // invalid_argument, and too many concurrent streams, in total or from one
61+ // client, is resource_exhausted.
53 Watch(context.Context, *connect.Request[ermite.WatchRequest]) (*connect.ServerStreamForClient[ermite.WatchResponse], error)62 Watch(context.Context, *connect.Request[ermite.WatchRequest]) (*connect.ServerStreamForClient[ermite.WatchResponse], error)
54 }63 }
55 64
@@ -94,6 +103,15 @@ type EventServiceHandler interface {
94 // When resume_after is no longer buffered (or unknown), the stream begins103 // When resume_after is no longer buffered (or unknown), the stream begins
95 // with a Gap event, then continues with the oldest buffered event: the client104 // with a Gap event, then continues with the oldest buffered event: the client
96 // must reload its state. Without resume_after, only new events are sent.105 // must reload its state. Without resume_after, only new events are sent.
106+ //
107+ // The access of the caller is checked again for every event: the stream ends
108+ // with unauthenticated when the token was revoked or has expired (the server
109+ // may take a few seconds to notice). A repository that becomes private
110+ // sends one last repo_updated to the callers who could read it before, with
111+ // the new visibility and nothing else about it; no later event of it
112+ // reaches them. The server limits the watchers: more than 64 topics is
113+ // invalid_argument, and too many concurrent streams, in total or from one
114+ // client, is resource_exhausted.
97 Watch(context.Context, *connect.Request[ermite.WatchRequest], *connect.ServerStream[ermite.WatchResponse]) error115 Watch(context.Context, *connect.Request[ermite.WatchRequest], *connect.ServerStream[ermite.WatchResponse]) error
98 }116 }
99 117
M gen/ermite/ermiteconnect/git.connect.go +4 -2
@@ -67,7 +67,8 @@ type GitServiceClient interface {
6767 GetBlob(context.Context, *connect.Request[ermite.GetBlobRequest]) (*connect.ServerStreamForClient[ermite.GetBlobResponse], error)
6868 // ListCommits lists the history reachable from a revision, newest first
6969 // (Git's default order), optionally limited to the commits that touched a
70- // path.
70+ // path. A page_token that points deeper than 100,000 commits into the
71+ // history is invalid_argument.
7172 ListCommits(context.Context, *connect.Request[ermite.ListCommitsRequest]) (*connect.Response[ermite.ListCommitsResponse], error)
7273 // GetCommit returns one commit with its statistics and its diff.
7374 GetCommit(context.Context, *connect.Request[ermite.GetCommitRequest]) (*connect.Response[ermite.GetCommitResponse], error)
@@ -182,7 +183,8 @@ type GitServiceHandler interface {
182183 GetBlob(context.Context, *connect.Request[ermite.GetBlobRequest], *connect.ServerStream[ermite.GetBlobResponse]) error
183184 // ListCommits lists the history reachable from a revision, newest first
184185 // (Git's default order), optionally limited to the commits that touched a
185- // path.
186+ // path. A page_token that points deeper than 100,000 commits into the
187+ // history is invalid_argument.
186188 ListCommits(context.Context, *connect.Request[ermite.ListCommitsRequest]) (*connect.Response[ermite.ListCommitsResponse], error)
187189 // GetCommit returns one commit with its statistics and its diff.
188190 GetCommit(context.Context, *connect.Request[ermite.GetCommitRequest]) (*connect.Response[ermite.GetCommitResponse], error)
@@ -67,7 +67,8 @@ type GitServiceClient interface {
67 GetBlob(context.Context, *connect.Request[ermite.GetBlobRequest]) (*connect.ServerStreamForClient[ermite.GetBlobResponse], error)67 GetBlob(context.Context, *connect.Request[ermite.GetBlobRequest]) (*connect.ServerStreamForClient[ermite.GetBlobResponse], error)
68 // ListCommits lists the history reachable from a revision, newest first68 // ListCommits lists the history reachable from a revision, newest first
69 // (Git's default order), optionally limited to the commits that touched a69 // (Git's default order), optionally limited to the commits that touched a
70- // path.70+ // path. A page_token that points deeper than 100,000 commits into the
71+ // history is invalid_argument.
71 ListCommits(context.Context, *connect.Request[ermite.ListCommitsRequest]) (*connect.Response[ermite.ListCommitsResponse], error)72 ListCommits(context.Context, *connect.Request[ermite.ListCommitsRequest]) (*connect.Response[ermite.ListCommitsResponse], error)
72 // GetCommit returns one commit with its statistics and its diff.73 // GetCommit returns one commit with its statistics and its diff.
73 GetCommit(context.Context, *connect.Request[ermite.GetCommitRequest]) (*connect.Response[ermite.GetCommitResponse], error)74 GetCommit(context.Context, *connect.Request[ermite.GetCommitRequest]) (*connect.Response[ermite.GetCommitResponse], error)
@@ -182,7 +183,8 @@ type GitServiceHandler interface {
182 GetBlob(context.Context, *connect.Request[ermite.GetBlobRequest], *connect.ServerStream[ermite.GetBlobResponse]) error183 GetBlob(context.Context, *connect.Request[ermite.GetBlobRequest], *connect.ServerStream[ermite.GetBlobResponse]) error
183 // ListCommits lists the history reachable from a revision, newest first184 // ListCommits lists the history reachable from a revision, newest first
184 // (Git's default order), optionally limited to the commits that touched a185 // (Git's default order), optionally limited to the commits that touched a
185- // path.186+ // path. A page_token that points deeper than 100,000 commits into the
187+ // history is invalid_argument.
186 ListCommits(context.Context, *connect.Request[ermite.ListCommitsRequest]) (*connect.Response[ermite.ListCommitsResponse], error)188 ListCommits(context.Context, *connect.Request[ermite.ListCommitsRequest]) (*connect.Response[ermite.ListCommitsResponse], error)
187 // GetCommit returns one commit with its statistics and its diff.189 // GetCommit returns one commit with its statistics and its diff.
188 GetCommit(context.Context, *connect.Request[ermite.GetCommitRequest]) (*connect.Response[ermite.GetCommitResponse], error)190 GetCommit(context.Context, *connect.Request[ermite.GetCommitRequest]) (*connect.Response[ermite.GetCommitResponse], error)
M proto/ermite/event.proto +9 -0
@@ -18,6 +18,15 @@ service EventService {
1818 // When resume_after is no longer buffered (or unknown), the stream begins
1919 // with a Gap event, then continues with the oldest buffered event: the client
2020 // must reload its state. Without resume_after, only new events are sent.
21+ //
22+ // The access of the caller is checked again for every event: the stream ends
23+ // with unauthenticated when the token was revoked or has expired (the server
24+ // may take a few seconds to notice). A repository that becomes private
25+ // sends one last repo_updated to the callers who could read it before, with
26+ // the new visibility and nothing else about it; no later event of it
27+ // reaches them. The server limits the watchers: more than 64 topics is
28+ // invalid_argument, and too many concurrent streams, in total or from one
29+ // client, is resource_exhausted.
2130 rpc Watch(WatchRequest) returns (stream WatchResponse);
2231 }
2332
@@ -18,6 +18,15 @@ service EventService {
18 // When resume_after is no longer buffered (or unknown), the stream begins18 // When resume_after is no longer buffered (or unknown), the stream begins
19 // with a Gap event, then continues with the oldest buffered event: the client19 // with a Gap event, then continues with the oldest buffered event: the client
20 // must reload its state. Without resume_after, only new events are sent.20 // must reload its state. Without resume_after, only new events are sent.
21+ //
22+ // The access of the caller is checked again for every event: the stream ends
23+ // with unauthenticated when the token was revoked or has expired (the server
24+ // may take a few seconds to notice). A repository that becomes private
25+ // sends one last repo_updated to the callers who could read it before, with
26+ // the new visibility and nothing else about it; no later event of it
27+ // reaches them. The server limits the watchers: more than 64 topics is
28+ // invalid_argument, and too many concurrent streams, in total or from one
29+ // client, is resource_exhausted.
21 rpc Watch(WatchRequest) returns (stream WatchResponse);30 rpc Watch(WatchRequest) returns (stream WatchResponse);
22 }31 }
23 32
M proto/ermite/git.proto +2 -1
@@ -89,7 +89,8 @@ service GitService {
8989 rpc GetBlob(GetBlobRequest) returns (stream GetBlobResponse);
9090 // ListCommits lists the history reachable from a revision, newest first
9191 // (Git's default order), optionally limited to the commits that touched a
92- // path.
92+ // path. A page_token that points deeper than 100,000 commits into the
93+ // history is invalid_argument.
9394 rpc ListCommits(ListCommitsRequest) returns (ListCommitsResponse);
9495 // GetCommit returns one commit with its statistics and its diff.
9596 rpc GetCommit(GetCommitRequest) returns (GetCommitResponse);
@@ -89,7 +89,8 @@ service GitService {
89 rpc GetBlob(GetBlobRequest) returns (stream GetBlobResponse);89 rpc GetBlob(GetBlobRequest) returns (stream GetBlobResponse);
90 // ListCommits lists the history reachable from a revision, newest first90 // ListCommits lists the history reachable from a revision, newest first
91 // (Git's default order), optionally limited to the commits that touched a91 // (Git's default order), optionally limited to the commits that touched a
92- // path.92+ // path. A page_token that points deeper than 100,000 commits into the
93+ // history is invalid_argument.
93 rpc ListCommits(ListCommitsRequest) returns (ListCommitsResponse);94 rpc ListCommits(ListCommitsRequest) returns (ListCommitsResponse);
94 // GetCommit returns one commit with its statistics and its diff.95 // GetCommit returns one commit with its statistics and its diff.
95 rpc GetCommit(GetCommitRequest) returns (GetCommitResponse);96 rpc GetCommit(GetCommitRequest) returns (GetCommitResponse);

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