Skip to content

chore: dev → main(快捷打开重复建会话修复、个人同步两处修复) - #463

Merged
feigeCode merged 5 commits into
mainfrom
dev
Oct 25, 2026
Merged

feigeCode merged 5 commits into
mainfrom
dev

Conversation

@feigeCode

@feigeCode feigeCode commented Oct 25, 2026 •

Copy link
Copy Markdown
Owner

内容

dev 当前领先 main 4 个提交 + 1 条 changelog 记录,均为修复:

1. 连接快速打开点一次不再新建两个会话(58bfe0b04,closes #461)

  • 标签栏「+」打开的「打开连接」对话框里,选中一行点击后一次点击会新建两个 SSH 会话(已有 2 个标签时点一次变 4 个)。
  • 根因是同一行上有两条打开路径:行内 ListItem 自己挂了 on_click,而 gpui-component 的 List 在 render_list_item 里给外层行容器注册了内建点击处理(set_selected_index → on_action_confirm → delegate.confirm),confirm 里又打开一次。gpui 的鼠标事件在 bubble 阶段按注册逆序逐个触发命中的 listener,只有 stop_propagation() 才中断,window.close_dialog 又只改 Root 状态、不重建当次 dispatch 的 listener 表,于是两条路径都会跑到。
  • 修法:删掉行内的打开回调,点击与键盘回车统一只走 confirm;补源码级回归测试锁住「行渲染不得直接打开连接」。行内「保存为连接」按钮原有的 stop_propagation() 不变。

2. 个人 git 同步冲突点「应用」无反应且永远解不开(14afa9ee4,closes #457)

  • 五个叠加根因:解决结果无窗口反馈;多条冲突第一条失败即全断;resolver 用的是检测时刻的快照版本做乐观锁,对端再推新版本后必然 stale version;git pull --rebase 冲突后不 abort,仓库永久停在 unmerged;冲突挂起时 worker 跳过 flush,.onetcli-sync 残留脏改动让后续 pull 直接被 git 拒绝。
  • 修法:解决完成在当前窗口推三态通知(三语 i18n);逐条解决、单条失败不中断并汇总;按 record_id 现场重读远端版本做乐观锁;GitRunner 增加 stash / stash_pop / rebase_abort / reset 自愈原语并在 pull / push 前后自愈。
  • 测试:git_store 7(含 4 个新自愈用例)、conflict_resolver 8(含实时版本回归用例)、main personal_sync 27 全过。

3. 个人同步导出归一化凭据引用,消除跨设备假冲突(6d114bec2)

  • 导出连接载荷时只补了 credential_cloud_id,源设备本地整数 credential_id 仍留在载荷里;各设备行号不同,导致同一条逻辑连接跨设备的明文 checksum 永不相等,planner 判定「双方都改过」,引用钥匙串凭据的连接反复假冲突。
  • 修法:有 cloud_id 的分支同样把整数 ID 置零,载荷跨设备完全归一;下载侧 resolve_object_credential_reference 本来就按 cloud_id 反查本机行号,行为不变。新增回归测试:同一 cloud_id 绑定不同本地行号的两台设备导出的 checksum 与解密明文必须一致。

4. CHANGELOG 补 [Unreleased] 双语条目(15e41c0f7)

  • 给上面第 1、3 条修复各补一条中英双语的用户可见说明,落在 ## [Unreleased] 段;未新增任何已发布版本号。

验证

  • 定向验证见上(cargo test -p main quick_open 5 passed;个人同步相关用例全绿)。
  • 本 PR 会跑完整 CI 矩阵(linux/macos cargo test --all + Windows 脚本)。

说明

  • 普通 dev → main 合并,不含版本号 bump;发版时按 .github/RELEASE.md 另开 release PR。
  • CHANGELOG.md 的改动仅限 ## [Unreleased] 段落,不触碰已发布版本条目,script/changelog.py 的按 tag 抽取不受影响。

feigeCode and others added 5 commits October 23, 2026 17:07
五个叠加的根因:

1. 无反馈:resolve_personal_conflict(s) 成败只写全局 status,无窗口
   通知;对话框点击后立即关闭,用户以为按钮坏了。
2. 一坏全断:多条冲突循环第一条 .await? 失败即中断,其余冲突原样
   挂起。
3. 快照版本过期:resolver 用检测时刻的 remote.version 做乐观锁,
   对端再推新版本后 upsert 必报 "stale version",冲突永远解不开。
4. rebase 冲突卡死:git pull --rebase 冲突后无 abort,仓库永久停在
   unmerged 态,之后所有 git 命令报错。
5. 脏工作区瘫痪(最常见):冲突挂起时 worker 提前 Err 跳过 flush,
   .onetcli-sync 未提交改动残留;下轮 pull --rebase 被 git 拒绝
   ("cannot pull with rebase: uncommitted changes"),classify 不匹配
   关键词落 Io,同步彻底瘫痪。

修复:

- F1 反馈:解决完成后在当前窗口推通知(成功/失败/部分成功三态文案,
  三语 i18n)。
- F2 健壮:逐条解决,单条失败不中断,失败数与原因进通知。
- F3 版本:resolver 按 record_id 现场重读远端当前版本做乐观锁,找不到
  才回退快照版本。
- F4 git 自愈:GitRunner 新增 stash/stash_pop/rebase_abort/reset 四个
  自愈原语;pull 遇 rebase 冲突先 abort 再重试一次,遇脏工作区拒绝先
  stash/恢复(stash 失败则 reset .onetcli-sync,本地库是源头会重传);
  push 被拒时先拉取自愈再重推一次;仍失败则如实报 GitMergeConflict。

测试:git_store 7(含 4 个新自愈用例)、conflict_resolver 8(新增
实时版本回归用例)、main personal_sync 27 全过;-D warnings 编译干净。
连接载荷导出时 enrich_credential_references 只插入
credential_cloud_id,源设备的本地整数 credential_id 仍留在载荷里。
每台设备的凭据行号各不相同,同一条逻辑连接跨设备的明文
checksum 因此永不相等,planner 判定「双方都改过」,引用了
钥匙串凭据的连接在多设备间反复假冲突、来回覆盖。

现在有 cloud_id 的分支同样把整数 ID 置零,载荷跨设备完全
归一;下载侧 resolve_object_credential_reference 原本就按
cloud_id 反查本机行号,行为不变。

新增回归测试:同一凭据 cloud_id 绑定不同本地行号的两台设备
导出的 checksum 与解密明文必须一致。
连接快速打开对话框的列表行自己挂了 on_click 打开连接,而 List 内建的
行点击处理也会走 set_selected_index → confirm,confirm 里同样打开一次。
一次鼠标点击先后触发这两条路径,于是同一台服务器被连开两个 SSH 会话
(已有 2 个标签时点「+」新建,直接变成 4 个)。

现在删掉行内的打开回调(以及只被它使用的绑定),点击和键盘回车统一只走
confirm;同时补一条源码级回归测试,锁住「行渲染不得直接打开连接」。
…ession

fix(home): 连接快速打开点一次不再新建两个会话(#461)
双语各补一条:#461 修复后点击与回车只走 confirm 单一路径,一次点击不再建两个 SSH 会话。
@feigeCode
feigeCode merged commit 9df4ebc into main Oct 25, 2026
8 checks passed
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.

[Bug]: ssh会话重复新建 [Feature]: 同步功能很不好用

1 participant