detached 86d856e

Merge pull request 'feat(api): add GitService.ListPaths' (#4) from feat/file-finder into main

Reviewed-on: https://git.bnema.dev/bnema/ermite-api/pulls/4
commit
86d856ecea6953c5040023a98a8e87f6b12100e2
author
bnema · · 2026-10-12 05:25 UTC
merge of
e9394b7 + cb56994 · diff against the first parent
signature
SSH UnverifiedSHA256:VOCA5lYARHcbKDZ7GhTV45VmcjWnJ6ZQIBazj17LivA The key is unknown
5 files · +297 -84
M README.md +1 -1
@@ -17,7 +17,7 @@ Handlers are mounted under `/-/api/` by the server. Errors are Connect codes.
1717 | Service | RPCs |
1818 |---|---|
1919 | `RepoService` | `ListRepos`, `GetRepo`, `CreateRepo`, `UpdateRepo` (field mask, merge settings), `DeleteRepo` |
20-| `GitService` | `ListRefs`, `GetTree`, `GetBlob` (streamed), `ListCommits`, `GetCommit` (structured diff), `ResolveRevision` |
20+| `GitService` | `ListRefs`, `GetTree`, `ListPaths`, `GetBlob` (streamed), `ListCommits`, `GetCommit` (structured diff), `ResolveRevision` |
2121 | `TokenService` | `CreateToken` (secret shown once), `ListTokens`, `RevokeToken` |
2222 | `MergeRequestService` | `CreateMergeRequest`, `ListMergeRequests`, `GetMergeRequest` (commits, diff, comments), `AddComment`, `ResolveComment`, `CloseMergeRequest`, `MergeMergeRequest`, `MarkRead` |
2323 | `SessionService` | `CreateLoginLink`, `SignOutEverywhere` (owner only) |
@@ -17,7 +17,7 @@ Handlers are mounted under `/-/api/` by the server. Errors are Connect codes.
17 | Service | RPCs |17 | Service | RPCs |
18 |---|---|18 |---|---|
19 | `RepoService` | `ListRepos`, `GetRepo`, `CreateRepo`, `UpdateRepo` (field mask, merge settings), `DeleteRepo` |19 | `RepoService` | `ListRepos`, `GetRepo`, `CreateRepo`, `UpdateRepo` (field mask, merge settings), `DeleteRepo` |
20-| `GitService` | `ListRefs`, `GetTree`, `GetBlob` (streamed), `ListCommits`, `GetCommit` (structured diff), `ResolveRevision` |20+| `GitService` | `ListRefs`, `GetTree`, `ListPaths`, `GetBlob` (streamed), `ListCommits`, `GetCommit` (structured diff), `ResolveRevision` |
21 | `TokenService` | `CreateToken` (secret shown once), `ListTokens`, `RevokeToken` |21 | `TokenService` | `CreateToken` (secret shown once), `ListTokens`, `RevokeToken` |
22 | `MergeRequestService` | `CreateMergeRequest`, `ListMergeRequests`, `GetMergeRequest` (commits, diff, comments), `AddComment`, `ResolveComment`, `CloseMergeRequest`, `MergeMergeRequest`, `MarkRead` |22 | `MergeRequestService` | `CreateMergeRequest`, `ListMergeRequests`, `GetMergeRequest` (commits, diff, comments), `AddComment`, `ResolveComment`, `CloseMergeRequest`, `MergeMergeRequest`, `MarkRead` |
23 | `SessionService` | `CreateLoginLink`, `SignOutEverywhere` (owner only) |23 | `SessionService` | `CreateLoginLink`, `SignOutEverywhere` (owner only) |
M gen/ermite/ermiteconnect/git.connect.go +40 -0
@@ -39,6 +39,8 @@ const (
3939 GitServiceListRefsProcedure = "/ermite.GitService/ListRefs"
4040 // GitServiceGetTreeProcedure is the fully-qualified name of the GitService's GetTree RPC.
4141 GitServiceGetTreeProcedure = "/ermite.GitService/GetTree"
42+ // GitServiceListPathsProcedure is the fully-qualified name of the GitService's ListPaths RPC.
43+ GitServiceListPathsProcedure = "/ermite.GitService/ListPaths"
4244 // GitServiceGetBlobProcedure is the fully-qualified name of the GitService's GetBlob RPC.
4345 GitServiceGetBlobProcedure = "/ermite.GitService/GetBlob"
4446 // GitServiceListCommitsProcedure is the fully-qualified name of the GitService's ListCommits RPC.
@@ -59,6 +61,13 @@ type GitServiceClient interface {
5961 // not_found if the path does not exist and invalid_argument if it is not a
6062 // directory.
6163 GetTree(context.Context, *connect.Request[ermite.GetTreeRequest]) (*connect.Response[ermite.GetTreeResponse], error)
64+ // ListPaths lists the paths of every file and symbolic link of a revision,
65+ // recursively, in Git tree order (the order of `git ls-tree -r`). Directories
66+ // and submodules are not listed, nor paths GetBlob cannot address (not valid
67+ // UTF-8, or with a control character). Fails with not_found for an unknown
68+ // revision or an empty repository. Servers that have it advertise the
69+ // feature "git.list_paths" in GetVersion.
70+ ListPaths(context.Context, *connect.Request[ermite.ListPathsRequest]) (*connect.Response[ermite.ListPathsResponse], error)
6271 // GetBlob streams the content of a file at a revision, in chunks of at most
6372 // 64 KiB. The first message carries the metadata in info, then the chunks
6473 // follow; the memory used by the server does not depend on the file size.
@@ -99,6 +108,12 @@ func NewGitServiceClient(httpClient connect.HTTPClient, baseURL string, opts ...
99108 connect.WithSchema(gitServiceMethods.ByName("GetTree")),
100109 connect.WithClientOptions(opts...),
101110 ),
111+ listPaths: connect.NewClient[ermite.ListPathsRequest, ermite.ListPathsResponse](
112+ httpClient,
113+ baseURL+GitServiceListPathsProcedure,
114+ connect.WithSchema(gitServiceMethods.ByName("ListPaths")),
115+ connect.WithClientOptions(opts...),
116+ ),
102117 getBlob: connect.NewClient[ermite.GetBlobRequest, ermite.GetBlobResponse](
103118 httpClient,
104119 baseURL+GitServiceGetBlobProcedure,
@@ -130,6 +145,7 @@ func NewGitServiceClient(httpClient connect.HTTPClient, baseURL string, opts ...
130145 type gitServiceClient struct {
131146 listRefs *connect.Client[ermite.ListRefsRequest, ermite.ListRefsResponse]
132147 getTree *connect.Client[ermite.GetTreeRequest, ermite.GetTreeResponse]
148+ listPaths *connect.Client[ermite.ListPathsRequest, ermite.ListPathsResponse]
133149 getBlob *connect.Client[ermite.GetBlobRequest, ermite.GetBlobResponse]
134150 listCommits *connect.Client[ermite.ListCommitsRequest, ermite.ListCommitsResponse]
135151 getCommit *connect.Client[ermite.GetCommitRequest, ermite.GetCommitResponse]
@@ -146,6 +162,11 @@ func (c *gitServiceClient) GetTree(ctx context.Context, req *connect.Request[erm
146162 return c.getTree.CallUnary(ctx, req)
147163 }
148164
165+// ListPaths calls ermite.GitService.ListPaths.
166+func (c *gitServiceClient) ListPaths(ctx context.Context, req *connect.Request[ermite.ListPathsRequest]) (*connect.Response[ermite.ListPathsResponse], error) {
167+ return c.listPaths.CallUnary(ctx, req)
168+}
169+
149170 // GetBlob calls ermite.GitService.GetBlob.
150171 func (c *gitServiceClient) GetBlob(ctx context.Context, req *connect.Request[ermite.GetBlobRequest]) (*connect.ServerStreamForClient[ermite.GetBlobResponse], error) {
151172 return c.getBlob.CallServerStream(ctx, req)
@@ -175,6 +196,13 @@ type GitServiceHandler interface {
175196 // not_found if the path does not exist and invalid_argument if it is not a
176197 // directory.
177198 GetTree(context.Context, *connect.Request[ermite.GetTreeRequest]) (*connect.Response[ermite.GetTreeResponse], error)
199+ // ListPaths lists the paths of every file and symbolic link of a revision,
200+ // recursively, in Git tree order (the order of `git ls-tree -r`). Directories
201+ // and submodules are not listed, nor paths GetBlob cannot address (not valid
202+ // UTF-8, or with a control character). Fails with not_found for an unknown
203+ // revision or an empty repository. Servers that have it advertise the
204+ // feature "git.list_paths" in GetVersion.
205+ ListPaths(context.Context, *connect.Request[ermite.ListPathsRequest]) (*connect.Response[ermite.ListPathsResponse], error)
178206 // GetBlob streams the content of a file at a revision, in chunks of at most
179207 // 64 KiB. The first message carries the metadata in info, then the chunks
180208 // follow; the memory used by the server does not depend on the file size.
@@ -211,6 +239,12 @@ func NewGitServiceHandler(svc GitServiceHandler, opts ...connect.HandlerOption)
211239 connect.WithSchema(gitServiceMethods.ByName("GetTree")),
212240 connect.WithHandlerOptions(opts...),
213241 )
242+ gitServiceListPathsHandler := connect.NewUnaryHandler(
243+ GitServiceListPathsProcedure,
244+ svc.ListPaths,
245+ connect.WithSchema(gitServiceMethods.ByName("ListPaths")),
246+ connect.WithHandlerOptions(opts...),
247+ )
214248 gitServiceGetBlobHandler := connect.NewServerStreamHandler(
215249 GitServiceGetBlobProcedure,
216250 svc.GetBlob,
@@ -241,6 +275,8 @@ func NewGitServiceHandler(svc GitServiceHandler, opts ...connect.HandlerOption)
241275 gitServiceListRefsHandler.ServeHTTP(w, r)
242276 case GitServiceGetTreeProcedure:
243277 gitServiceGetTreeHandler.ServeHTTP(w, r)
278+ case GitServiceListPathsProcedure:
279+ gitServiceListPathsHandler.ServeHTTP(w, r)
244280 case GitServiceGetBlobProcedure:
245281 gitServiceGetBlobHandler.ServeHTTP(w, r)
246282 case GitServiceListCommitsProcedure:
@@ -266,6 +302,10 @@ func (UnimplementedGitServiceHandler) GetTree(context.Context, *connect.Request[
266302 return nil, connect.NewError(connect.CodeUnimplemented, errors.New("ermite.GitService.GetTree is not implemented"))
267303 }
268304
305+func (UnimplementedGitServiceHandler) ListPaths(context.Context, *connect.Request[ermite.ListPathsRequest]) (*connect.Response[ermite.ListPathsResponse], error) {
306+ return nil, connect.NewError(connect.CodeUnimplemented, errors.New("ermite.GitService.ListPaths is not implemented"))
307+}
308+
269309 func (UnimplementedGitServiceHandler) GetBlob(context.Context, *connect.Request[ermite.GetBlobRequest], *connect.ServerStream[ermite.GetBlobResponse]) error {
270310 return connect.NewError(connect.CodeUnimplemented, errors.New("ermite.GitService.GetBlob is not implemented"))
271311 }
@@ -39,6 +39,8 @@ const (
39 GitServiceListRefsProcedure = "/ermite.GitService/ListRefs"39 GitServiceListRefsProcedure = "/ermite.GitService/ListRefs"
40 // GitServiceGetTreeProcedure is the fully-qualified name of the GitService's GetTree RPC.40 // GitServiceGetTreeProcedure is the fully-qualified name of the GitService's GetTree RPC.
41 GitServiceGetTreeProcedure = "/ermite.GitService/GetTree"41 GitServiceGetTreeProcedure = "/ermite.GitService/GetTree"
42+ // GitServiceListPathsProcedure is the fully-qualified name of the GitService's ListPaths RPC.
43+ GitServiceListPathsProcedure = "/ermite.GitService/ListPaths"
42 // GitServiceGetBlobProcedure is the fully-qualified name of the GitService's GetBlob RPC.44 // GitServiceGetBlobProcedure is the fully-qualified name of the GitService's GetBlob RPC.
43 GitServiceGetBlobProcedure = "/ermite.GitService/GetBlob"45 GitServiceGetBlobProcedure = "/ermite.GitService/GetBlob"
44 // GitServiceListCommitsProcedure is the fully-qualified name of the GitService's ListCommits RPC.46 // GitServiceListCommitsProcedure is the fully-qualified name of the GitService's ListCommits RPC.
@@ -59,6 +61,13 @@ type GitServiceClient interface {
59 // not_found if the path does not exist and invalid_argument if it is not a61 // not_found if the path does not exist and invalid_argument if it is not a
60 // directory.62 // directory.
61 GetTree(context.Context, *connect.Request[ermite.GetTreeRequest]) (*connect.Response[ermite.GetTreeResponse], error)63 GetTree(context.Context, *connect.Request[ermite.GetTreeRequest]) (*connect.Response[ermite.GetTreeResponse], error)
64+ // ListPaths lists the paths of every file and symbolic link of a revision,
65+ // recursively, in Git tree order (the order of `git ls-tree -r`). Directories
66+ // and submodules are not listed, nor paths GetBlob cannot address (not valid
67+ // UTF-8, or with a control character). Fails with not_found for an unknown
68+ // revision or an empty repository. Servers that have it advertise the
69+ // feature "git.list_paths" in GetVersion.
70+ ListPaths(context.Context, *connect.Request[ermite.ListPathsRequest]) (*connect.Response[ermite.ListPathsResponse], error)
62 // GetBlob streams the content of a file at a revision, in chunks of at most71 // GetBlob streams the content of a file at a revision, in chunks of at most
63 // 64 KiB. The first message carries the metadata in info, then the chunks72 // 64 KiB. The first message carries the metadata in info, then the chunks
64 // follow; the memory used by the server does not depend on the file size.73 // follow; the memory used by the server does not depend on the file size.
@@ -99,6 +108,12 @@ func NewGitServiceClient(httpClient connect.HTTPClient, baseURL string, opts ...
99 connect.WithSchema(gitServiceMethods.ByName("GetTree")),108 connect.WithSchema(gitServiceMethods.ByName("GetTree")),
100 connect.WithClientOptions(opts...),109 connect.WithClientOptions(opts...),
101 ),110 ),
111+ listPaths: connect.NewClient[ermite.ListPathsRequest, ermite.ListPathsResponse](
112+ httpClient,
113+ baseURL+GitServiceListPathsProcedure,
114+ connect.WithSchema(gitServiceMethods.ByName("ListPaths")),
115+ connect.WithClientOptions(opts...),
116+ ),
102 getBlob: connect.NewClient[ermite.GetBlobRequest, ermite.GetBlobResponse](117 getBlob: connect.NewClient[ermite.GetBlobRequest, ermite.GetBlobResponse](
103 httpClient,118 httpClient,
104 baseURL+GitServiceGetBlobProcedure,119 baseURL+GitServiceGetBlobProcedure,
@@ -130,6 +145,7 @@ func NewGitServiceClient(httpClient connect.HTTPClient, baseURL string, opts ...
130 type gitServiceClient struct {145 type gitServiceClient struct {
131 listRefs *connect.Client[ermite.ListRefsRequest, ermite.ListRefsResponse]146 listRefs *connect.Client[ermite.ListRefsRequest, ermite.ListRefsResponse]
132 getTree *connect.Client[ermite.GetTreeRequest, ermite.GetTreeResponse]147 getTree *connect.Client[ermite.GetTreeRequest, ermite.GetTreeResponse]
148+ listPaths *connect.Client[ermite.ListPathsRequest, ermite.ListPathsResponse]
133 getBlob *connect.Client[ermite.GetBlobRequest, ermite.GetBlobResponse]149 getBlob *connect.Client[ermite.GetBlobRequest, ermite.GetBlobResponse]
134 listCommits *connect.Client[ermite.ListCommitsRequest, ermite.ListCommitsResponse]150 listCommits *connect.Client[ermite.ListCommitsRequest, ermite.ListCommitsResponse]
135 getCommit *connect.Client[ermite.GetCommitRequest, ermite.GetCommitResponse]151 getCommit *connect.Client[ermite.GetCommitRequest, ermite.GetCommitResponse]
@@ -146,6 +162,11 @@ func (c *gitServiceClient) GetTree(ctx context.Context, req *connect.Request[erm
146 return c.getTree.CallUnary(ctx, req)162 return c.getTree.CallUnary(ctx, req)
147 }163 }
148 164
165+// ListPaths calls ermite.GitService.ListPaths.
166+func (c *gitServiceClient) ListPaths(ctx context.Context, req *connect.Request[ermite.ListPathsRequest]) (*connect.Response[ermite.ListPathsResponse], error) {
167+ return c.listPaths.CallUnary(ctx, req)
168+}
169+
149 // GetBlob calls ermite.GitService.GetBlob.170 // GetBlob calls ermite.GitService.GetBlob.
150 func (c *gitServiceClient) GetBlob(ctx context.Context, req *connect.Request[ermite.GetBlobRequest]) (*connect.ServerStreamForClient[ermite.GetBlobResponse], error) {171 func (c *gitServiceClient) GetBlob(ctx context.Context, req *connect.Request[ermite.GetBlobRequest]) (*connect.ServerStreamForClient[ermite.GetBlobResponse], error) {
151 return c.getBlob.CallServerStream(ctx, req)172 return c.getBlob.CallServerStream(ctx, req)
@@ -175,6 +196,13 @@ type GitServiceHandler interface {
175 // not_found if the path does not exist and invalid_argument if it is not a196 // not_found if the path does not exist and invalid_argument if it is not a
176 // directory.197 // directory.
177 GetTree(context.Context, *connect.Request[ermite.GetTreeRequest]) (*connect.Response[ermite.GetTreeResponse], error)198 GetTree(context.Context, *connect.Request[ermite.GetTreeRequest]) (*connect.Response[ermite.GetTreeResponse], error)
199+ // ListPaths lists the paths of every file and symbolic link of a revision,
200+ // recursively, in Git tree order (the order of `git ls-tree -r`). Directories
201+ // and submodules are not listed, nor paths GetBlob cannot address (not valid
202+ // UTF-8, or with a control character). Fails with not_found for an unknown
203+ // revision or an empty repository. Servers that have it advertise the
204+ // feature "git.list_paths" in GetVersion.
205+ ListPaths(context.Context, *connect.Request[ermite.ListPathsRequest]) (*connect.Response[ermite.ListPathsResponse], error)
178 // GetBlob streams the content of a file at a revision, in chunks of at most206 // GetBlob streams the content of a file at a revision, in chunks of at most
179 // 64 KiB. The first message carries the metadata in info, then the chunks207 // 64 KiB. The first message carries the metadata in info, then the chunks
180 // follow; the memory used by the server does not depend on the file size.208 // follow; the memory used by the server does not depend on the file size.
@@ -211,6 +239,12 @@ func NewGitServiceHandler(svc GitServiceHandler, opts ...connect.HandlerOption)
211 connect.WithSchema(gitServiceMethods.ByName("GetTree")),239 connect.WithSchema(gitServiceMethods.ByName("GetTree")),
212 connect.WithHandlerOptions(opts...),240 connect.WithHandlerOptions(opts...),
213 )241 )
242+ gitServiceListPathsHandler := connect.NewUnaryHandler(
243+ GitServiceListPathsProcedure,
244+ svc.ListPaths,
245+ connect.WithSchema(gitServiceMethods.ByName("ListPaths")),
246+ connect.WithHandlerOptions(opts...),
247+ )
214 gitServiceGetBlobHandler := connect.NewServerStreamHandler(248 gitServiceGetBlobHandler := connect.NewServerStreamHandler(
215 GitServiceGetBlobProcedure,249 GitServiceGetBlobProcedure,
216 svc.GetBlob,250 svc.GetBlob,
@@ -241,6 +275,8 @@ func NewGitServiceHandler(svc GitServiceHandler, opts ...connect.HandlerOption)
241 gitServiceListRefsHandler.ServeHTTP(w, r)275 gitServiceListRefsHandler.ServeHTTP(w, r)
242 case GitServiceGetTreeProcedure:276 case GitServiceGetTreeProcedure:
243 gitServiceGetTreeHandler.ServeHTTP(w, r)277 gitServiceGetTreeHandler.ServeHTTP(w, r)
278+ case GitServiceListPathsProcedure:
279+ gitServiceListPathsHandler.ServeHTTP(w, r)
244 case GitServiceGetBlobProcedure:280 case GitServiceGetBlobProcedure:
245 gitServiceGetBlobHandler.ServeHTTP(w, r)281 gitServiceGetBlobHandler.ServeHTTP(w, r)
246 case GitServiceListCommitsProcedure:282 case GitServiceListCommitsProcedure:
@@ -266,6 +302,10 @@ func (UnimplementedGitServiceHandler) GetTree(context.Context, *connect.Request[
266 return nil, connect.NewError(connect.CodeUnimplemented, errors.New("ermite.GitService.GetTree is not implemented"))302 return nil, connect.NewError(connect.CodeUnimplemented, errors.New("ermite.GitService.GetTree is not implemented"))
267 }303 }
268 304
305+func (UnimplementedGitServiceHandler) ListPaths(context.Context, *connect.Request[ermite.ListPathsRequest]) (*connect.Response[ermite.ListPathsResponse], error) {
306+ return nil, connect.NewError(connect.CodeUnimplemented, errors.New("ermite.GitService.ListPaths is not implemented"))
307+}
308+
269 func (UnimplementedGitServiceHandler) GetBlob(context.Context, *connect.Request[ermite.GetBlobRequest], *connect.ServerStream[ermite.GetBlobResponse]) error {309 func (UnimplementedGitServiceHandler) GetBlob(context.Context, *connect.Request[ermite.GetBlobRequest], *connect.ServerStream[ermite.GetBlobResponse]) error {
270 return connect.NewError(connect.CodeUnimplemented, errors.New("ermite.GitService.GetBlob is not implemented"))310 return connect.NewError(connect.CodeUnimplemented, errors.New("ermite.GitService.GetBlob is not implemented"))
271 }311 }
M gen/ermite/git.pb.go +226 -83
@@ -760,6 +760,136 @@ func (x *GetTreeResponse) GetTruncated() bool {
760760 return false
761761 }
762762
763+// ListPathsRequest selects a revision.
764+type ListPathsRequest struct {
765+ state protoimpl.MessageState `protogen:"open.v1"`
766+ // Repo is the repository name.
767+ Repo string `protobuf:"bytes,1,opt,name=repo,proto3" json:"repo,omitempty"`
768+ // Revision is a branch, a tag or a commit id. Empty means HEAD.
769+ Revision string `protobuf:"bytes,2,opt,name=revision,proto3" json:"revision,omitempty"`
770+ unknownFields protoimpl.UnknownFields
771+ sizeCache protoimpl.SizeCache
772+}
773+
774+func (x *ListPathsRequest) Reset() {
775+ *x = ListPathsRequest{}
776+ mi := &file_ermite_git_proto_msgTypes[6]
777+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
778+ ms.StoreMessageInfo(mi)
779+}
780+
781+func (x *ListPathsRequest) String() string {
782+ return protoimpl.X.MessageStringOf(x)
783+}
784+
785+func (*ListPathsRequest) ProtoMessage() {}
786+
787+func (x *ListPathsRequest) ProtoReflect() protoreflect.Message {
788+ mi := &file_ermite_git_proto_msgTypes[6]
789+ if x != nil {
790+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
791+ if ms.LoadMessageInfo() == nil {
792+ ms.StoreMessageInfo(mi)
793+ }
794+ return ms
795+ }
796+ return mi.MessageOf(x)
797+}
798+
799+// Deprecated: Use ListPathsRequest.ProtoReflect.Descriptor instead.
800+func (*ListPathsRequest) Descriptor() ([]byte, []int) {
801+ return file_ermite_git_proto_rawDescGZIP(), []int{6}
802+}
803+
804+func (x *ListPathsRequest) GetRepo() string {
805+ if x != nil {
806+ return x.Repo
807+ }
808+ return ""
809+}
810+
811+func (x *ListPathsRequest) GetRevision() string {
812+ if x != nil {
813+ return x.Revision
814+ }
815+ return ""
816+}
817+
818+// ListPathsResponse lists the file paths of a revision.
819+type ListPathsResponse struct {
820+ state protoimpl.MessageState `protogen:"open.v1"`
821+ // CommitId is the id of the commit the revision resolved to.
822+ CommitId string `protobuf:"bytes,1,opt,name=commit_id,json=commitId,proto3" json:"commit_id,omitempty"`
823+ // TreeId is the object id of its root tree.
824+ TreeId string `protobuf:"bytes,2,opt,name=tree_id,json=treeId,proto3" json:"tree_id,omitempty"`
825+ // Paths are the paths of the files and symbolic links, in Git tree order. A
826+ // response holds at most 100,000 paths and 8 MiB of path bytes (server limits
827+ // that may change; rely on truncated, not on the numbers).
828+ Paths []string `protobuf:"bytes,3,rep,name=paths,proto3" json:"paths,omitempty"`
829+ // Truncated is true when more paths exist past the first ones returned.
830+ Truncated bool `protobuf:"varint,4,opt,name=truncated,proto3" json:"truncated,omitempty"`
831+ unknownFields protoimpl.UnknownFields
832+ sizeCache protoimpl.SizeCache
833+}
834+
835+func (x *ListPathsResponse) Reset() {
836+ *x = ListPathsResponse{}
837+ mi := &file_ermite_git_proto_msgTypes[7]
838+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
839+ ms.StoreMessageInfo(mi)
840+}
841+
842+func (x *ListPathsResponse) String() string {
843+ return protoimpl.X.MessageStringOf(x)
844+}
845+
846+func (*ListPathsResponse) ProtoMessage() {}
847+
848+func (x *ListPathsResponse) ProtoReflect() protoreflect.Message {
849+ mi := &file_ermite_git_proto_msgTypes[7]
850+ if x != nil {
851+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
852+ if ms.LoadMessageInfo() == nil {
853+ ms.StoreMessageInfo(mi)
854+ }
855+ return ms
856+ }
857+ return mi.MessageOf(x)
858+}
859+
860+// Deprecated: Use ListPathsResponse.ProtoReflect.Descriptor instead.
861+func (*ListPathsResponse) Descriptor() ([]byte, []int) {
862+ return file_ermite_git_proto_rawDescGZIP(), []int{7}
863+}
864+
865+func (x *ListPathsResponse) GetCommitId() string {
866+ if x != nil {
867+ return x.CommitId
868+ }
869+ return ""
870+}
871+
872+func (x *ListPathsResponse) GetTreeId() string {
873+ if x != nil {
874+ return x.TreeId
875+ }
876+ return ""
877+}
878+
879+func (x *ListPathsResponse) GetPaths() []string {
880+ if x != nil {
881+ return x.Paths
882+ }
883+ return nil
884+}
885+
886+func (x *ListPathsResponse) GetTruncated() bool {
887+ if x != nil {
888+ return x.Truncated
889+ }
890+ return false
891+}
892+
763893 // BlobInfo describes a file.
764894 type BlobInfo struct {
765895 state protoimpl.MessageState `protogen:"open.v1"`
@@ -784,7 +914,7 @@ type BlobInfo struct {
784914
785915 func (x *BlobInfo) Reset() {
786916 *x = BlobInfo{}
787- mi := &file_ermite_git_proto_msgTypes[6]
917+ mi := &file_ermite_git_proto_msgTypes[8]
788918 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
789919 ms.StoreMessageInfo(mi)
790920 }
@@ -796,7 +926,7 @@ func (x *BlobInfo) String() string {
796926 func (*BlobInfo) ProtoMessage() {}
797927
798928 func (x *BlobInfo) ProtoReflect() protoreflect.Message {
799- mi := &file_ermite_git_proto_msgTypes[6]
929+ mi := &file_ermite_git_proto_msgTypes[8]
800930 if x != nil {
801931 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
802932 if ms.LoadMessageInfo() == nil {
@@ -809,7 +939,7 @@ func (x *BlobInfo) ProtoReflect() protoreflect.Message {
809939
810940 // Deprecated: Use BlobInfo.ProtoReflect.Descriptor instead.
811941 func (*BlobInfo) Descriptor() ([]byte, []int) {
812- return file_ermite_git_proto_rawDescGZIP(), []int{6}
942+ return file_ermite_git_proto_rawDescGZIP(), []int{8}
813943 }
814944
815945 func (x *BlobInfo) GetId() string {
@@ -869,7 +999,7 @@ type GetBlobRequest struct {
869999
8701000 func (x *GetBlobRequest) Reset() {
8711001 *x = GetBlobRequest{}
872- mi := &file_ermite_git_proto_msgTypes[7]
1002+ mi := &file_ermite_git_proto_msgTypes[9]
8731003 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
8741004 ms.StoreMessageInfo(mi)
8751005 }
@@ -881,7 +1011,7 @@ func (x *GetBlobRequest) String() string {
8811011 func (*GetBlobRequest) ProtoMessage() {}
8821012
8831013 func (x *GetBlobRequest) ProtoReflect() protoreflect.Message {
884- mi := &file_ermite_git_proto_msgTypes[7]
1014+ mi := &file_ermite_git_proto_msgTypes[9]
8851015 if x != nil {
8861016 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
8871017 if ms.LoadMessageInfo() == nil {
@@ -894,7 +1024,7 @@ func (x *GetBlobRequest) ProtoReflect() protoreflect.Message {
8941024
8951025 // Deprecated: Use GetBlobRequest.ProtoReflect.Descriptor instead.
8961026 func (*GetBlobRequest) Descriptor() ([]byte, []int) {
897- return file_ermite_git_proto_rawDescGZIP(), []int{7}
1027+ return file_ermite_git_proto_rawDescGZIP(), []int{9}
8981028 }
8991029
9001030 func (x *GetBlobRequest) GetRepo() string {
@@ -933,7 +1063,7 @@ type GetBlobResponse struct {
9331063
9341064 func (x *GetBlobResponse) Reset() {
9351065 *x = GetBlobResponse{}
936- mi := &file_ermite_git_proto_msgTypes[8]
1066+ mi := &file_ermite_git_proto_msgTypes[10]
9371067 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
9381068 ms.StoreMessageInfo(mi)
9391069 }
@@ -945,7 +1075,7 @@ func (x *GetBlobResponse) String() string {
9451075 func (*GetBlobResponse) ProtoMessage() {}
9461076
9471077 func (x *GetBlobResponse) ProtoReflect() protoreflect.Message {
948- mi := &file_ermite_git_proto_msgTypes[8]
1078+ mi := &file_ermite_git_proto_msgTypes[10]
9491079 if x != nil {
9501080 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
9511081 if ms.LoadMessageInfo() == nil {
@@ -958,7 +1088,7 @@ func (x *GetBlobResponse) ProtoReflect() protoreflect.Message {
9581088
9591089 // Deprecated: Use GetBlobResponse.ProtoReflect.Descriptor instead.
9601090 func (*GetBlobResponse) Descriptor() ([]byte, []int) {
961- return file_ermite_git_proto_rawDescGZIP(), []int{8}
1091+ return file_ermite_git_proto_rawDescGZIP(), []int{10}
9621092 }
9631093
9641094 func (x *GetBlobResponse) GetInfo() *BlobInfo {
@@ -998,7 +1128,7 @@ type ListCommitsRequest struct {
9981128
9991129 func (x *ListCommitsRequest) Reset() {
10001130 *x = ListCommitsRequest{}
1001- mi := &file_ermite_git_proto_msgTypes[9]
1131+ mi := &file_ermite_git_proto_msgTypes[11]
10021132 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
10031133 ms.StoreMessageInfo(mi)
10041134 }
@@ -1010,7 +1140,7 @@ func (x *ListCommitsRequest) String() string {
10101140 func (*ListCommitsRequest) ProtoMessage() {}
10111141
10121142 func (x *ListCommitsRequest) ProtoReflect() protoreflect.Message {
1013- mi := &file_ermite_git_proto_msgTypes[9]
1143+ mi := &file_ermite_git_proto_msgTypes[11]
10141144 if x != nil {
10151145 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
10161146 if ms.LoadMessageInfo() == nil {
@@ -1023,7 +1153,7 @@ func (x *ListCommitsRequest) ProtoReflect() protoreflect.Message {
10231153
10241154 // Deprecated: Use ListCommitsRequest.ProtoReflect.Descriptor instead.
10251155 func (*ListCommitsRequest) Descriptor() ([]byte, []int) {
1026- return file_ermite_git_proto_rawDescGZIP(), []int{9}
1156+ return file_ermite_git_proto_rawDescGZIP(), []int{11}
10271157 }
10281158
10291159 func (x *ListCommitsRequest) GetRepo() string {
@@ -1075,7 +1205,7 @@ type ListCommitsResponse struct {
10751205
10761206 func (x *ListCommitsResponse) Reset() {
10771207 *x = ListCommitsResponse{}
1078- mi := &file_ermite_git_proto_msgTypes[10]
1208+ mi := &file_ermite_git_proto_msgTypes[12]
10791209 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
10801210 ms.StoreMessageInfo(mi)
10811211 }
@@ -1087,7 +1217,7 @@ func (x *ListCommitsResponse) String() string {
10871217 func (*ListCommitsResponse) ProtoMessage() {}
10881218
10891219 func (x *ListCommitsResponse) ProtoReflect() protoreflect.Message {
1090- mi := &file_ermite_git_proto_msgTypes[10]
1220+ mi := &file_ermite_git_proto_msgTypes[12]
10911221 if x != nil {
10921222 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
10931223 if ms.LoadMessageInfo() == nil {
@@ -1100,7 +1230,7 @@ func (x *ListCommitsResponse) ProtoReflect() protoreflect.Message {
11001230
11011231 // Deprecated: Use ListCommitsResponse.ProtoReflect.Descriptor instead.
11021232 func (*ListCommitsResponse) Descriptor() ([]byte, []int) {
1103- return file_ermite_git_proto_rawDescGZIP(), []int{10}
1233+ return file_ermite_git_proto_rawDescGZIP(), []int{12}
11041234 }
11051235
11061236 func (x *ListCommitsResponse) GetCommits() []*Commit {
@@ -1130,7 +1260,7 @@ type GetCommitRequest struct {
11301260
11311261 func (x *GetCommitRequest) Reset() {
11321262 *x = GetCommitRequest{}
1133- mi := &file_ermite_git_proto_msgTypes[11]
1263+ mi := &file_ermite_git_proto_msgTypes[13]
11341264 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
11351265 ms.StoreMessageInfo(mi)
11361266 }
@@ -1142,7 +1272,7 @@ func (x *GetCommitRequest) String() string {
11421272 func (*GetCommitRequest) ProtoMessage() {}
11431273
11441274 func (x *GetCommitRequest) ProtoReflect() protoreflect.Message {
1145- mi := &file_ermite_git_proto_msgTypes[11]
1275+ mi := &file_ermite_git_proto_msgTypes[13]
11461276 if x != nil {
11471277 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
11481278 if ms.LoadMessageInfo() == nil {
@@ -1155,7 +1285,7 @@ func (x *GetCommitRequest) ProtoReflect() protoreflect.Message {
11551285
11561286 // Deprecated: Use GetCommitRequest.ProtoReflect.Descriptor instead.
11571287 func (*GetCommitRequest) Descriptor() ([]byte, []int) {
1158- return file_ermite_git_proto_rawDescGZIP(), []int{11}
1288+ return file_ermite_git_proto_rawDescGZIP(), []int{13}
11591289 }
11601290
11611291 func (x *GetCommitRequest) GetRepo() string {
@@ -1190,7 +1320,7 @@ type GetCommitResponse struct {
11901320
11911321 func (x *GetCommitResponse) Reset() {
11921322 *x = GetCommitResponse{}
1193- mi := &file_ermite_git_proto_msgTypes[12]
1323+ mi := &file_ermite_git_proto_msgTypes[14]
11941324 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
11951325 ms.StoreMessageInfo(mi)
11961326 }
@@ -1202,7 +1332,7 @@ func (x *GetCommitResponse) String() string {
12021332 func (*GetCommitResponse) ProtoMessage() {}
12031333
12041334 func (x *GetCommitResponse) ProtoReflect() protoreflect.Message {
1205- mi := &file_ermite_git_proto_msgTypes[12]
1335+ mi := &file_ermite_git_proto_msgTypes[14]
12061336 if x != nil {
12071337 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
12081338 if ms.LoadMessageInfo() == nil {
@@ -1215,7 +1345,7 @@ func (x *GetCommitResponse) ProtoReflect() protoreflect.Message {
12151345
12161346 // Deprecated: Use GetCommitResponse.ProtoReflect.Descriptor instead.
12171347 func (*GetCommitResponse) Descriptor() ([]byte, []int) {
1218- return file_ermite_git_proto_rawDescGZIP(), []int{12}
1348+ return file_ermite_git_proto_rawDescGZIP(), []int{14}
12191349 }
12201350
12211351 func (x *GetCommitResponse) GetCommit() *Commit {
@@ -1254,7 +1384,7 @@ type DiffStats struct {
12541384
12551385 func (x *DiffStats) Reset() {
12561386 *x = DiffStats{}
1257- mi := &file_ermite_git_proto_msgTypes[13]
1387+ mi := &file_ermite_git_proto_msgTypes[15]
12581388 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
12591389 ms.StoreMessageInfo(mi)
12601390 }
@@ -1266,7 +1396,7 @@ func (x *DiffStats) String() string {
12661396 func (*DiffStats) ProtoMessage() {}
12671397
12681398 func (x *DiffStats) ProtoReflect() protoreflect.Message {
1269- mi := &file_ermite_git_proto_msgTypes[13]
1399+ mi := &file_ermite_git_proto_msgTypes[15]
12701400 if x != nil {
12711401 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
12721402 if ms.LoadMessageInfo() == nil {
@@ -1279,7 +1409,7 @@ func (x *DiffStats) ProtoReflect() protoreflect.Message {
12791409
12801410 // Deprecated: Use DiffStats.ProtoReflect.Descriptor instead.
12811411 func (*DiffStats) Descriptor() ([]byte, []int) {
1282- return file_ermite_git_proto_rawDescGZIP(), []int{13}
1412+ return file_ermite_git_proto_rawDescGZIP(), []int{15}
12831413 }
12841414
12851415 func (x *DiffStats) GetFilesChanged() int32 {
@@ -1323,7 +1453,7 @@ type Diff struct {
13231453
13241454 func (x *Diff) Reset() {
13251455 *x = Diff{}
1326- mi := &file_ermite_git_proto_msgTypes[14]
1456+ mi := &file_ermite_git_proto_msgTypes[16]
13271457 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
13281458 ms.StoreMessageInfo(mi)
13291459 }
@@ -1335,7 +1465,7 @@ func (x *Diff) String() string {
13351465 func (*Diff) ProtoMessage() {}
13361466
13371467 func (x *Diff) ProtoReflect() protoreflect.Message {
1338- mi := &file_ermite_git_proto_msgTypes[14]
1468+ mi := &file_ermite_git_proto_msgTypes[16]
13391469 if x != nil {
13401470 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
13411471 if ms.LoadMessageInfo() == nil {
@@ -1348,7 +1478,7 @@ func (x *Diff) ProtoReflect() protoreflect.Message {
13481478
13491479 // Deprecated: Use Diff.ProtoReflect.Descriptor instead.
13501480 func (*Diff) Descriptor() ([]byte, []int) {
1351- return file_ermite_git_proto_rawDescGZIP(), []int{14}
1481+ return file_ermite_git_proto_rawDescGZIP(), []int{16}
13521482 }
13531483
13541484 func (x *Diff) GetFiles() []*FileDiff {
@@ -1404,7 +1534,7 @@ type FileDiff struct {
14041534
14051535 func (x *FileDiff) Reset() {
14061536 *x = FileDiff{}
1407- mi := &file_ermite_git_proto_msgTypes[15]
1537+ mi := &file_ermite_git_proto_msgTypes[17]
14081538 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
14091539 ms.StoreMessageInfo(mi)
14101540 }
@@ -1416,7 +1546,7 @@ func (x *FileDiff) String() string {
14161546 func (*FileDiff) ProtoMessage() {}
14171547
14181548 func (x *FileDiff) ProtoReflect() protoreflect.Message {
1419- mi := &file_ermite_git_proto_msgTypes[15]
1549+ mi := &file_ermite_git_proto_msgTypes[17]
14201550 if x != nil {
14211551 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
14221552 if ms.LoadMessageInfo() == nil {
@@ -1429,7 +1559,7 @@ func (x *FileDiff) ProtoReflect() protoreflect.Message {
14291559
14301560 // Deprecated: Use FileDiff.ProtoReflect.Descriptor instead.
14311561 func (*FileDiff) Descriptor() ([]byte, []int) {
1432- return file_ermite_git_proto_rawDescGZIP(), []int{15}
1562+ return file_ermite_git_proto_rawDescGZIP(), []int{17}
14331563 }
14341564
14351565 func (x *FileDiff) GetOldPath() string {
@@ -1547,7 +1677,7 @@ type Hunk struct {
15471677
15481678 func (x *Hunk) Reset() {
15491679 *x = Hunk{}
1550- mi := &file_ermite_git_proto_msgTypes[16]
1680+ mi := &file_ermite_git_proto_msgTypes[18]
15511681 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
15521682 ms.StoreMessageInfo(mi)
15531683 }
@@ -1559,7 +1689,7 @@ func (x *Hunk) String() string {
15591689 func (*Hunk) ProtoMessage() {}
15601690
15611691 func (x *Hunk) ProtoReflect() protoreflect.Message {
1562- mi := &file_ermite_git_proto_msgTypes[16]
1692+ mi := &file_ermite_git_proto_msgTypes[18]
15631693 if x != nil {
15641694 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
15651695 if ms.LoadMessageInfo() == nil {
@@ -1572,7 +1702,7 @@ func (x *Hunk) ProtoReflect() protoreflect.Message {
15721702
15731703 // Deprecated: Use Hunk.ProtoReflect.Descriptor instead.
15741704 func (*Hunk) Descriptor() ([]byte, []int) {
1575- return file_ermite_git_proto_rawDescGZIP(), []int{16}
1705+ return file_ermite_git_proto_rawDescGZIP(), []int{18}
15761706 }
15771707
15781708 func (x *Hunk) GetOldStart() int32 {
@@ -1638,7 +1768,7 @@ type Line struct {
16381768
16391769 func (x *Line) Reset() {
16401770 *x = Line{}
1641- mi := &file_ermite_git_proto_msgTypes[17]
1771+ mi := &file_ermite_git_proto_msgTypes[19]
16421772 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
16431773 ms.StoreMessageInfo(mi)
16441774 }
@@ -1650,7 +1780,7 @@ func (x *Line) String() string {
16501780 func (*Line) ProtoMessage() {}
16511781
16521782 func (x *Line) ProtoReflect() protoreflect.Message {
1653- mi := &file_ermite_git_proto_msgTypes[17]
1783+ mi := &file_ermite_git_proto_msgTypes[19]
16541784 if x != nil {
16551785 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
16561786 if ms.LoadMessageInfo() == nil {
@@ -1663,7 +1793,7 @@ func (x *Line) ProtoReflect() protoreflect.Message {
16631793
16641794 // Deprecated: Use Line.ProtoReflect.Descriptor instead.
16651795 func (*Line) Descriptor() ([]byte, []int) {
1666- return file_ermite_git_proto_rawDescGZIP(), []int{17}
1796+ return file_ermite_git_proto_rawDescGZIP(), []int{19}
16671797 }
16681798
16691799 func (x *Line) GetKind() LineKind {
@@ -1714,7 +1844,7 @@ type ResolveRevisionRequest struct {
17141844
17151845 func (x *ResolveRevisionRequest) Reset() {
17161846 *x = ResolveRevisionRequest{}
1717- mi := &file_ermite_git_proto_msgTypes[18]
1847+ mi := &file_ermite_git_proto_msgTypes[20]
17181848 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
17191849 ms.StoreMessageInfo(mi)
17201850 }
@@ -1726,7 +1856,7 @@ func (x *ResolveRevisionRequest) String() string {
17261856 func (*ResolveRevisionRequest) ProtoMessage() {}
17271857
17281858 func (x *ResolveRevisionRequest) ProtoReflect() protoreflect.Message {
1729- mi := &file_ermite_git_proto_msgTypes[18]
1859+ mi := &file_ermite_git_proto_msgTypes[20]
17301860 if x != nil {
17311861 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
17321862 if ms.LoadMessageInfo() == nil {
@@ -1739,7 +1869,7 @@ func (x *ResolveRevisionRequest) ProtoReflect() protoreflect.Message {
17391869
17401870 // Deprecated: Use ResolveRevisionRequest.ProtoReflect.Descriptor instead.
17411871 func (*ResolveRevisionRequest) Descriptor() ([]byte, []int) {
1742- return file_ermite_git_proto_rawDescGZIP(), []int{18}
1872+ return file_ermite_git_proto_rawDescGZIP(), []int{20}
17431873 }
17441874
17451875 func (x *ResolveRevisionRequest) GetRepo() string {
@@ -1772,7 +1902,7 @@ type ResolveRevisionResponse struct {
17721902
17731903 func (x *ResolveRevisionResponse) Reset() {
17741904 *x = ResolveRevisionResponse{}
1775- mi := &file_ermite_git_proto_msgTypes[19]
1905+ mi := &file_ermite_git_proto_msgTypes[21]
17761906 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
17771907 ms.StoreMessageInfo(mi)
17781908 }
@@ -1784,7 +1914,7 @@ func (x *ResolveRevisionResponse) String() string {
17841914 func (*ResolveRevisionResponse) ProtoMessage() {}
17851915
17861916 func (x *ResolveRevisionResponse) ProtoReflect() protoreflect.Message {
1787- mi := &file_ermite_git_proto_msgTypes[19]
1917+ mi := &file_ermite_git_proto_msgTypes[21]
17881918 if x != nil {
17891919 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
17901920 if ms.LoadMessageInfo() == nil {
@@ -1797,7 +1927,7 @@ func (x *ResolveRevisionResponse) ProtoReflect() protoreflect.Message {
17971927
17981928 // Deprecated: Use ResolveRevisionResponse.ProtoReflect.Descriptor instead.
17991929 func (*ResolveRevisionResponse) Descriptor() ([]byte, []int) {
1800- return file_ermite_git_proto_rawDescGZIP(), []int{19}
1930+ return file_ermite_git_proto_rawDescGZIP(), []int{21}
18011931 }
18021932
18031933 func (x *ResolveRevisionResponse) GetCommitId() string {
@@ -1854,7 +1984,15 @@ const file_ermite_git_proto_rawDesc = "" +
18541984 "\atree_id\x18\x02 \x01(\tR\x06treeId\x12+\n" +
18551985 "\aentries\x18\x03 \x03(\v2\x11.ermite.TreeEntryR\aentries\x124\n" +
18561986 "\x16last_commits_truncated\x18\x04 \x01(\bR\x14lastCommitsTruncated\x12\x1c\n" +
1857- "\ttruncated\x18\x05 \x01(\bR\ttruncated\"\x8d\x01\n" +
1987+ "\ttruncated\x18\x05 \x01(\bR\ttruncated\"B\n" +
1988+ "\x10ListPathsRequest\x12\x12\n" +
1989+ "\x04repo\x18\x01 \x01(\tR\x04repo\x12\x1a\n" +
1990+ "\brevision\x18\x02 \x01(\tR\brevision\"}\n" +
1991+ "\x11ListPathsResponse\x12\x1b\n" +
1992+ "\tcommit_id\x18\x01 \x01(\tR\bcommitId\x12\x17\n" +
1993+ "\atree_id\x18\x02 \x01(\tR\x06treeId\x12\x14\n" +
1994+ "\x05paths\x18\x03 \x03(\tR\x05paths\x12\x1c\n" +
1995+ "\ttruncated\x18\x04 \x01(\bR\ttruncated\"\x8d\x01\n" +
18581996 "\bBlobInfo\x12\x0e\n" +
18591997 "\x02id\x18\x01 \x01(\tR\x02id\x12\x12\n" +
18601998 "\x04path\x18\x02 \x01(\tR\x04path\x12\x12\n" +
@@ -1957,11 +2095,12 @@ const file_ermite_git_proto_rawDesc = "" +
19572095 "\x15LINE_KIND_UNSPECIFIED\x10\x00\x12\x15\n" +
19582096 "\x11LINE_KIND_CONTEXT\x10\x01\x12\x16\n" +
19592097 "\x12LINE_KIND_ADDITION\x10\x02\x12\x16\n" +
1960- "\x12LINE_KIND_DELETION\x10\x032\xa3\x03\n" +
2098+ "\x12LINE_KIND_DELETION\x10\x032\xe5\x03\n" +
19612099 "\n" +
19622100 "GitService\x12=\n" +
19632101 "\bListRefs\x12\x17.ermite.ListRefsRequest\x1a\x18.ermite.ListRefsResponse\x12:\n" +
1964- "\aGetTree\x12\x16.ermite.GetTreeRequest\x1a\x17.ermite.GetTreeResponse\x12<\n" +
2102+ "\aGetTree\x12\x16.ermite.GetTreeRequest\x1a\x17.ermite.GetTreeResponse\x12@\n" +
2103+ "\tListPaths\x12\x18.ermite.ListPathsRequest\x1a\x19.ermite.ListPathsResponse\x12<\n" +
19652104 "\aGetBlob\x12\x16.ermite.GetBlobRequest\x1a\x17.ermite.GetBlobResponse0\x01\x12F\n" +
19662105 "\vListCommits\x12\x1a.ermite.ListCommitsRequest\x1a\x1b.ermite.ListCommitsResponse\x12@\n" +
19672106 "\tGetCommit\x12\x18.ermite.GetCommitRequest\x1a\x19.ermite.GetCommitResponse\x12R\n" +
@@ -1982,7 +2121,7 @@ func file_ermite_git_proto_rawDescGZIP() []byte {
19822121 }
19832122
19842123 var file_ermite_git_proto_enumTypes = make([]protoimpl.EnumInfo, 4)
1985-var file_ermite_git_proto_msgTypes = make([]protoimpl.MessageInfo, 20)
2124+var file_ermite_git_proto_msgTypes = make([]protoimpl.MessageInfo, 22)
19862125 var file_ermite_git_proto_goTypes = []any{
19872126 (RefKind)(0), // 0: ermite.RefKind
19882127 (EntryKind)(0), // 1: ermite.EntryKind
@@ -1994,53 +2133,57 @@ var file_ermite_git_proto_goTypes = []any{
19942133 (*TreeEntry)(nil), // 7: ermite.TreeEntry
19952134 (*GetTreeRequest)(nil), // 8: ermite.GetTreeRequest
19962135 (*GetTreeResponse)(nil), // 9: ermite.GetTreeResponse
1997- (*BlobInfo)(nil), // 10: ermite.BlobInfo
1998- (*GetBlobRequest)(nil), // 11: ermite.GetBlobRequest
1999- (*GetBlobResponse)(nil), // 12: ermite.GetBlobResponse
2000- (*ListCommitsRequest)(nil), // 13: ermite.ListCommitsRequest
2001- (*ListCommitsResponse)(nil), // 14: ermite.ListCommitsResponse
2002- (*GetCommitRequest)(nil), // 15: ermite.GetCommitRequest
2003- (*GetCommitResponse)(nil), // 16: ermite.GetCommitResponse
2004- (*DiffStats)(nil), // 17: ermite.DiffStats
2005- (*Diff)(nil), // 18: ermite.Diff
2006- (*FileDiff)(nil), // 19: ermite.FileDiff
2007- (*Hunk)(nil), // 20: ermite.Hunk
2008- (*Line)(nil), // 21: ermite.Line
2009- (*ResolveRevisionRequest)(nil), // 22: ermite.ResolveRevisionRequest
2010- (*ResolveRevisionResponse)(nil), // 23: ermite.ResolveRevisionResponse
2011- (*Commit)(nil), // 24: ermite.Commit
2136+ (*ListPathsRequest)(nil), // 10: ermite.ListPathsRequest
2137+ (*ListPathsResponse)(nil), // 11: ermite.ListPathsResponse
2138+ (*BlobInfo)(nil), // 12: ermite.BlobInfo
2139+ (*GetBlobRequest)(nil), // 13: ermite.GetBlobRequest
2140+ (*GetBlobResponse)(nil), // 14: ermite.GetBlobResponse
2141+ (*ListCommitsRequest)(nil), // 15: ermite.ListCommitsRequest
2142+ (*ListCommitsResponse)(nil), // 16: ermite.ListCommitsResponse
2143+ (*GetCommitRequest)(nil), // 17: ermite.GetCommitRequest
2144+ (*GetCommitResponse)(nil), // 18: ermite.GetCommitResponse
2145+ (*DiffStats)(nil), // 19: ermite.DiffStats
2146+ (*Diff)(nil), // 20: ermite.Diff
2147+ (*FileDiff)(nil), // 21: ermite.FileDiff
2148+ (*Hunk)(nil), // 22: ermite.Hunk
2149+ (*Line)(nil), // 23: ermite.Line
2150+ (*ResolveRevisionRequest)(nil), // 24: ermite.ResolveRevisionRequest
2151+ (*ResolveRevisionResponse)(nil), // 25: ermite.ResolveRevisionResponse
2152+ (*Commit)(nil), // 26: ermite.Commit
20122153 }
20132154 var file_ermite_git_proto_depIdxs = []int32{
20142155 0, // 0: ermite.Ref.kind:type_name -> ermite.RefKind
20152156 0, // 1: ermite.ListRefsRequest.kinds:type_name -> ermite.RefKind
20162157 4, // 2: ermite.ListRefsResponse.refs:type_name -> ermite.Ref
20172158 1, // 3: ermite.TreeEntry.kind:type_name -> ermite.EntryKind
2018- 24, // 4: ermite.TreeEntry.last_commit:type_name -> ermite.Commit
2159+ 26, // 4: ermite.TreeEntry.last_commit:type_name -> ermite.Commit
20192160 7, // 5: ermite.GetTreeResponse.entries:type_name -> ermite.TreeEntry
2020- 10, // 6: ermite.GetBlobResponse.info:type_name -> ermite.BlobInfo
2021- 24, // 7: ermite.ListCommitsResponse.commits:type_name -> ermite.Commit
2022- 24, // 8: ermite.GetCommitResponse.commit:type_name -> ermite.Commit
2023- 17, // 9: ermite.GetCommitResponse.stats:type_name -> ermite.DiffStats
2024- 18, // 10: ermite.GetCommitResponse.diff:type_name -> ermite.Diff
2025- 19, // 11: ermite.Diff.files:type_name -> ermite.FileDiff
2161+ 12, // 6: ermite.GetBlobResponse.info:type_name -> ermite.BlobInfo
2162+ 26, // 7: ermite.ListCommitsResponse.commits:type_name -> ermite.Commit
2163+ 26, // 8: ermite.GetCommitResponse.commit:type_name -> ermite.Commit
2164+ 19, // 9: ermite.GetCommitResponse.stats:type_name -> ermite.DiffStats
2165+ 20, // 10: ermite.GetCommitResponse.diff:type_name -> ermite.Diff
2166+ 21, // 11: ermite.Diff.files:type_name -> ermite.FileDiff
20262167 2, // 12: ermite.FileDiff.status:type_name -> ermite.FileStatus
2027- 20, // 13: ermite.FileDiff.hunks:type_name -> ermite.Hunk
2028- 21, // 14: ermite.Hunk.lines:type_name -> ermite.Line
2168+ 22, // 13: ermite.FileDiff.hunks:type_name -> ermite.Hunk
2169+ 23, // 14: ermite.Hunk.lines:type_name -> ermite.Line
20292170 3, // 15: ermite.Line.kind:type_name -> ermite.LineKind
20302171 5, // 16: ermite.GitService.ListRefs:input_type -> ermite.ListRefsRequest
20312172 8, // 17: ermite.GitService.GetTree:input_type -> ermite.GetTreeRequest
2032- 11, // 18: ermite.GitService.GetBlob:input_type -> ermite.GetBlobRequest
2033- 13, // 19: ermite.GitService.ListCommits:input_type -> ermite.ListCommitsRequest
2034- 15, // 20: ermite.GitService.GetCommit:input_type -> ermite.GetCommitRequest
2035- 22, // 21: ermite.GitService.ResolveRevision:input_type -> ermite.ResolveRevisionRequest
2036- 6, // 22: ermite.GitService.ListRefs:output_type -> ermite.ListRefsResponse
2037- 9, // 23: ermite.GitService.GetTree:output_type -> ermite.GetTreeResponse
2038- 12, // 24: ermite.GitService.GetBlob:output_type -> ermite.GetBlobResponse
2039- 14, // 25: ermite.GitService.ListCommits:output_type -> ermite.ListCommitsResponse
2040- 16, // 26: ermite.GitService.GetCommit:output_type -> ermite.GetCommitResponse
2041- 23, // 27: ermite.GitService.ResolveRevision:output_type -> ermite.ResolveRevisionResponse
2042- 22, // [22:28] is the sub-list for method output_type
2043- 16, // [16:22] is the sub-list for method input_type
2173+ 10, // 18: ermite.GitService.ListPaths:input_type -> ermite.ListPathsRequest
2174+ 13, // 19: ermite.GitService.GetBlob:input_type -> ermite.GetBlobRequest
2175+ 15, // 20: ermite.GitService.ListCommits:input_type -> ermite.ListCommitsRequest
2176+ 17, // 21: ermite.GitService.GetCommit:input_type -> ermite.GetCommitRequest
2177+ 24, // 22: ermite.GitService.ResolveRevision:input_type -> ermite.ResolveRevisionRequest
2178+ 6, // 23: ermite.GitService.ListRefs:output_type -> ermite.ListRefsResponse
2179+ 9, // 24: ermite.GitService.GetTree:output_type -> ermite.GetTreeResponse
2180+ 11, // 25: ermite.GitService.ListPaths:output_type -> ermite.ListPathsResponse
2181+ 14, // 26: ermite.GitService.GetBlob:output_type -> ermite.GetBlobResponse
2182+ 16, // 27: ermite.GitService.ListCommits:output_type -> ermite.ListCommitsResponse
2183+ 18, // 28: ermite.GitService.GetCommit:output_type -> ermite.GetCommitResponse
2184+ 25, // 29: ermite.GitService.ResolveRevision:output_type -> ermite.ResolveRevisionResponse
2185+ 23, // [23:30] is the sub-list for method output_type
2186+ 16, // [16:23] is the sub-list for method input_type
20442187 16, // [16:16] is the sub-list for extension type_name
20452188 16, // [16:16] is the sub-list for extension extendee
20462189 0, // [0:16] is the sub-list for field type_name
@@ -2058,7 +2201,7 @@ func file_ermite_git_proto_init() {
20582201 GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
20592202 RawDescriptor: unsafe.Slice(unsafe.StringData(file_ermite_git_proto_rawDesc), len(file_ermite_git_proto_rawDesc)),
20602203 NumEnums: 4,
2061- NumMessages: 20,
2204+ NumMessages: 22,
20622205 NumExtensions: 0,
20632206 NumServices: 1,
20642207 },
@@ -760,6 +760,136 @@ func (x *GetTreeResponse) GetTruncated() bool {
760 return false760 return false
761 }761 }
762 762
763+// ListPathsRequest selects a revision.
764+type ListPathsRequest struct {
765+ state protoimpl.MessageState `protogen:"open.v1"`
766+ // Repo is the repository name.
767+ Repo string `protobuf:"bytes,1,opt,name=repo,proto3" json:"repo,omitempty"`
768+ // Revision is a branch, a tag or a commit id. Empty means HEAD.
769+ Revision string `protobuf:"bytes,2,opt,name=revision,proto3" json:"revision,omitempty"`
770+ unknownFields protoimpl.UnknownFields
771+ sizeCache protoimpl.SizeCache
772+}
773+
774+func (x *ListPathsRequest) Reset() {
775+ *x = ListPathsRequest{}
776+ mi := &file_ermite_git_proto_msgTypes[6]
777+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
778+ ms.StoreMessageInfo(mi)
779+}
780+
781+func (x *ListPathsRequest) String() string {
782+ return protoimpl.X.MessageStringOf(x)
783+}
784+
785+func (*ListPathsRequest) ProtoMessage() {}
786+
787+func (x *ListPathsRequest) ProtoReflect() protoreflect.Message {
788+ mi := &file_ermite_git_proto_msgTypes[6]
789+ if x != nil {
790+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
791+ if ms.LoadMessageInfo() == nil {
792+ ms.StoreMessageInfo(mi)
793+ }
794+ return ms
795+ }
796+ return mi.MessageOf(x)
797+}
798+
799+// Deprecated: Use ListPathsRequest.ProtoReflect.Descriptor instead.
800+func (*ListPathsRequest) Descriptor() ([]byte, []int) {
801+ return file_ermite_git_proto_rawDescGZIP(), []int{6}
802+}
803+
804+func (x *ListPathsRequest) GetRepo() string {
805+ if x != nil {
806+ return x.Repo
807+ }
808+ return ""
809+}
810+
811+func (x *ListPathsRequest) GetRevision() string {
812+ if x != nil {
813+ return x.Revision
814+ }
815+ return ""
816+}
817+
818+// ListPathsResponse lists the file paths of a revision.
819+type ListPathsResponse struct {
820+ state protoimpl.MessageState `protogen:"open.v1"`
821+ // CommitId is the id of the commit the revision resolved to.
822+ CommitId string `protobuf:"bytes,1,opt,name=commit_id,json=commitId,proto3" json:"commit_id,omitempty"`
823+ // TreeId is the object id of its root tree.
824+ TreeId string `protobuf:"bytes,2,opt,name=tree_id,json=treeId,proto3" json:"tree_id,omitempty"`
825+ // Paths are the paths of the files and symbolic links, in Git tree order. A
826+ // response holds at most 100,000 paths and 8 MiB of path bytes (server limits
827+ // that may change; rely on truncated, not on the numbers).
828+ Paths []string `protobuf:"bytes,3,rep,name=paths,proto3" json:"paths,omitempty"`
829+ // Truncated is true when more paths exist past the first ones returned.
830+ Truncated bool `protobuf:"varint,4,opt,name=truncated,proto3" json:"truncated,omitempty"`
831+ unknownFields protoimpl.UnknownFields
832+ sizeCache protoimpl.SizeCache
833+}
834+
835+func (x *ListPathsResponse) Reset() {
836+ *x = ListPathsResponse{}
837+ mi := &file_ermite_git_proto_msgTypes[7]
838+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
839+ ms.StoreMessageInfo(mi)
840+}
841+
842+func (x *ListPathsResponse) String() string {
843+ return protoimpl.X.MessageStringOf(x)
844+}
845+
846+func (*ListPathsResponse) ProtoMessage() {}
847+
848+func (x *ListPathsResponse) ProtoReflect() protoreflect.Message {
849+ mi := &file_ermite_git_proto_msgTypes[7]
850+ if x != nil {
851+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
852+ if ms.LoadMessageInfo() == nil {
853+ ms.StoreMessageInfo(mi)
854+ }
855+ return ms
856+ }
857+ return mi.MessageOf(x)
858+}
859+
860+// Deprecated: Use ListPathsResponse.ProtoReflect.Descriptor instead.
861+func (*ListPathsResponse) Descriptor() ([]byte, []int) {
862+ return file_ermite_git_proto_rawDescGZIP(), []int{7}
863+}
864+
865+func (x *ListPathsResponse) GetCommitId() string {
866+ if x != nil {
867+ return x.CommitId
868+ }
869+ return ""
870+}
871+
872+func (x *ListPathsResponse) GetTreeId() string {
873+ if x != nil {
874+ return x.TreeId
875+ }
876+ return ""
877+}
878+
879+func (x *ListPathsResponse) GetPaths() []string {
880+ if x != nil {
881+ return x.Paths
882+ }
883+ return nil
884+}
885+
886+func (x *ListPathsResponse) GetTruncated() bool {
887+ if x != nil {
888+ return x.Truncated
889+ }
890+ return false
891+}
892+
763 // BlobInfo describes a file.893 // BlobInfo describes a file.
764 type BlobInfo struct {894 type BlobInfo struct {
765 state protoimpl.MessageState `protogen:"open.v1"`895 state protoimpl.MessageState `protogen:"open.v1"`
@@ -784,7 +914,7 @@ type BlobInfo struct {
784 914
785 func (x *BlobInfo) Reset() {915 func (x *BlobInfo) Reset() {
786 *x = BlobInfo{}916 *x = BlobInfo{}
787- mi := &file_ermite_git_proto_msgTypes[6]917+ mi := &file_ermite_git_proto_msgTypes[8]
788 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))918 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
789 ms.StoreMessageInfo(mi)919 ms.StoreMessageInfo(mi)
790 }920 }
@@ -796,7 +926,7 @@ func (x *BlobInfo) String() string {
796 func (*BlobInfo) ProtoMessage() {}926 func (*BlobInfo) ProtoMessage() {}
797 927
798 func (x *BlobInfo) ProtoReflect() protoreflect.Message {928 func (x *BlobInfo) ProtoReflect() protoreflect.Message {
799- mi := &file_ermite_git_proto_msgTypes[6]929+ mi := &file_ermite_git_proto_msgTypes[8]
800 if x != nil {930 if x != nil {
801 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))931 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
802 if ms.LoadMessageInfo() == nil {932 if ms.LoadMessageInfo() == nil {
@@ -809,7 +939,7 @@ func (x *BlobInfo) ProtoReflect() protoreflect.Message {
809 939
810 // Deprecated: Use BlobInfo.ProtoReflect.Descriptor instead.940 // Deprecated: Use BlobInfo.ProtoReflect.Descriptor instead.
811 func (*BlobInfo) Descriptor() ([]byte, []int) {941 func (*BlobInfo) Descriptor() ([]byte, []int) {
812- return file_ermite_git_proto_rawDescGZIP(), []int{6}942+ return file_ermite_git_proto_rawDescGZIP(), []int{8}
813 }943 }
814 944
815 func (x *BlobInfo) GetId() string {945 func (x *BlobInfo) GetId() string {
@@ -869,7 +999,7 @@ type GetBlobRequest struct {
869 999
870 func (x *GetBlobRequest) Reset() {1000 func (x *GetBlobRequest) Reset() {
871 *x = GetBlobRequest{}1001 *x = GetBlobRequest{}
872- mi := &file_ermite_git_proto_msgTypes[7]1002+ mi := &file_ermite_git_proto_msgTypes[9]
873 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))1003 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
874 ms.StoreMessageInfo(mi)1004 ms.StoreMessageInfo(mi)
875 }1005 }
@@ -881,7 +1011,7 @@ func (x *GetBlobRequest) String() string {
881 func (*GetBlobRequest) ProtoMessage() {}1011 func (*GetBlobRequest) ProtoMessage() {}
882 1012
883 func (x *GetBlobRequest) ProtoReflect() protoreflect.Message {1013 func (x *GetBlobRequest) ProtoReflect() protoreflect.Message {
884- mi := &file_ermite_git_proto_msgTypes[7]1014+ mi := &file_ermite_git_proto_msgTypes[9]
885 if x != nil {1015 if x != nil {
886 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))1016 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
887 if ms.LoadMessageInfo() == nil {1017 if ms.LoadMessageInfo() == nil {
@@ -894,7 +1024,7 @@ func (x *GetBlobRequest) ProtoReflect() protoreflect.Message {
894 1024
895 // Deprecated: Use GetBlobRequest.ProtoReflect.Descriptor instead.1025 // Deprecated: Use GetBlobRequest.ProtoReflect.Descriptor instead.
896 func (*GetBlobRequest) Descriptor() ([]byte, []int) {1026 func (*GetBlobRequest) Descriptor() ([]byte, []int) {
897- return file_ermite_git_proto_rawDescGZIP(), []int{7}1027+ return file_ermite_git_proto_rawDescGZIP(), []int{9}
898 }1028 }
899 1029
900 func (x *GetBlobRequest) GetRepo() string {1030 func (x *GetBlobRequest) GetRepo() string {
@@ -933,7 +1063,7 @@ type GetBlobResponse struct {
933 1063
934 func (x *GetBlobResponse) Reset() {1064 func (x *GetBlobResponse) Reset() {
935 *x = GetBlobResponse{}1065 *x = GetBlobResponse{}
936- mi := &file_ermite_git_proto_msgTypes[8]1066+ mi := &file_ermite_git_proto_msgTypes[10]
937 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))1067 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
938 ms.StoreMessageInfo(mi)1068 ms.StoreMessageInfo(mi)
939 }1069 }
@@ -945,7 +1075,7 @@ func (x *GetBlobResponse) String() string {
945 func (*GetBlobResponse) ProtoMessage() {}1075 func (*GetBlobResponse) ProtoMessage() {}
946 1076
947 func (x *GetBlobResponse) ProtoReflect() protoreflect.Message {1077 func (x *GetBlobResponse) ProtoReflect() protoreflect.Message {
948- mi := &file_ermite_git_proto_msgTypes[8]1078+ mi := &file_ermite_git_proto_msgTypes[10]
949 if x != nil {1079 if x != nil {
950 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))1080 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
951 if ms.LoadMessageInfo() == nil {1081 if ms.LoadMessageInfo() == nil {
@@ -958,7 +1088,7 @@ func (x *GetBlobResponse) ProtoReflect() protoreflect.Message {
958 1088
959 // Deprecated: Use GetBlobResponse.ProtoReflect.Descriptor instead.1089 // Deprecated: Use GetBlobResponse.ProtoReflect.Descriptor instead.
960 func (*GetBlobResponse) Descriptor() ([]byte, []int) {1090 func (*GetBlobResponse) Descriptor() ([]byte, []int) {
961- return file_ermite_git_proto_rawDescGZIP(), []int{8}1091+ return file_ermite_git_proto_rawDescGZIP(), []int{10}
962 }1092 }
963 1093
964 func (x *GetBlobResponse) GetInfo() *BlobInfo {1094 func (x *GetBlobResponse) GetInfo() *BlobInfo {
@@ -998,7 +1128,7 @@ type ListCommitsRequest struct {
998 1128
999 func (x *ListCommitsRequest) Reset() {1129 func (x *ListCommitsRequest) Reset() {
1000 *x = ListCommitsRequest{}1130 *x = ListCommitsRequest{}
1001- mi := &file_ermite_git_proto_msgTypes[9]1131+ mi := &file_ermite_git_proto_msgTypes[11]
1002 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))1132 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
1003 ms.StoreMessageInfo(mi)1133 ms.StoreMessageInfo(mi)
1004 }1134 }
@@ -1010,7 +1140,7 @@ func (x *ListCommitsRequest) String() string {
1010 func (*ListCommitsRequest) ProtoMessage() {}1140 func (*ListCommitsRequest) ProtoMessage() {}
1011 1141
1012 func (x *ListCommitsRequest) ProtoReflect() protoreflect.Message {1142 func (x *ListCommitsRequest) ProtoReflect() protoreflect.Message {
1013- mi := &file_ermite_git_proto_msgTypes[9]1143+ mi := &file_ermite_git_proto_msgTypes[11]
1014 if x != nil {1144 if x != nil {
1015 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))1145 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
1016 if ms.LoadMessageInfo() == nil {1146 if ms.LoadMessageInfo() == nil {
@@ -1023,7 +1153,7 @@ func (x *ListCommitsRequest) ProtoReflect() protoreflect.Message {
1023 1153
1024 // Deprecated: Use ListCommitsRequest.ProtoReflect.Descriptor instead.1154 // Deprecated: Use ListCommitsRequest.ProtoReflect.Descriptor instead.
1025 func (*ListCommitsRequest) Descriptor() ([]byte, []int) {1155 func (*ListCommitsRequest) Descriptor() ([]byte, []int) {
1026- return file_ermite_git_proto_rawDescGZIP(), []int{9}1156+ return file_ermite_git_proto_rawDescGZIP(), []int{11}
1027 }1157 }
1028 1158
1029 func (x *ListCommitsRequest) GetRepo() string {1159 func (x *ListCommitsRequest) GetRepo() string {
@@ -1075,7 +1205,7 @@ type ListCommitsResponse struct {
1075 1205
1076 func (x *ListCommitsResponse) Reset() {1206 func (x *ListCommitsResponse) Reset() {
1077 *x = ListCommitsResponse{}1207 *x = ListCommitsResponse{}
1078- mi := &file_ermite_git_proto_msgTypes[10]1208+ mi := &file_ermite_git_proto_msgTypes[12]
1079 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))1209 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
1080 ms.StoreMessageInfo(mi)1210 ms.StoreMessageInfo(mi)
1081 }1211 }
@@ -1087,7 +1217,7 @@ func (x *ListCommitsResponse) String() string {
1087 func (*ListCommitsResponse) ProtoMessage() {}1217 func (*ListCommitsResponse) ProtoMessage() {}
1088 1218
1089 func (x *ListCommitsResponse) ProtoReflect() protoreflect.Message {1219 func (x *ListCommitsResponse) ProtoReflect() protoreflect.Message {
1090- mi := &file_ermite_git_proto_msgTypes[10]1220+ mi := &file_ermite_git_proto_msgTypes[12]
1091 if x != nil {1221 if x != nil {
1092 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))1222 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
1093 if ms.LoadMessageInfo() == nil {1223 if ms.LoadMessageInfo() == nil {
@@ -1100,7 +1230,7 @@ func (x *ListCommitsResponse) ProtoReflect() protoreflect.Message {
1100 1230
1101 // Deprecated: Use ListCommitsResponse.ProtoReflect.Descriptor instead.1231 // Deprecated: Use ListCommitsResponse.ProtoReflect.Descriptor instead.
1102 func (*ListCommitsResponse) Descriptor() ([]byte, []int) {1232 func (*ListCommitsResponse) Descriptor() ([]byte, []int) {
1103- return file_ermite_git_proto_rawDescGZIP(), []int{10}1233+ return file_ermite_git_proto_rawDescGZIP(), []int{12}
1104 }1234 }
1105 1235
1106 func (x *ListCommitsResponse) GetCommits() []*Commit {1236 func (x *ListCommitsResponse) GetCommits() []*Commit {
@@ -1130,7 +1260,7 @@ type GetCommitRequest struct {
1130 1260
1131 func (x *GetCommitRequest) Reset() {1261 func (x *GetCommitRequest) Reset() {
1132 *x = GetCommitRequest{}1262 *x = GetCommitRequest{}
1133- mi := &file_ermite_git_proto_msgTypes[11]1263+ mi := &file_ermite_git_proto_msgTypes[13]
1134 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))1264 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
1135 ms.StoreMessageInfo(mi)1265 ms.StoreMessageInfo(mi)
1136 }1266 }
@@ -1142,7 +1272,7 @@ func (x *GetCommitRequest) String() string {
1142 func (*GetCommitRequest) ProtoMessage() {}1272 func (*GetCommitRequest) ProtoMessage() {}
1143 1273
1144 func (x *GetCommitRequest) ProtoReflect() protoreflect.Message {1274 func (x *GetCommitRequest) ProtoReflect() protoreflect.Message {
1145- mi := &file_ermite_git_proto_msgTypes[11]1275+ mi := &file_ermite_git_proto_msgTypes[13]
1146 if x != nil {1276 if x != nil {
1147 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))1277 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
1148 if ms.LoadMessageInfo() == nil {1278 if ms.LoadMessageInfo() == nil {
@@ -1155,7 +1285,7 @@ func (x *GetCommitRequest) ProtoReflect() protoreflect.Message {
1155 1285
1156 // Deprecated: Use GetCommitRequest.ProtoReflect.Descriptor instead.1286 // Deprecated: Use GetCommitRequest.ProtoReflect.Descriptor instead.
1157 func (*GetCommitRequest) Descriptor() ([]byte, []int) {1287 func (*GetCommitRequest) Descriptor() ([]byte, []int) {
1158- return file_ermite_git_proto_rawDescGZIP(), []int{11}1288+ return file_ermite_git_proto_rawDescGZIP(), []int{13}
1159 }1289 }
1160 1290
1161 func (x *GetCommitRequest) GetRepo() string {1291 func (x *GetCommitRequest) GetRepo() string {
@@ -1190,7 +1320,7 @@ type GetCommitResponse struct {
1190 1320
1191 func (x *GetCommitResponse) Reset() {1321 func (x *GetCommitResponse) Reset() {
1192 *x = GetCommitResponse{}1322 *x = GetCommitResponse{}
1193- mi := &file_ermite_git_proto_msgTypes[12]1323+ mi := &file_ermite_git_proto_msgTypes[14]
1194 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))1324 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
1195 ms.StoreMessageInfo(mi)1325 ms.StoreMessageInfo(mi)
1196 }1326 }
@@ -1202,7 +1332,7 @@ func (x *GetCommitResponse) String() string {
1202 func (*GetCommitResponse) ProtoMessage() {}1332 func (*GetCommitResponse) ProtoMessage() {}
1203 1333
1204 func (x *GetCommitResponse) ProtoReflect() protoreflect.Message {1334 func (x *GetCommitResponse) ProtoReflect() protoreflect.Message {
1205- mi := &file_ermite_git_proto_msgTypes[12]1335+ mi := &file_ermite_git_proto_msgTypes[14]
1206 if x != nil {1336 if x != nil {
1207 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))1337 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
1208 if ms.LoadMessageInfo() == nil {1338 if ms.LoadMessageInfo() == nil {
@@ -1215,7 +1345,7 @@ func (x *GetCommitResponse) ProtoReflect() protoreflect.Message {
1215 1345
1216 // Deprecated: Use GetCommitResponse.ProtoReflect.Descriptor instead.1346 // Deprecated: Use GetCommitResponse.ProtoReflect.Descriptor instead.
1217 func (*GetCommitResponse) Descriptor() ([]byte, []int) {1347 func (*GetCommitResponse) Descriptor() ([]byte, []int) {
1218- return file_ermite_git_proto_rawDescGZIP(), []int{12}1348+ return file_ermite_git_proto_rawDescGZIP(), []int{14}
1219 }1349 }
1220 1350
1221 func (x *GetCommitResponse) GetCommit() *Commit {1351 func (x *GetCommitResponse) GetCommit() *Commit {
@@ -1254,7 +1384,7 @@ type DiffStats struct {
1254 1384
1255 func (x *DiffStats) Reset() {1385 func (x *DiffStats) Reset() {
1256 *x = DiffStats{}1386 *x = DiffStats{}
1257- mi := &file_ermite_git_proto_msgTypes[13]1387+ mi := &file_ermite_git_proto_msgTypes[15]
1258 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))1388 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
1259 ms.StoreMessageInfo(mi)1389 ms.StoreMessageInfo(mi)
1260 }1390 }
@@ -1266,7 +1396,7 @@ func (x *DiffStats) String() string {
1266 func (*DiffStats) ProtoMessage() {}1396 func (*DiffStats) ProtoMessage() {}
1267 1397
1268 func (x *DiffStats) ProtoReflect() protoreflect.Message {1398 func (x *DiffStats) ProtoReflect() protoreflect.Message {
1269- mi := &file_ermite_git_proto_msgTypes[13]1399+ mi := &file_ermite_git_proto_msgTypes[15]
1270 if x != nil {1400 if x != nil {
1271 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))1401 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
1272 if ms.LoadMessageInfo() == nil {1402 if ms.LoadMessageInfo() == nil {
@@ -1279,7 +1409,7 @@ func (x *DiffStats) ProtoReflect() protoreflect.Message {
1279 1409
1280 // Deprecated: Use DiffStats.ProtoReflect.Descriptor instead.1410 // Deprecated: Use DiffStats.ProtoReflect.Descriptor instead.
1281 func (*DiffStats) Descriptor() ([]byte, []int) {1411 func (*DiffStats) Descriptor() ([]byte, []int) {
1282- return file_ermite_git_proto_rawDescGZIP(), []int{13}1412+ return file_ermite_git_proto_rawDescGZIP(), []int{15}
1283 }1413 }
1284 1414
1285 func (x *DiffStats) GetFilesChanged() int32 {1415 func (x *DiffStats) GetFilesChanged() int32 {
@@ -1323,7 +1453,7 @@ type Diff struct {
1323 1453
1324 func (x *Diff) Reset() {1454 func (x *Diff) Reset() {
1325 *x = Diff{}1455 *x = Diff{}
1326- mi := &file_ermite_git_proto_msgTypes[14]1456+ mi := &file_ermite_git_proto_msgTypes[16]
1327 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))1457 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
1328 ms.StoreMessageInfo(mi)1458 ms.StoreMessageInfo(mi)
1329 }1459 }
@@ -1335,7 +1465,7 @@ func (x *Diff) String() string {
1335 func (*Diff) ProtoMessage() {}1465 func (*Diff) ProtoMessage() {}
1336 1466
1337 func (x *Diff) ProtoReflect() protoreflect.Message {1467 func (x *Diff) ProtoReflect() protoreflect.Message {
1338- mi := &file_ermite_git_proto_msgTypes[14]1468+ mi := &file_ermite_git_proto_msgTypes[16]
1339 if x != nil {1469 if x != nil {
1340 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))1470 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
1341 if ms.LoadMessageInfo() == nil {1471 if ms.LoadMessageInfo() == nil {
@@ -1348,7 +1478,7 @@ func (x *Diff) ProtoReflect() protoreflect.Message {
1348 1478
1349 // Deprecated: Use Diff.ProtoReflect.Descriptor instead.1479 // Deprecated: Use Diff.ProtoReflect.Descriptor instead.
1350 func (*Diff) Descriptor() ([]byte, []int) {1480 func (*Diff) Descriptor() ([]byte, []int) {
1351- return file_ermite_git_proto_rawDescGZIP(), []int{14}1481+ return file_ermite_git_proto_rawDescGZIP(), []int{16}
1352 }1482 }
1353 1483
1354 func (x *Diff) GetFiles() []*FileDiff {1484 func (x *Diff) GetFiles() []*FileDiff {
@@ -1404,7 +1534,7 @@ type FileDiff struct {
1404 1534
1405 func (x *FileDiff) Reset() {1535 func (x *FileDiff) Reset() {
1406 *x = FileDiff{}1536 *x = FileDiff{}
1407- mi := &file_ermite_git_proto_msgTypes[15]1537+ mi := &file_ermite_git_proto_msgTypes[17]
1408 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))1538 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
1409 ms.StoreMessageInfo(mi)1539 ms.StoreMessageInfo(mi)
1410 }1540 }
@@ -1416,7 +1546,7 @@ func (x *FileDiff) String() string {
1416 func (*FileDiff) ProtoMessage() {}1546 func (*FileDiff) ProtoMessage() {}
1417 1547
1418 func (x *FileDiff) ProtoReflect() protoreflect.Message {1548 func (x *FileDiff) ProtoReflect() protoreflect.Message {
1419- mi := &file_ermite_git_proto_msgTypes[15]1549+ mi := &file_ermite_git_proto_msgTypes[17]
1420 if x != nil {1550 if x != nil {
1421 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))1551 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
1422 if ms.LoadMessageInfo() == nil {1552 if ms.LoadMessageInfo() == nil {
@@ -1429,7 +1559,7 @@ func (x *FileDiff) ProtoReflect() protoreflect.Message {
1429 1559
1430 // Deprecated: Use FileDiff.ProtoReflect.Descriptor instead.1560 // Deprecated: Use FileDiff.ProtoReflect.Descriptor instead.
1431 func (*FileDiff) Descriptor() ([]byte, []int) {1561 func (*FileDiff) Descriptor() ([]byte, []int) {
1432- return file_ermite_git_proto_rawDescGZIP(), []int{15}1562+ return file_ermite_git_proto_rawDescGZIP(), []int{17}
1433 }1563 }
1434 1564
1435 func (x *FileDiff) GetOldPath() string {1565 func (x *FileDiff) GetOldPath() string {
@@ -1547,7 +1677,7 @@ type Hunk struct {
1547 1677
1548 func (x *Hunk) Reset() {1678 func (x *Hunk) Reset() {
1549 *x = Hunk{}1679 *x = Hunk{}
1550- mi := &file_ermite_git_proto_msgTypes[16]1680+ mi := &file_ermite_git_proto_msgTypes[18]
1551 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))1681 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
1552 ms.StoreMessageInfo(mi)1682 ms.StoreMessageInfo(mi)
1553 }1683 }
@@ -1559,7 +1689,7 @@ func (x *Hunk) String() string {
1559 func (*Hunk) ProtoMessage() {}1689 func (*Hunk) ProtoMessage() {}
1560 1690
1561 func (x *Hunk) ProtoReflect() protoreflect.Message {1691 func (x *Hunk) ProtoReflect() protoreflect.Message {
1562- mi := &file_ermite_git_proto_msgTypes[16]1692+ mi := &file_ermite_git_proto_msgTypes[18]
1563 if x != nil {1693 if x != nil {
1564 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))1694 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
1565 if ms.LoadMessageInfo() == nil {1695 if ms.LoadMessageInfo() == nil {
@@ -1572,7 +1702,7 @@ func (x *Hunk) ProtoReflect() protoreflect.Message {
1572 1702
1573 // Deprecated: Use Hunk.ProtoReflect.Descriptor instead.1703 // Deprecated: Use Hunk.ProtoReflect.Descriptor instead.
1574 func (*Hunk) Descriptor() ([]byte, []int) {1704 func (*Hunk) Descriptor() ([]byte, []int) {
1575- return file_ermite_git_proto_rawDescGZIP(), []int{16}1705+ return file_ermite_git_proto_rawDescGZIP(), []int{18}
1576 }1706 }
1577 1707
1578 func (x *Hunk) GetOldStart() int32 {1708 func (x *Hunk) GetOldStart() int32 {
@@ -1638,7 +1768,7 @@ type Line struct {
1638 1768
1639 func (x *Line) Reset() {1769 func (x *Line) Reset() {
1640 *x = Line{}1770 *x = Line{}
1641- mi := &file_ermite_git_proto_msgTypes[17]1771+ mi := &file_ermite_git_proto_msgTypes[19]
1642 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))1772 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
1643 ms.StoreMessageInfo(mi)1773 ms.StoreMessageInfo(mi)
1644 }1774 }
@@ -1650,7 +1780,7 @@ func (x *Line) String() string {
1650 func (*Line) ProtoMessage() {}1780 func (*Line) ProtoMessage() {}
1651 1781
1652 func (x *Line) ProtoReflect() protoreflect.Message {1782 func (x *Line) ProtoReflect() protoreflect.Message {
1653- mi := &file_ermite_git_proto_msgTypes[17]1783+ mi := &file_ermite_git_proto_msgTypes[19]
1654 if x != nil {1784 if x != nil {
1655 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))1785 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
1656 if ms.LoadMessageInfo() == nil {1786 if ms.LoadMessageInfo() == nil {
@@ -1663,7 +1793,7 @@ func (x *Line) ProtoReflect() protoreflect.Message {
1663 1793
1664 // Deprecated: Use Line.ProtoReflect.Descriptor instead.1794 // Deprecated: Use Line.ProtoReflect.Descriptor instead.
1665 func (*Line) Descriptor() ([]byte, []int) {1795 func (*Line) Descriptor() ([]byte, []int) {
1666- return file_ermite_git_proto_rawDescGZIP(), []int{17}1796+ return file_ermite_git_proto_rawDescGZIP(), []int{19}
1667 }1797 }
1668 1798
1669 func (x *Line) GetKind() LineKind {1799 func (x *Line) GetKind() LineKind {
@@ -1714,7 +1844,7 @@ type ResolveRevisionRequest struct {
1714 1844
1715 func (x *ResolveRevisionRequest) Reset() {1845 func (x *ResolveRevisionRequest) Reset() {
1716 *x = ResolveRevisionRequest{}1846 *x = ResolveRevisionRequest{}
1717- mi := &file_ermite_git_proto_msgTypes[18]1847+ mi := &file_ermite_git_proto_msgTypes[20]
1718 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))1848 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
1719 ms.StoreMessageInfo(mi)1849 ms.StoreMessageInfo(mi)
1720 }1850 }
@@ -1726,7 +1856,7 @@ func (x *ResolveRevisionRequest) String() string {
1726 func (*ResolveRevisionRequest) ProtoMessage() {}1856 func (*ResolveRevisionRequest) ProtoMessage() {}
1727 1857
1728 func (x *ResolveRevisionRequest) ProtoReflect() protoreflect.Message {1858 func (x *ResolveRevisionRequest) ProtoReflect() protoreflect.Message {
1729- mi := &file_ermite_git_proto_msgTypes[18]1859+ mi := &file_ermite_git_proto_msgTypes[20]
1730 if x != nil {1860 if x != nil {
1731 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))1861 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
1732 if ms.LoadMessageInfo() == nil {1862 if ms.LoadMessageInfo() == nil {
@@ -1739,7 +1869,7 @@ func (x *ResolveRevisionRequest) ProtoReflect() protoreflect.Message {
1739 1869
1740 // Deprecated: Use ResolveRevisionRequest.ProtoReflect.Descriptor instead.1870 // Deprecated: Use ResolveRevisionRequest.ProtoReflect.Descriptor instead.
1741 func (*ResolveRevisionRequest) Descriptor() ([]byte, []int) {1871 func (*ResolveRevisionRequest) Descriptor() ([]byte, []int) {
1742- return file_ermite_git_proto_rawDescGZIP(), []int{18}1872+ return file_ermite_git_proto_rawDescGZIP(), []int{20}
1743 }1873 }
1744 1874
1745 func (x *ResolveRevisionRequest) GetRepo() string {1875 func (x *ResolveRevisionRequest) GetRepo() string {
@@ -1772,7 +1902,7 @@ type ResolveRevisionResponse struct {
1772 1902
1773 func (x *ResolveRevisionResponse) Reset() {1903 func (x *ResolveRevisionResponse) Reset() {
1774 *x = ResolveRevisionResponse{}1904 *x = ResolveRevisionResponse{}
1775- mi := &file_ermite_git_proto_msgTypes[19]1905+ mi := &file_ermite_git_proto_msgTypes[21]
1776 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))1906 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
1777 ms.StoreMessageInfo(mi)1907 ms.StoreMessageInfo(mi)
1778 }1908 }
@@ -1784,7 +1914,7 @@ func (x *ResolveRevisionResponse) String() string {
1784 func (*ResolveRevisionResponse) ProtoMessage() {}1914 func (*ResolveRevisionResponse) ProtoMessage() {}
1785 1915
1786 func (x *ResolveRevisionResponse) ProtoReflect() protoreflect.Message {1916 func (x *ResolveRevisionResponse) ProtoReflect() protoreflect.Message {
1787- mi := &file_ermite_git_proto_msgTypes[19]1917+ mi := &file_ermite_git_proto_msgTypes[21]
1788 if x != nil {1918 if x != nil {
1789 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))1919 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
1790 if ms.LoadMessageInfo() == nil {1920 if ms.LoadMessageInfo() == nil {
@@ -1797,7 +1927,7 @@ func (x *ResolveRevisionResponse) ProtoReflect() protoreflect.Message {
1797 1927
1798 // Deprecated: Use ResolveRevisionResponse.ProtoReflect.Descriptor instead.1928 // Deprecated: Use ResolveRevisionResponse.ProtoReflect.Descriptor instead.
1799 func (*ResolveRevisionResponse) Descriptor() ([]byte, []int) {1929 func (*ResolveRevisionResponse) Descriptor() ([]byte, []int) {
1800- return file_ermite_git_proto_rawDescGZIP(), []int{19}1930+ return file_ermite_git_proto_rawDescGZIP(), []int{21}
1801 }1931 }
1802 1932
1803 func (x *ResolveRevisionResponse) GetCommitId() string {1933 func (x *ResolveRevisionResponse) GetCommitId() string {
@@ -1854,7 +1984,15 @@ const file_ermite_git_proto_rawDesc = "" +
1854 "\atree_id\x18\x02 \x01(\tR\x06treeId\x12+\n" +1984 "\atree_id\x18\x02 \x01(\tR\x06treeId\x12+\n" +
1855 "\aentries\x18\x03 \x03(\v2\x11.ermite.TreeEntryR\aentries\x124\n" +1985 "\aentries\x18\x03 \x03(\v2\x11.ermite.TreeEntryR\aentries\x124\n" +
1856 "\x16last_commits_truncated\x18\x04 \x01(\bR\x14lastCommitsTruncated\x12\x1c\n" +1986 "\x16last_commits_truncated\x18\x04 \x01(\bR\x14lastCommitsTruncated\x12\x1c\n" +
1857- "\ttruncated\x18\x05 \x01(\bR\ttruncated\"\x8d\x01\n" +1987+ "\ttruncated\x18\x05 \x01(\bR\ttruncated\"B\n" +
1988+ "\x10ListPathsRequest\x12\x12\n" +
1989+ "\x04repo\x18\x01 \x01(\tR\x04repo\x12\x1a\n" +
1990+ "\brevision\x18\x02 \x01(\tR\brevision\"}\n" +
1991+ "\x11ListPathsResponse\x12\x1b\n" +
1992+ "\tcommit_id\x18\x01 \x01(\tR\bcommitId\x12\x17\n" +
1993+ "\atree_id\x18\x02 \x01(\tR\x06treeId\x12\x14\n" +
1994+ "\x05paths\x18\x03 \x03(\tR\x05paths\x12\x1c\n" +
1995+ "\ttruncated\x18\x04 \x01(\bR\ttruncated\"\x8d\x01\n" +
1858 "\bBlobInfo\x12\x0e\n" +1996 "\bBlobInfo\x12\x0e\n" +
1859 "\x02id\x18\x01 \x01(\tR\x02id\x12\x12\n" +1997 "\x02id\x18\x01 \x01(\tR\x02id\x12\x12\n" +
1860 "\x04path\x18\x02 \x01(\tR\x04path\x12\x12\n" +1998 "\x04path\x18\x02 \x01(\tR\x04path\x12\x12\n" +
@@ -1957,11 +2095,12 @@ const file_ermite_git_proto_rawDesc = "" +
1957 "\x15LINE_KIND_UNSPECIFIED\x10\x00\x12\x15\n" +2095 "\x15LINE_KIND_UNSPECIFIED\x10\x00\x12\x15\n" +
1958 "\x11LINE_KIND_CONTEXT\x10\x01\x12\x16\n" +2096 "\x11LINE_KIND_CONTEXT\x10\x01\x12\x16\n" +
1959 "\x12LINE_KIND_ADDITION\x10\x02\x12\x16\n" +2097 "\x12LINE_KIND_ADDITION\x10\x02\x12\x16\n" +
1960- "\x12LINE_KIND_DELETION\x10\x032\xa3\x03\n" +2098+ "\x12LINE_KIND_DELETION\x10\x032\xe5\x03\n" +
1961 "\n" +2099 "\n" +
1962 "GitService\x12=\n" +2100 "GitService\x12=\n" +
1963 "\bListRefs\x12\x17.ermite.ListRefsRequest\x1a\x18.ermite.ListRefsResponse\x12:\n" +2101 "\bListRefs\x12\x17.ermite.ListRefsRequest\x1a\x18.ermite.ListRefsResponse\x12:\n" +
1964- "\aGetTree\x12\x16.ermite.GetTreeRequest\x1a\x17.ermite.GetTreeResponse\x12<\n" +2102+ "\aGetTree\x12\x16.ermite.GetTreeRequest\x1a\x17.ermite.GetTreeResponse\x12@\n" +
2103+ "\tListPaths\x12\x18.ermite.ListPathsRequest\x1a\x19.ermite.ListPathsResponse\x12<\n" +
1965 "\aGetBlob\x12\x16.ermite.GetBlobRequest\x1a\x17.ermite.GetBlobResponse0\x01\x12F\n" +2104 "\aGetBlob\x12\x16.ermite.GetBlobRequest\x1a\x17.ermite.GetBlobResponse0\x01\x12F\n" +
1966 "\vListCommits\x12\x1a.ermite.ListCommitsRequest\x1a\x1b.ermite.ListCommitsResponse\x12@\n" +2105 "\vListCommits\x12\x1a.ermite.ListCommitsRequest\x1a\x1b.ermite.ListCommitsResponse\x12@\n" +
1967 "\tGetCommit\x12\x18.ermite.GetCommitRequest\x1a\x19.ermite.GetCommitResponse\x12R\n" +2106 "\tGetCommit\x12\x18.ermite.GetCommitRequest\x1a\x19.ermite.GetCommitResponse\x12R\n" +
@@ -1982,7 +2121,7 @@ func file_ermite_git_proto_rawDescGZIP() []byte {
1982 }2121 }
1983 2122
1984 var file_ermite_git_proto_enumTypes = make([]protoimpl.EnumInfo, 4)2123 var file_ermite_git_proto_enumTypes = make([]protoimpl.EnumInfo, 4)
1985-var file_ermite_git_proto_msgTypes = make([]protoimpl.MessageInfo, 20)2124+var file_ermite_git_proto_msgTypes = make([]protoimpl.MessageInfo, 22)
1986 var file_ermite_git_proto_goTypes = []any{2125 var file_ermite_git_proto_goTypes = []any{
1987 (RefKind)(0), // 0: ermite.RefKind2126 (RefKind)(0), // 0: ermite.RefKind
1988 (EntryKind)(0), // 1: ermite.EntryKind2127 (EntryKind)(0), // 1: ermite.EntryKind
@@ -1994,53 +2133,57 @@ var file_ermite_git_proto_goTypes = []any{
1994 (*TreeEntry)(nil), // 7: ermite.TreeEntry2133 (*TreeEntry)(nil), // 7: ermite.TreeEntry
1995 (*GetTreeRequest)(nil), // 8: ermite.GetTreeRequest2134 (*GetTreeRequest)(nil), // 8: ermite.GetTreeRequest
1996 (*GetTreeResponse)(nil), // 9: ermite.GetTreeResponse2135 (*GetTreeResponse)(nil), // 9: ermite.GetTreeResponse
1997- (*BlobInfo)(nil), // 10: ermite.BlobInfo2136+ (*ListPathsRequest)(nil), // 10: ermite.ListPathsRequest
1998- (*GetBlobRequest)(nil), // 11: ermite.GetBlobRequest2137+ (*ListPathsResponse)(nil), // 11: ermite.ListPathsResponse
1999- (*GetBlobResponse)(nil), // 12: ermite.GetBlobResponse2138+ (*BlobInfo)(nil), // 12: ermite.BlobInfo
2000- (*ListCommitsRequest)(nil), // 13: ermite.ListCommitsRequest2139+ (*GetBlobRequest)(nil), // 13: ermite.GetBlobRequest
2001- (*ListCommitsResponse)(nil), // 14: ermite.ListCommitsResponse2140+ (*GetBlobResponse)(nil), // 14: ermite.GetBlobResponse
2002- (*GetCommitRequest)(nil), // 15: ermite.GetCommitRequest2141+ (*ListCommitsRequest)(nil), // 15: ermite.ListCommitsRequest
2003- (*GetCommitResponse)(nil), // 16: ermite.GetCommitResponse2142+ (*ListCommitsResponse)(nil), // 16: ermite.ListCommitsResponse
2004- (*DiffStats)(nil), // 17: ermite.DiffStats2143+ (*GetCommitRequest)(nil), // 17: ermite.GetCommitRequest
2005- (*Diff)(nil), // 18: ermite.Diff2144+ (*GetCommitResponse)(nil), // 18: ermite.GetCommitResponse
2006- (*FileDiff)(nil), // 19: ermite.FileDiff2145+ (*DiffStats)(nil), // 19: ermite.DiffStats
2007- (*Hunk)(nil), // 20: ermite.Hunk2146+ (*Diff)(nil), // 20: ermite.Diff
2008- (*Line)(nil), // 21: ermite.Line2147+ (*FileDiff)(nil), // 21: ermite.FileDiff
2009- (*ResolveRevisionRequest)(nil), // 22: ermite.ResolveRevisionRequest2148+ (*Hunk)(nil), // 22: ermite.Hunk
2010- (*ResolveRevisionResponse)(nil), // 23: ermite.ResolveRevisionResponse2149+ (*Line)(nil), // 23: ermite.Line
2011- (*Commit)(nil), // 24: ermite.Commit2150+ (*ResolveRevisionRequest)(nil), // 24: ermite.ResolveRevisionRequest
2151+ (*ResolveRevisionResponse)(nil), // 25: ermite.ResolveRevisionResponse
2152+ (*Commit)(nil), // 26: ermite.Commit
2012 }2153 }
2013 var file_ermite_git_proto_depIdxs = []int32{2154 var file_ermite_git_proto_depIdxs = []int32{
2014 0, // 0: ermite.Ref.kind:type_name -> ermite.RefKind2155 0, // 0: ermite.Ref.kind:type_name -> ermite.RefKind
2015 0, // 1: ermite.ListRefsRequest.kinds:type_name -> ermite.RefKind2156 0, // 1: ermite.ListRefsRequest.kinds:type_name -> ermite.RefKind
2016 4, // 2: ermite.ListRefsResponse.refs:type_name -> ermite.Ref2157 4, // 2: ermite.ListRefsResponse.refs:type_name -> ermite.Ref
2017 1, // 3: ermite.TreeEntry.kind:type_name -> ermite.EntryKind2158 1, // 3: ermite.TreeEntry.kind:type_name -> ermite.EntryKind
2018- 24, // 4: ermite.TreeEntry.last_commit:type_name -> ermite.Commit2159+ 26, // 4: ermite.TreeEntry.last_commit:type_name -> ermite.Commit
2019 7, // 5: ermite.GetTreeResponse.entries:type_name -> ermite.TreeEntry2160 7, // 5: ermite.GetTreeResponse.entries:type_name -> ermite.TreeEntry
2020- 10, // 6: ermite.GetBlobResponse.info:type_name -> ermite.BlobInfo2161+ 12, // 6: ermite.GetBlobResponse.info:type_name -> ermite.BlobInfo
2021- 24, // 7: ermite.ListCommitsResponse.commits:type_name -> ermite.Commit2162+ 26, // 7: ermite.ListCommitsResponse.commits:type_name -> ermite.Commit
2022- 24, // 8: ermite.GetCommitResponse.commit:type_name -> ermite.Commit2163+ 26, // 8: ermite.GetCommitResponse.commit:type_name -> ermite.Commit
2023- 17, // 9: ermite.GetCommitResponse.stats:type_name -> ermite.DiffStats2164+ 19, // 9: ermite.GetCommitResponse.stats:type_name -> ermite.DiffStats
2024- 18, // 10: ermite.GetCommitResponse.diff:type_name -> ermite.Diff2165+ 20, // 10: ermite.GetCommitResponse.diff:type_name -> ermite.Diff
2025- 19, // 11: ermite.Diff.files:type_name -> ermite.FileDiff2166+ 21, // 11: ermite.Diff.files:type_name -> ermite.FileDiff
2026 2, // 12: ermite.FileDiff.status:type_name -> ermite.FileStatus2167 2, // 12: ermite.FileDiff.status:type_name -> ermite.FileStatus
2027- 20, // 13: ermite.FileDiff.hunks:type_name -> ermite.Hunk2168+ 22, // 13: ermite.FileDiff.hunks:type_name -> ermite.Hunk
2028- 21, // 14: ermite.Hunk.lines:type_name -> ermite.Line2169+ 23, // 14: ermite.Hunk.lines:type_name -> ermite.Line
2029 3, // 15: ermite.Line.kind:type_name -> ermite.LineKind2170 3, // 15: ermite.Line.kind:type_name -> ermite.LineKind
2030 5, // 16: ermite.GitService.ListRefs:input_type -> ermite.ListRefsRequest2171 5, // 16: ermite.GitService.ListRefs:input_type -> ermite.ListRefsRequest
2031 8, // 17: ermite.GitService.GetTree:input_type -> ermite.GetTreeRequest2172 8, // 17: ermite.GitService.GetTree:input_type -> ermite.GetTreeRequest
2032- 11, // 18: ermite.GitService.GetBlob:input_type -> ermite.GetBlobRequest2173+ 10, // 18: ermite.GitService.ListPaths:input_type -> ermite.ListPathsRequest
2033- 13, // 19: ermite.GitService.ListCommits:input_type -> ermite.ListCommitsRequest2174+ 13, // 19: ermite.GitService.GetBlob:input_type -> ermite.GetBlobRequest
2034- 15, // 20: ermite.GitService.GetCommit:input_type -> ermite.GetCommitRequest2175+ 15, // 20: ermite.GitService.ListCommits:input_type -> ermite.ListCommitsRequest
2035- 22, // 21: ermite.GitService.ResolveRevision:input_type -> ermite.ResolveRevisionRequest2176+ 17, // 21: ermite.GitService.GetCommit:input_type -> ermite.GetCommitRequest
2036- 6, // 22: ermite.GitService.ListRefs:output_type -> ermite.ListRefsResponse2177+ 24, // 22: ermite.GitService.ResolveRevision:input_type -> ermite.ResolveRevisionRequest
2037- 9, // 23: ermite.GitService.GetTree:output_type -> ermite.GetTreeResponse2178+ 6, // 23: ermite.GitService.ListRefs:output_type -> ermite.ListRefsResponse
2038- 12, // 24: ermite.GitService.GetBlob:output_type -> ermite.GetBlobResponse2179+ 9, // 24: ermite.GitService.GetTree:output_type -> ermite.GetTreeResponse
2039- 14, // 25: ermite.GitService.ListCommits:output_type -> ermite.ListCommitsResponse2180+ 11, // 25: ermite.GitService.ListPaths:output_type -> ermite.ListPathsResponse
2040- 16, // 26: ermite.GitService.GetCommit:output_type -> ermite.GetCommitResponse2181+ 14, // 26: ermite.GitService.GetBlob:output_type -> ermite.GetBlobResponse
2041- 23, // 27: ermite.GitService.ResolveRevision:output_type -> ermite.ResolveRevisionResponse2182+ 16, // 27: ermite.GitService.ListCommits:output_type -> ermite.ListCommitsResponse
2042- 22, // [22:28] is the sub-list for method output_type2183+ 18, // 28: ermite.GitService.GetCommit:output_type -> ermite.GetCommitResponse
2043- 16, // [16:22] is the sub-list for method input_type2184+ 25, // 29: ermite.GitService.ResolveRevision:output_type -> ermite.ResolveRevisionResponse
2185+ 23, // [23:30] is the sub-list for method output_type
2186+ 16, // [16:23] is the sub-list for method input_type
2044 16, // [16:16] is the sub-list for extension type_name2187 16, // [16:16] is the sub-list for extension type_name
2045 16, // [16:16] is the sub-list for extension extendee2188 16, // [16:16] is the sub-list for extension extendee
2046 0, // [0:16] is the sub-list for field type_name2189 0, // [0:16] is the sub-list for field type_name
@@ -2058,7 +2201,7 @@ func file_ermite_git_proto_init() {
2058 GoPackagePath: reflect.TypeOf(x{}).PkgPath(),2201 GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
2059 RawDescriptor: unsafe.Slice(unsafe.StringData(file_ermite_git_proto_rawDesc), len(file_ermite_git_proto_rawDesc)),2202 RawDescriptor: unsafe.Slice(unsafe.StringData(file_ermite_git_proto_rawDesc), len(file_ermite_git_proto_rawDesc)),
2060 NumEnums: 4,2203 NumEnums: 4,
2061- NumMessages: 20,2204+ NumMessages: 22,
2062 NumExtensions: 0,2205 NumExtensions: 0,
2063 NumServices: 1,2206 NumServices: 1,
2064 },2207 },
M gen_test.go +1 -0
@@ -22,6 +22,7 @@ func TestProcedures(t *testing.T) {
2222 {ermiteconnect.RepoServiceDeleteRepoProcedure, "/ermite.RepoService/DeleteRepo"},
2323 {ermiteconnect.GitServiceListRefsProcedure, "/ermite.GitService/ListRefs"},
2424 {ermiteconnect.GitServiceGetTreeProcedure, "/ermite.GitService/GetTree"},
25+ {ermiteconnect.GitServiceListPathsProcedure, "/ermite.GitService/ListPaths"},
2526 {ermiteconnect.GitServiceGetBlobProcedure, "/ermite.GitService/GetBlob"},
2627 {ermiteconnect.GitServiceListCommitsProcedure, "/ermite.GitService/ListCommits"},
2728 {ermiteconnect.GitServiceGetCommitProcedure, "/ermite.GitService/GetCommit"},
@@ -22,6 +22,7 @@ func TestProcedures(t *testing.T) {
22 {ermiteconnect.RepoServiceDeleteRepoProcedure, "/ermite.RepoService/DeleteRepo"},22 {ermiteconnect.RepoServiceDeleteRepoProcedure, "/ermite.RepoService/DeleteRepo"},
23 {ermiteconnect.GitServiceListRefsProcedure, "/ermite.GitService/ListRefs"},23 {ermiteconnect.GitServiceListRefsProcedure, "/ermite.GitService/ListRefs"},
24 {ermiteconnect.GitServiceGetTreeProcedure, "/ermite.GitService/GetTree"},24 {ermiteconnect.GitServiceGetTreeProcedure, "/ermite.GitService/GetTree"},
25+ {ermiteconnect.GitServiceListPathsProcedure, "/ermite.GitService/ListPaths"},
25 {ermiteconnect.GitServiceGetBlobProcedure, "/ermite.GitService/GetBlob"},26 {ermiteconnect.GitServiceGetBlobProcedure, "/ermite.GitService/GetBlob"},
26 {ermiteconnect.GitServiceListCommitsProcedure, "/ermite.GitService/ListCommits"},27 {ermiteconnect.GitServiceListCommitsProcedure, "/ermite.GitService/ListCommits"},
27 {ermiteconnect.GitServiceGetCommitProcedure, "/ermite.GitService/GetCommit"},28 {ermiteconnect.GitServiceGetCommitProcedure, "/ermite.GitService/GetCommit"},
M proto/ermite/git.proto +29 -0
@@ -81,6 +81,13 @@ service GitService {
8181 // not_found if the path does not exist and invalid_argument if it is not a
8282 // directory.
8383 rpc GetTree(GetTreeRequest) returns (GetTreeResponse);
84+ // ListPaths lists the paths of every file and symbolic link of a revision,
85+ // recursively, in Git tree order (the order of `git ls-tree -r`). Directories
86+ // and submodules are not listed, nor paths GetBlob cannot address (not valid
87+ // UTF-8, or with a control character). Fails with not_found for an unknown
88+ // revision or an empty repository. Servers that have it advertise the
89+ // feature "git.list_paths" in GetVersion.
90+ rpc ListPaths(ListPathsRequest) returns (ListPathsResponse);
8491 // GetBlob streams the content of a file at a revision, in chunks of at most
8592 // 64 KiB. The first message carries the metadata in info, then the chunks
8693 // follow; the memory used by the server does not depend on the file size.
@@ -199,6 +206,28 @@ message GetTreeResponse {
199206 bool truncated = 5;
200207 }
201208
209+// ListPathsRequest selects a revision.
210+message ListPathsRequest {
211+ // Repo is the repository name.
212+ string repo = 1;
213+ // Revision is a branch, a tag or a commit id. Empty means HEAD.
214+ string revision = 2;
215+}
216+
217+// ListPathsResponse lists the file paths of a revision.
218+message ListPathsResponse {
219+ // CommitId is the id of the commit the revision resolved to.
220+ string commit_id = 1;
221+ // TreeId is the object id of its root tree.
222+ string tree_id = 2;
223+ // Paths are the paths of the files and symbolic links, in Git tree order. A
224+ // response holds at most 100,000 paths and 8 MiB of path bytes (server limits
225+ // that may change; rely on truncated, not on the numbers).
226+ repeated string paths = 3;
227+ // Truncated is true when more paths exist past the first ones returned.
228+ bool truncated = 4;
229+}
230+
202231 // BlobInfo describes a file.
203232 message BlobInfo {
204233 // Id is the object id of the blob.
@@ -81,6 +81,13 @@ service GitService {
81 // not_found if the path does not exist and invalid_argument if it is not a81 // not_found if the path does not exist and invalid_argument if it is not a
82 // directory.82 // directory.
83 rpc GetTree(GetTreeRequest) returns (GetTreeResponse);83 rpc GetTree(GetTreeRequest) returns (GetTreeResponse);
84+ // ListPaths lists the paths of every file and symbolic link of a revision,
85+ // recursively, in Git tree order (the order of `git ls-tree -r`). Directories
86+ // and submodules are not listed, nor paths GetBlob cannot address (not valid
87+ // UTF-8, or with a control character). Fails with not_found for an unknown
88+ // revision or an empty repository. Servers that have it advertise the
89+ // feature "git.list_paths" in GetVersion.
90+ rpc ListPaths(ListPathsRequest) returns (ListPathsResponse);
84 // GetBlob streams the content of a file at a revision, in chunks of at most91 // GetBlob streams the content of a file at a revision, in chunks of at most
85 // 64 KiB. The first message carries the metadata in info, then the chunks92 // 64 KiB. The first message carries the metadata in info, then the chunks
86 // follow; the memory used by the server does not depend on the file size.93 // follow; the memory used by the server does not depend on the file size.
@@ -199,6 +206,28 @@ message GetTreeResponse {
199 bool truncated = 5;206 bool truncated = 5;
200 }207 }
201 208
209+// ListPathsRequest selects a revision.
210+message ListPathsRequest {
211+ // Repo is the repository name.
212+ string repo = 1;
213+ // Revision is a branch, a tag or a commit id. Empty means HEAD.
214+ string revision = 2;
215+}
216+
217+// ListPathsResponse lists the file paths of a revision.
218+message ListPathsResponse {
219+ // CommitId is the id of the commit the revision resolved to.
220+ string commit_id = 1;
221+ // TreeId is the object id of its root tree.
222+ string tree_id = 2;
223+ // Paths are the paths of the files and symbolic links, in Git tree order. A
224+ // response holds at most 100,000 paths and 8 MiB of path bytes (server limits
225+ // that may change; rely on truncated, not on the numbers).
226+ repeated string paths = 3;
227+ // Truncated is true when more paths exist past the first ones returned.
228+ bool truncated = 4;
229+}
230+
202 // BlobInfo describes a file.231 // BlobInfo describes a file.
203 message BlobInfo {232 message BlobInfo {
204 // Id is the object id of the blob.233 // Id is the object id of the blob.

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