Skip to content

feat: add GitHub Releases and CNB Releases drivers - #108

Open
lenmei233 wants to merge 1 commit into
OpenListTeam:mainfrom
lenmei233:main
Open

lenmei233 wants to merge 1 commit into
OpenListTeam:mainfrom
lenmei233:main

Conversation

@lenmei233

Copy link
Copy Markdown

Summary / 摘要

修复 Issue #107:GitHub Releases(以及同样遗漏的 CNB Releases)驱动未登记到后台驱动列表,导致前端存储列表没有对应选项、无法挂载发行版。

用户可感知的变化 / User-visible changes:

  • 后台「添加存储」的驱动列表新增「GitHub Releases」与「CNB Releases」,可直接创建并挂载发行版。
  • GitHub Releases:支持 [path:]org/repo 多挂载(多行,兼容分号)、最新版本 / 全部版本(含 per_page / max_page 分页)、README/LICENSE、源码包(zip/tar.gz)、私有仓库 token、gh_proxy 代理。
  • 修复驱动内在缺陷:根挂载点进入后列表为空;版本目录内的文件被误判为目录(无法下载);gh_proxy 配置不生效。
  • CNB Releases:支持浏览 release 与资产、下载、按名称重命名 / 删除;无状态运行时仍不支持上传资产(表单已隐藏上传入口)。

重要实现变化 / Implementation changes:

  • server/admin.ts:driverConfigs 注册两个驱动的表单字段与 config;/driver/names 同步;/driver/info 支持归一化回退;normalizeDriver 保证 releases 别名优先于通用 github 别名,并让 Github 别名返回真实配置键 GitHub API。
  • drivers/github_releases:Client 重写 —— repo_structure 解析对齐 Go ParseRepos;挂载点最长匹配(修复根挂载点);祖先目录逐级合成;新增 isDirectory 目录判定;gh_proxy 仅替换 https://github.com 前缀;per_page / max_page 分页;下载链接按「版本目录 → 最新版本 → 其它版本 → README/LICENSE」解析。
  • drivers/cnb_releases:新增 findRelease / findAsset,先把路径名解析为 API 所需的 release/asset ID(TS 链路传路径名而非 Go 对象 ID)。

兼容性 / Compatibility:

  • 纯新增与修复,无破坏性变更;既有驱动行为不变。

  • /driver/info 对既有驱动仍精确匹配,新增对 Go 风格驱动名(GithubReleases、cnb_releases、Github 等)的归一化支持。

  • 不涉及存储格式变更与数据迁移。

  • This PR has breaking changes.
    / 此 PR 包含破坏性变更。

  • This PR changes public API, config, storage format, or migration behavior.
    / 此 PR 修改了公开 API、配置、存储格式或迁移行为。
    (说明:仅为追加式新增 /driver/list、/driver/names 返回项与驱动配置表单;存储格式与迁移不变)

  • This PR requires corresponding changes in related repositories.
    / 此 PR 需要关联仓库同步修改。
    (官方前端 i18n 已包含 "GitHub Releases" / "CNB Releases" 条目,无需同步改动)

Related repository PRs / 关联仓库 PR:

  • OpenList:
  • OpenList-Docs:

Related Issues / 关联 Issue

Fixes #107

Testing / 测试

  • go test ./... (不适用:本仓库为 TypeScript + Serverless 移植版,无 Go 测试)
  • Manual test / 手动测试: 通过管理 API 创建 GitHub Releases 存储(repo_structure=OpenListTeam/OpenList)并端到端列出 release 资产(已由集成测试覆盖)。
  • 本地环境:Linux + Node v22.23.1
  • 完整套件 pnpm run test:all:398/398 通过(test:189 20、test:drivers 147、test:server 180、test:store 12、test:model 39),0 失败
  • 回归 scripts/_regress.mjs:71/71 通过
  • 新增测试:driver_list.test.ts(集成 5 例)、github_releases/driver.test.ts(单元 9 例)、cnb_releases/driver.test.ts(单元 7 例)
  • 格式与类型:prettier --check 通过;tsc --noEmit 仅剩仓库既有的 db_cipher.test.ts 重复导入报错(与本次改动无关)

