Files
gitks/task.md
T
zhenyi 66afd932ed feat(api): extend commit and diff services with new functionality
- Add FindCommit, ListCommitsByOid, CommitIsAncestor RPCs to CommitService
- Add CheckObjectsExist, CommitsByMessage, GetCommitStats RPCs to CommitService
- Add LastCommitForPath, CountCommits, CountDivergingCommits RPCs to CommitService
- Add RawDiff, RawPatch, FindChangedPaths RPCs to DiffService
- Add FindMergeBase, WriteRef, SearchFilesByContent RPCs to RepositoryService
- Add SearchFilesByName, ObjectsSize, RepositorySize RPCs to RepositoryService
- Add FindLicense, OptimizeRepository, GetRawChanges RPCs to RepositoryService
- Add FetchRemote, CreateRepositoryFromURL RPCs to RepositoryService
- Implement server handlers for all new RPC methods
- Add new modules for commit counting, finding, and querying features
- Add new modules for diff changed paths and raw operations
- Add new modules for refs and remote operations
- Remove unnecessary comments from various source files
- Update proto definitions with new message types and service methods
2026-06-08 15:37:08 +08:00

226 lines
24 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# GitKS RPC 补齐任务
> 对照 Gitaly 分析后,梳理有必要实现但目前缺失的功能,按优先级排列。
> 每个任务标注:类别、预估工作量、前置依赖、实现思路。
---
## P0 — 核心功能缺失(影响基本使用场景)
### P0-1. `RefService` — 原子性引用操作
| 项 | 内容 |
|------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| **新增 RPC** | `UpdateReferences`, `DeleteRefs`, `FindDefaultBranchName`, `RefExists` |
| **Proto** | 新建 `proto/ref.proto`(独立 RefService |
| **工作量** | **M**(3-5 天) |
| **为什么必要** | 当前 `branch.proto` / `tag.proto` 每个操作单独一个 RPC,无法做批量原子更新。`UpdateReferences` 是 Gitaly 中最核心的写操作之一,支持 `expected_old_oid` 校验 |
| **实现思路** | 1. 新建 `ref/` 模块 2. `UpdateReferences` 调用 `git update-ref --stdin` 批量原子更新 3. `DeleteRefs` 调用 `git update-ref -d` 批量删除 4. `RefExists``gix` 检查 reference 是否存在 5. `FindDefaultBranchName` 从已有的 `default_branch_name()` 抽取 |
### P0-2. `RepositoryService` — FindMergeBase
| 项 | 内容 |
|------------|-----------------------------------------------------------------------------|
| **新增 RPC** | `FindMergeBase` |
| **Proto** | 扩展现有 `proto/repository.proto` |
| **工作量** | **S**(1 天) |
| **为什么必要** | diff、merge、rebase 操作都依赖 merge-base 计算。当前 GitKS 的 merge/diff 模块各自计算,缺少独立 API |
| **实现思路** | 调用 `gix::Repository::merge_base()` 返回两个 revision 的 merge base OID |
### P0-3. `RepositoryService` — SearchFiles(代码搜索)
| 项 | 内容 |
|------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| **新增 RPC** | `SearchFilesByContent`, `SearchFilesByName` |
| **Proto** | 扩展现有 `proto/repository.proto` |
| **工作量** | **M**(2-3 天) |
| **为什么必要** | 代码搜索是代码托管平台的基础功能,当前完全缺失 |
| **实现思路** | `SearchFilesByContent``git grep -I --line-number --column <pattern> <revision>``SearchFilesByName``git ls-tree -r --name-only <revision>` + 正则过滤。需注意大仓库性能(加 timeout、limit |
### P0-4. `RepositoryService` — WriteRef
| 项 | 内容 |
|------------|------------------------------------------------------------------------------------------|
| **新增 RPC** | `WriteRef` |
| **Proto** | 扩展现有 `proto/repository.proto` |
| **工作量** | **S**(0.5 天) |
| **为什么必要** | 直接写 ref 是最底层的仓库操作,Replica 同步、快照恢复都依赖此能力。当前 `sync.rs``update_local_ref` 是内部函数,应暴露为 RPC |
| **实现思路** | `git update-ref <ref> <new_oid> <old_oid?>` -- 已有 `update_local_ref` 可直接封装 |
---
## P1 — 重要功能缺失(影响高级场景)
### P1-1. `RemoteService` — 远程仓库交互
| 项 | 内容 |
|----------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| **新增 Service** | `RemoteService`3 个 RPC |
| **新增 RPC** | `FindRemoteRepository`, `FindRemoteRootRef`, `UpdateRemoteMirror` |
| **Proto** | 新建 `proto/remote.proto` |
| **工作量** | **L**(5-7 天) |
| **为什么必要** | 支持从远程 URL 导入仓库、镜像同步。`FetchRemote` 在 Gitaly 的 RepositoryService 中也有对应 |
| **实现思路** | 1. `FindRemoteRepository``git ls-remote <url>` 2. `FindRemoteRootRef` → 取 ls-remote 的 HEAD 3. `UpdateRemoteMirror``git remote add` + `git fetch --mirror` + 清理。需注意认证(支持 SSH key / token 注入) |
### P1-2. `RepositoryService` — FetchRemote / CreateRepositoryFromURL
| 项 | 内容 |
|------------|----------------------------------------------------------------------------------------------------------------------------------------------|
| **新增 RPC** | `FetchRemote`, `CreateRepositoryFromURL` |
| **Proto** | 扩展现有 `proto/repository.proto` |
| **工作量** | **M**(3-4 天) |
| **为什么必要** | 仓库导入是核心 onboarding 流程,当前只能创建空仓库 |
| **实现思路** | `CreateRepositoryFromURL``git clone --bare --mirror <url> <path>``FetchRemote``git fetch <remote> <refspec>`。复用 RemoteService 的认证基础设施 |
### P1-3. `CommitService` — 扩展查询能力
| 项 | 内容 |
|------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| **新增 RPC** | `FindCommit`, `ListCommitsByOid`, `CommitIsAncestor`, `CheckObjectsExist`, `CommitsByMessage` |
| **Proto** | 扩展现有 `proto/commit.proto` |
| **工作量** | **M**(3-4 天) |
| **为什么必要** | 当前 `list_commits` / `get_commit` 太基础,缺少批量查询、ancestor 判断、message 搜索等常用模式 |
| **实现思路** | 1. `FindCommit``gix::Repository::find_object()` + 解析 Commit 2. `ListCommitsByOid` → 批量 `gix::Repository::find_commit()` 3. `CommitIsAncestor``gix::Repository::merge_base()` 判断 4. `CheckObjectsExist` → 批量 `gix::Repository::try_find()` 5. `CommitsByMessage``git log --all --grep=<pattern>` |
### P1-4. `RepositoryService` — ObjectsSize / RepositorySize
| 项 | 内容 |
|------------|---------------------------------------------------------------------------------------------------------|
| **新增 RPC** | `ObjectsSize`, `RepositorySize` |
| **Proto** | 扩展现有 `proto/repository.proto` |
| **工作量** | **S**(1 天) |
| **为什么必要** | 前端需要展示仓库大小、文件大小,当前 `RepositoryStatistics` 只有对象计数没有大小 |
| **实现思路** | `ObjectsSize``git cat-file --batch-check` 批量获取对象大小;`RepositorySize``du -sb <repo>` 或遍历 objects 目录 |
### P1-5. `DiffService` — RawDiff / RawPatch
| 项 | 内容 |
|------------|---------------------------------------------------------------------------------------------------------------------------------|
| **新增 RPC** | `RawDiff`, `RawPatch` |
| **Proto** | 扩展现有 `proto/diff.proto` |
| **工作量** | **S**(1 天) |
| **为什么必要** | 当前 `get_diff` 返回结构化 protobuf,对于大 diff 非常低效。Raw 格式可直接流式返回文本,用于 patch 应用、邮件发送 |
| **实现思路** | `RawDiff``git diff <base>..<head>` streaming stdout`RawPatch``git format-patch <base>..<head>` streaming。注意大 diff 时的内存控制 |
### P1-6. `CommitService` — CommitStats / LastCommitForPath
| 项 | 内容 |
|------------|--------------------------------------------------------------------------------------------------------------------------------|
| **新增 RPC** | `CommitStats`, `LastCommitForPath` |
| **Proto** | 扩展现有 `proto/commit.proto` |
| **工作量** | **S**(1 天) |
| **为什么必要** | 文件列表需要显示最后修改 commit,commit 详情需要统计信息。当前 `CommitStats` 内嵌在 `Commit` message 中需额外请求才填充 |
| **实现思路** | `CommitStats``git diff --stat <commit>^..<commit>` 解析输出;`LastCommitForPath``git log -1 --format=%H <revision> -- <path>` |
---
## P2 — 锦上添花(完善体验)
### P2-1. `RepositoryService` — FindLicense
| 项 | 内容 |
|------------|-----------------------------------------------------------------------------------------------------------------|
| **新增 RPC** | `FindLicense` |
| **工作量** | **S**(1 天) |
| **实现思路** | 基于 GitHub Licensee 算法:读取 `LICENSE*` / `COPYING*` 文件 → 用 go-license-detector 等价逻辑(Rust 可用 `askalono` crate)做文本匹配 |
### P2-2. `RepositoryService` — OptimizeRepository
| 项 | 内容 |
|------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| **新增 RPC** | `OptimizeRepository` |
| **工作量** | **M**(2-3 天) |
| **实现思路** | 根据仓库状态自动决定优化策略:loose objects > N → `repack -d`packfiles > N → `repack -ad`;没有 commit-graph → `commit-graph write`;没有 bitmap → `repack -adb`。比当前单独调用 `gc`/`repack`/`write_commit_graph` 更智能 |
### P2-3. `RepositoryService` — GetRawChanges
| 项 | 内容 |
|------------|------------------------------------------------------------------------------|
| **新增 RPC** | `GetRawChanges` |
| **工作量** | **S**(0.5 天) |
| **实现思路** | `git diff-tree --raw -r <base>..<head>` 返回纯文件级变更列表(旧模式、新模式、状态),不生成完整 diff 内容 |
### P2-4. `CommitService` — CountCommits / CountDivergingCommits
| 项 | 内容 |
|------------|-----------------------------------------------------------------------------------------------------------------------------------|
| **新增 RPC** | `CountCommits`, `CountDivergingCommits` |
| **工作量** | **S**(0.5 天) |
| **实现思路** | `CountCommits``git rev-list --count <revision>``CountDivergingCommits``git rev-list --count --left-right <left>...<right>` |
### P2-5. `RefService` — FindRefsByOID / ListRefs(增强查询)
| 项 | 内容 |
|------------|----------------------------------------------------------------------------------------------------------------------------------------------------------|
| **新增 RPC** | `FindRefsByOID`, `ListRefs` |
| **工作量** | **S**(1 天) |
| **实现思路** | `FindRefsByOID``git for-each-ref --points-at=<oid>``ListRefs``git for-each-ref --format=... --sort=...` 通用 ref 列表(当前只能在 branch/tag service 中分别查询) |
### P2-6. `DiffService` — FindChangedPaths
| 项 | 内容 |
|------------|-----------------------------------------------------------------------------------------------|
| **新增 RPC** | `FindChangedPaths` |
| **工作量** | **S**(0.5 天) |
| **实现思路** | `git diff-tree --name-status -r <base>..<head>` 只返回变更的文件路径和状态(A/M/D/R),无 diff 内容,适合只展示文件列表的场景 |
---
## P3 — 低优先级(生态特定 / 边缘场景)
### P3-1. ObjectPoolServiceFork 去重)
| 项 | 内容 |
|----------------|------------------------------------------------------------------------------|
| **新增 Service** | `ObjectPoolService`6 个 RPC |
| **工作量** | **XL**(2-3 周) |
| **前置依赖** | P0-1 `UpdateReferences` 稳定后 |
| **为什么低优** | Fork 去重是 GitLab.com 级别的需求。单租户或小规模部署用不上,且实现复杂(需管理 alternates、pool 生命周期、GC 协调) |
### P3-2. HookServiceServer 端 gRPC Hook 回调)
| 项 | 内容 |
|----------------|------------------------------------------------------------------------------------|
| **新增 Service** | `HookService`6 个 RPC |
| **工作量** | **L**(1-2 周) |
| **为什么低优** | GitKS 的 hook 是内嵌脚本执行的"客户端模式",改为 gRPC 回调的"server 模式"需要对 hook runner 彻底重构,且需要下游客户端对接 |
### P3-3. CommitService — GPG 签名相关
| 项 | 内容 |
|------------|-------------------------------------------------------------------------|
| **新增 RPC** | `GetCommitSignatures`, `FilterShasWithSignatures`, `GetTagSignatures` |
| **工作量** | **M**(2-3 天) |
| **为什么低优** | 需要 GPG 工具链依赖。可用 `gpg --verify``sequoia-openpgp`(Rust crate)实现,但非刚性需求 |
### P3-4. SmartHTTP / SSH Service — Sidechannel + SSH 支持
| 项 | 内容 |
|-----------|--------------------------------------------------------------------------------------------------|
| **新增/扩展** | `PostUploadPackWithSidechannel`, `SSHUploadPack`, `SSHReceivePack` |
| **工作量** | **XL**(3-4 周) |
| **为什么低优** | Sidechannel 需要 Unix socket 旁路,平台依赖强。SSH 支持需要完整的 SSH server 协议栈(或依赖外部 SSH → gRPC 代理)。建议通过外部网关层来解决 |
### P3-5. ServerService — 健康检查 / 磁盘统计
| 项 | 内容 |
|----------------|--------------------------------------------------------------------------------------------------------------------------|
| **新增 Service** | `ServerService`4 个 RPC |
| **工作量** | **S**(1 天) |
| **为什么低优** | GitKS 已有 Prometheus metrics endpoint + logging`ServerInfo`/`ReadinessCheck`/`DiskStatistics` 更多用于 Kubernetes/平台集成。可快速补充 |
---
## 汇总
| 优先级 | Service 数 | RPC 数 | 预估总工作量 |
|--------|-------------|---------|------------------------|
| **P0** | 2(扩展现有) | 9 | ~8 天 |
| **P1** | 1 新建 + 4 扩展 | 17 | ~17 天 |
| **P2** | 3 扩展 | 9 | ~7 天 |
| **P3** | 3 新建 + 2 扩展 | 22+ | ~10 周 |
| **合计** | | **57+** | **~13 周**P0-P2 约 5 周) |
> **建议路线**:优先完成 P0 + P1(共 26 个 RPC,约 4-5 周),可覆盖 80% 的常用场景。
> P2 在核心功能稳定后逐步添加。P3 按实际用户需求驱动,不必全部实现。