fix(drivers/189pc): sync .torrent file when copy/move/rename/upload#2522
fix(drivers/189pc): sync .torrent file when copy/move/rename/upload#2522PIKACHUIM wants to merge 4 commits into
Conversation
|
@codex review |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 1a13cca1b3
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
There was a problem hiding this comment.
Pull request overview
This PR extends the 189pc driver’s “generate torrent” behavior so that .cas.torrent files are generated or “followed” across additional operations (FastUpload, RapidUploadFromTorrent, Copy/Move/Rename), aiming to keep torrent sidecar files in sync without blocking the main operation (async goroutines).
Changes:
- Extend
FastUploadto compute SHA-1 piece hashes and asynchronously generate/upload the.cas.torrentsidecar. - After
RapidUploadFromTorrent, asynchronously upload the provided torrent data as<filename>.cas.torrent. - After cloud
Copy/Move/Rename, asynchronously copy/move/rename an existing.cas.torrentsidecar when present.
Reviewed changes
Copilot reviewed 4 out of 4 changed files in this pull request and generated 7 comments.
| File | Description |
|---|---|
| drivers/189pc/utils.go | Adds parent-id stamping on list results; extends FastUpload to optionally compute SHA-1 piece hashes and async-generate/upload torrent |
| drivers/189pc/types.go | Adds ParentId field to Cloud189File for use by follow operations |
| drivers/189pc/torrent.go | Adds async “follow copy/move/rename” helpers; RapidUploadFromTorrent uploads torrent sidecar after success |
| drivers/189pc/driver.go | Hooks torrent-follow helpers into Move/Copy/Rename |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
- Only append SHA-1 piece hash when n > 0, preventing spurious piece for empty files (BitTorrent v1 requires 0 pieces for 0-byte files) - Explicitly guard torrent generation with size > 0 - Log findFileByName errors in torrentFollowCopy/Move/Rename instead of silently discarding them - Log WaitBatchTask failure for follow-move operation - Rename Cloud189File.ParentId to ParentID to match Go initialism conventions (consistent with Cloud189Folder.ParentID, Cloud189File.ID)
Head branch was pushed to by a user without write access
| writers = append(writers, tmpF) | ||
| } | ||
|
|
||
| pieceSHA1Hashes := make([]byte, 0, count*20) |
| } else { | ||
| utils.Log.Infof("torrent 文件已上传: %s", torrentName) | ||
| op.Cache.DeleteDirectory(y, capturedDstDir.GetPath()) | ||
| } |
| // 跟随移动 torrent 文件 | ||
| if !srcObj.IsDir() { | ||
| var srcFolderId string | ||
| if f, ok := srcObj.(*Cloud189File); ok { | ||
| srcFolderId = f.ParentID | ||
| } | ||
| y.torrentFollowMove(srcFolderId, srcObj.GetName(), dstDir) | ||
| } |
| // 跟随重命名 torrent 文件 | ||
| if f, ok := srcObj.(*Cloud189File); ok { | ||
| y.torrentFollowRename(f.ParentID, srcObj.GetName(), newName) | ||
| } |
| // 跟随复制 torrent 文件 | ||
| if !srcObj.IsDir() { | ||
| var srcFolderId string | ||
| if f, ok := srcObj.(*Cloud189File); ok { | ||
| srcFolderId = f.ParentID | ||
| } | ||
| y.torrentFollowCopy(srcFolderId, srcObj.GetName(), dstDir) | ||
| } |
| } else { | ||
| utils.Log.Infof("torrent 文件已上传: %s", torrentName) | ||
| op.Cache.DeleteDirectory(y, capturedDstDir.GetPath()) | ||
| } |
| return | ||
| } | ||
| if err = y.WaitBatchTask("COPY", resp.TaskID, time.Second); err != nil { | ||
| utils.Log.Warnf("等待跟随复制 torrent 文件失败: %v", err) | ||
| } |
| return | ||
| } | ||
| if err = y.WaitBatchTask("MOVE", resp.TaskID, time.Millisecond*400); err != nil { | ||
| utils.Log.Warnf("等待跟随移动 torrent 文件失败: %v", err) | ||
| } |
| _, renameErr := y.request(fullUrl, method, func(req *resty.Request) { | ||
| req.SetContext(context.Background()).SetQueryParams(queryParam) | ||
| }, nil, &RenameResp{}, isFamily) | ||
| if renameErr != nil { | ||
| utils.Log.Warnf("跟随重命名 torrent 文件失败: %v", renameErr) | ||
| } |
feat(driver): extend 189pc generate_torrent to Copy/Move/Rename/FastUpload/RapidUploadFromTorrent
Summary / 摘要
扩展
drivers/189pc的generate_torrent功能,使其不再仅在StreamUpload时生成种子文件,而是覆盖以下场景:.cas.torrent文件.cas.torrent,存在则跟随复制到目标目录.cas.torrent,存在则跟随移动到目标目录.cas.torrent,存在则跟随重命名为新名.cas.torrent设计原则
.cas.torrent.cas.torrent.cas.torrent.cas.torrent文件GenerateTorrent配置项控制,未开启时无任何额外开销变更文件
drivers/189pc/driver.go:在Move、Rename、Copy方法中添加 torrent 跟随逻辑调用drivers/189pc/utils.go:在FastUpload中补齐 SHA-1 piece hash 计算并异步生成 torrentdrivers/189pc/torrent.go:新增torrentFollowCopy、torrentFollowMove、torrentFollowRename函数;RapidUploadFromTorrent秒传成功后异步上传 torrent 文件This PR has breaking changes.
/ 此 PR 包含破坏性变更。
This PR changes public API, config, storage format, or migration behavior.
/ 此 PR 修改了公开 API、配置、存储格式或迁移行为。
This PR requires corresponding changes in related repositories.
/ 此 PR 需要关联仓库同步修改。
Related repository PRs / 关联仓库 PR:
Related Issues / 关联 Issue
N/A
Testing / 测试
go test ./....cas.torrent的文件,验证 torrent 被跟随复制.cas.torrent的文件,验证 torrent 被跟随移动.cas.torrent的文件,验证 torrent 被跟随重命名GenerateTorrent配置项,验证以上操作均无额外行为Checklist / 检查清单
/ 我已阅读 CONTRIBUTING。
/ 我确认此贡献符合仓库许可证、贡献规范和行为准则。
gofmt,go fmt, orprettierwhere applicable./ 我已按适用情况使用
gofmt、go fmt或prettier格式化变更代码。/ 我已在适用情况下请求相关维护者或代码所有者审查。
AI Disclosure / AI 使用声明
/ 此 PR 包含 AI 辅助内容。
Tools used / 使用工具:
Usage scope / 使用范围:
Code generation / 代码生成
Refactoring / 重构
Documentation / 文档
Tests / 测试
Translation / 翻译
Review assistance / 审查辅助
I have reviewed and validated all AI-assisted content included in this PR.
/ 我已审核并验证此 PR 中的所有 AI 辅助内容。
I have ensured that all AI-assisted commits include
Co-Authored-Byattribution./ 我已确保所有 AI 辅助提交都包含
Co-Authored-By归属信息。I can reproduce all AI-assisted content included in this PR without any AI tools.
/ 我可以在没有任何 AI 工具的情况下重现此 PR 中包含的所有 AI 辅助内容。