Skip to content

feat(git): tag management with restore for deleted tags and branches(rebuild 354) - #399

Open
Wz58luck wants to merge 7 commits into
1lck:previewfrom
Wz58luck:codex/pr-354-clean
Open

feat(git): tag management with restore for deleted tags and branches(rebuild 354)#399
Wz58luck wants to merge 7 commits into
1lck:previewfrom
Wz58luck:codex/pr-354-clean

Conversation

@Wz58luck

@Wz58luck Wz58luck commented Sep 2, 2026

Copy link
Copy Markdown
Contributor

Closes #342

实现内容

共享命令(rust/lithe-core)

  • git.write 新增 createTag / deleteTag
    • createTagname + revision + 可选 message;非空 message 创建附注标签(git tag -a),否则轻量标签。创建前探测重名(A tag named '<name>' already exists)与目标可解析性(Could not resolve tag target '<rev>'),返回稳定 invalid_request 错误而非解析本地化 stderr。
    • deleteTag:删除前用 git cat-file 采集标签类型与原始 annotation(换行保真,剔除签名块),rev-parse <ref>{} 取剥离后的目标提交;成功响应携带结构化 tagDeletionname / deletedTarget / kind / message)。
  • deleteBranch 删除前解析分支指向的提交,成功后返回结构化 branchDeletionname / deletedTarget),供宿主提供"还原"入口;分支不存在时返回稳定错误 The branch '<name>' does not exist
  • 契约文档 rust-core-api.mdshared/fixtures/git/write.json 已同步更新,供第二个平台后续消费。

macOS

  • Git Log 提交行右键新增 "New Tag…":名称 + 可选 Message 对话框,本地校验行内即时提示(不发起请求),重名等服务端错误同样在对话框内展示、不关闭。
  • 引用列表 Tags 分组右键新增 "Delete Tag…":destructive 确认框,写明标签名与对协作者的影响。
  • 删除标签/分支成功后,Git Log 顶部显示 "Deleted tag/branch 'x' [Restore] [×]" 横幅(对齐 IDEA "已删除的分支 [还原]" 体验):还原用记录的目标提交重建,失败(如同名已被重建)保留记录可重试;关闭横幅或关闭项目后清除会话记录,不做跨会话持久化。
  • 还原不保留原 tagger/时间戳;删除分支使用 git branch -d(安全删除),不会出现未合并提交被舍弃的场景。

验证

076bc46ec936dc164dd394ef2422f7c9 0044f33e-2d1f-45bc-b90e-6307ef804eaf image ad8a90c1-6bab-499f-b262-aaeccddb4ecd 969c2404-dba1-4006-91be-fa6e6e38a494

@Wz58luck
Wz58luck requested a review from 1lck as a code owner September 2, 2026 02:30
@Wz58luck

Wz58luck commented Sep 2, 2026

Copy link
Copy Markdown
Contributor Author

稍等,我再测试下

@1lck

1lck commented Sep 2, 2026

Copy link
Copy Markdown
Owner

行 需要review @我就行

@1lck 1lck left a comment

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

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

Review

对照 #342:Core createTag/deleteTag、macOS New Tag / Delete Tag + 确认、删除可还原主路径整体对齐需求,架构也符合 lithe-core 沉淀 + 平台接入。

其余项(createBranch 用 fullName==shortName 旁路、契约总表漏写字段、Windows 后接、prepare 脚本等)不阻塞合并,可 follow-up。

合并前需修 1 项(见 inline):删除失败时不应清掉上一次成功的 restore 会话记录。该行为与「删除后可 Restore」目标冲突,且当前测试把错误语义锁死了。

: trimmedMessage(result)
)
} else {
recentlyDeletedBranch = nil

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

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

Blocking: 删除失败时不应 clear 上一次成功的 restore 记录。

当前逻辑:

} else {
    recentlyDeletedBranch = nil  // 失败也清掉
    ...
}

问题

成功删除 feature/a 后 banner 可 Restore;随后对 feature/b 删除失败(不存在 / 未合并等)会把 recentlyDeletedBranch 置 nil,A 的还原入口消失。失败与既有成功记录无关,却撤销了本 PR 的 session restore。

deleteTag(同文件下方 else { recentlyDeletedTag = nil })同样问题。

复现(分支)

  1. Git Log 删除已合并分支 feature/a,出现 Restore banner
  2. 再删除不存在或未合并的 feature/b 并失败
  3. A 的 banner/Restore 被清掉

期望

仅在本次删除成功并拿到 branchDeletion / tagDeletion 时替换记录;失败只 notify,保留既有记录。

建议

if result.succeeded, let deletion = result.branchDeletion {
    recentlyDeletedBranch = deletion
    notify?(successfulMessage(result, fallback: "Deleted branch \(deletion.name)"))
} else {
    // 不要 clear recentlyDeletedBranch
    notify?(trimmedMessage(result))
}

同步修改测试 gitBranchDeletionFailureClearsThePreviousRecoveryRecord:失败后应仍保留 feature/a;标签加对等用例。

upstreamShortName: nil
))

#expect(feature.recentlyDeletedBranch == nil)

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

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

Blocking(配套): 本测试当前断言失败删除会清掉上一次记录(recentlyDeletedBranch == nil),把错误语义锁死了。

修复 feature model 后应改为:第二次删除失败后 recentlyDeletedBranch?.name == "feature/a" 仍成立,并建议给 deleteTag 加对等回归测试。

测试名也可改为 gitBranchDeletionFailureKeepsThePreviousRecoveryRecord

@Wz58luck
Wz58luck requested a review from 1lck September 2, 2026 08:16
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.

2 participants