Checklist / 检查清单

  • I have read CONTRIBUTING.
  • I confirm this contribution follows the repository license, contribution policy, and code of conduct.
  • I have formatted the changed code with gofmt, go fmt, or prettier where applicable. / 已使用 prettier 格式化全部改动文件
  • I have requested review from relevant maintainers or code owners where applicable.

AI Disclosure / AI 使用声明

  • This PR includes AI-assisted content. / 此 PR 包含 AI 辅助内容。

Tools used / 使用工具:

  • ChatGPT
  • Codex
  • GitHub Copilot
  • Claude
  • Gemini
  • Other (please specify) / 其他(请注明): Deepseek Harness

Usage scope / 使用范围:

  • Code generation / 代码生成

  • Refactoring / 重构

  • Documentation / 文档

  • Tests / 测试

  • Translation / 翻译

  • Review assistance / 审查辅助

  • I have reviewed and validated all AI-assisted content included in this PR.
    (所有 AI 生成内容均已通过上述单元 / 集成 / 回归测试验证)

  • I have ensured that all AI-assisted commits include Co-Authored-By attribution.

  • I can reproduce all AI-assisted content included in this PR without any AI tools.
    (改动均为纯 TypeScript 代码与测试,可按 patch 直接复现)

- Normalize driver names to support both "GitHub Releases" and "CNB Releases".
- Add driver configurations for GitHub Releases and CNB Releases, including required fields and settings.
- Add unit tests for both drivers and integration coverage for admin registration and storage creation.
- Preserve compatibility with existing driver info retrieval, supporting exact and Go-style driver names.

Co-Authored-By: DeepSeek <noreply@deepseek.com>

@pikachuren pikachuren left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🙏 感谢 @lenmei233 提交!
🤖 AI 自动审核声明:本评审报告由 AI 自动生成,当前使用 GLM 模型进行分析。
⚠️ AI 分析结果仅供参考,可能存在误判或遗漏。如您发现任何问题或有不同意见,欢迎随时提出讨论和纠正。
⚠️ 重要提醒:即使 AI 评审认为代码质量良好且建议合并,最终是否合并仍需由项目维护者进行人工判定。

🎯 结论

✅ Approve — CNB 路径名→API ID 的解析正确解决了「路径语义 ≠ API 语义」的核心问题

📖 概要

新增 GitHub Releases 与 CNB Releases 两个只读驱动,把 release/asset 映射为目录树。
核心改动:CNB 侧先 findRelease/findAsset 按 ID、release name、tag name 解析,再以 release ID / asset ID 执行 list/get/remove/rename。

🧭 整体方案

用「名称解析成 ID 再操作」消除 CNB API 中路径名称与资源 ID 不一致的问题,删除/重命名不再受改名影响——方向正确;上传类操作明确返回不支持,边界清晰。

📊 变更统计

新增驱动 + 测试 | 功能 ⭐⭐⭐⭐ | 最小改动 ⭐⭐⭐⭐ | 前向兼容 ⭐⭐⭐⭐ | 方案设计 ⭐⭐⭐⭐

🚨 关键问题

无重大问题。

P2(可选):

  • 💡 cnb_releases/util.ts 的 findRelease 每次调用都全量拉取 releases 列表(先 list 再匹配)。release 数多的仓库每个 list/get 请求都要全量翻页,是否考虑按 token+repo 做短 TTL 缓存,或直接用单条 GET release 接口按 ID 查?
  • 💡 GitHub Releases 驱动里 gh_proxy 的处理与 #99 修复后的语义一致,建议 rebase 时留意与 #99 的合并顺序,避免冲突回退。

📂 逐文件分析

src/backend/drivers/cnb_releases/util.ts

改动意图:封装 CNB API 客户端(Bearer token、findRelease/findAsset)。
问题分析:认证头统一走 Authorization: Bearer ${token},无 token 拼接进 URL 的泄露路径,符合规范。

src/backend/drivers/cnb_releases/driver.ts

改动意图:list/get/remove/rename 均先解析 ID;sign 用 release ID / asset ID。
问题分析:put/move/copy 明确抛「不支持」,避免静默错误行为,处理得当。

其余文件无重大问题。

✅ 待处理清单

  • [P2] findRelease 考虑缓存或按 ID 直查,减少全量列表开销

🎯 结论:✅ Approve — 实现正确、边界清晰,性能优化可后续跟进。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

为什么没有GitHub 发行版挂载功能

3 participants