Skip to content

chore: dev → main 双向同步(velotype 笔记/大纲 + db 限定库名修复) - #410

Merged
feigeCode merged 9 commits into
mainfrom
dev
Oct 19, 2026
Merged

feigeCode merged 9 commits into
mainfrom
dev

Conversation

@feigeCode

@feigeCode feigeCode commented Oct 16, 2026 •

Copy link
Copy Markdown
Owner

背景

dev 与 main 双向同步:先把 main 上的内容(v0.20.2 发布线、Windows 清单修复、更新检查反馈、PR #404 SQL 粘性会话、PR #409 终端滚动键)回合并进 dev,再把 dev 带回 main。

dev 侧的合并提交为 65fc28992 Merge branch 'main' into dev,已在 origin/dev 上。

本 PR 从 dev 带入 main 的内容

磁盘下拉恢复说明(b57093c26)

原实现 a9ed96b6b(10 月 10 日)当时落在 feat/issue-313-sql-library 分支;SQL 库整理成 feat/sql-library 走 PR #383 时只 cherry-pick 了 SQL 库提交,磁盘下拉 UI 接线被落下,dev 只剩 checkpoint 半截(WIP 标记 + allow(dead_code))。本提交 cherry-pick 恢复完整实现,仅一处冲突(local_volume.rs 测试 import 块)取完整版,并删除失效的 WIP 注释。

功能:本地地址栏左侧磁盘下拉按钮(仅 Windows)、卷列表带勾号标当前盘、点击跳转、打开时重新枚举、裸盘符 D: 补成 D:\ 的地址栏解析(#375)、i18n 三语言。

验证:cargo test -p sftp_view --lib 118 passed;cargo check -p main --tests、cargo clippy -p sftp_view --all-targets 通过。

已验证(本地)

  • 双向合并用 git merge-tree 预演、实际合并均零冲突;合并后 dev / main 两侧 tree 完全相同(69da5532c97cde8d6f830ee7ccbe3c820eb90c61)。
  • 两侧唯一共同改动的两个文件(main/locales/main.yml、main/src/setting_tab.rs)逐行核对:dev 侧新增 13 行、main 侧新增 113 行全部保留在合并结果中(无静默丢弃)。
  • cargo metadata --format-version 1 --locked --offline 退出码 0,Cargo.toml / Cargo.lock 一致(本次合并两侧均未改动这两个文件)。
  • main/locales/main.yml 无重复 key。
  • b57093c26 在 dev 上 cargo test -p sftp_view --lib 118 passed。

未验证 / 风险

  • 其余内容本地未跑编译与测试:各 worktree 的 target/ 为空,属整树冷编译,故依赖本 PR 触发的 ci.yml(CI gate)把关。
  • navop-extensions 子模块指针本次随 main 侧推进(f3eb88d12 → fba18c4d1),本地工作区未初始化该子模块(主 workspace 不依赖它)。

feigeCode and others added 9 commits October 14, 2026 16:19
查询结果的编辑网格里表名来自 SQL 分析,是 `库.表` 的拼接形式
(`direct_table_identity`)。生成保存 SQL 时又拼了一次当前连接的库名,
会得到 `user_center`.`user_center.uc_user_info`,MySQL 报 42S02/1146
「Table 'user_center.user_center.uc_user_info' doesn't exist」。

- db: 新增 `qualified_table_parts` / `quote_each_identifier`,以及
  `quote_qualified_table_name`、`format_resolved_table_reference`
  (限定名逐段引用后直接使用,裸表名行为不变)、
  `resolve_metadata_table_identity`(默认把前缀当 schema);保存变更
  与 SQLite rowid 子查询改用新方法
- db/mysql: 覆盖 `resolve_metadata_table_identity`,前缀当 database
- db_view: 列/索引元数据查询先解析表身份,主键与索引信息不再丢失

验证:cargo test -p db --lib(1349 passed)、
cargo test -p db --test qualified_table_save_repro(3 passed)、
cargo check -p db_view。未跑真实数据库端到端。
从 velotype 上游 a61c719 迁移四项改动,适配 navop 的 host 渲染/WASM 分枝:

- #119 双击选词:`on_mouse_down` 按 click_count 命中 Unicode 词边界。
- #125 IME 崩溃修复:新增 `text_offsets` 模块统一 UTF-8/UTF-16 边界换算,
  runtime/inline/code/input 各处的偏移裁剪改用字符边界安全实现。
- #125 div 块渲染:解析容器内 Markdown 图片与行内片段,`div` 子的连续
  链接徽章合并为一行居中换行布局。
- #121 字体栈:新增 `fonts` 模块(FontCatalog/FontPreferences/FontSettings),
  代码相关渲染路径与表格列宽测量改用可配置 code font;host 可通过
  `set_font_stacks` 注入字体栈。
- #116 大纲导航:新增 `Editor::reveal_outline_heading`,按序列化源码行定位并
  滚动到对应块(velotype 的侧栏 UI 属于其 app workspace,navop 未包含)。

cargo test -p markdown-editor:551 + 7 + 1 全通过。
字体(承接 velotype #121):
- core/settings 新增 markdown_code_font_family(默认等宽字体)并纳入 normalize
- notes::init 从 AppSettings 构造 FontPreferences 调 set_font_stacks,
  并 observe_global::<AppSettings>,设置面板改字体后立即生效
- settings.rs 的 set_font_stacks 每次调用重建字体目录,兼容运行期导入的自定义字体
- 设置页新增「Markdown 代码字体」下拉项

大纲(承接 velotype #116):
- markdown-editor 新增 outline::outline_entries(感知围栏的 ATX 标题解析)
- notes 新增右侧可折叠大纲面板,点击调用 Editor::reveal_outline_heading 跳转
- 工具栏加切换按钮,并绑定 view.toggle_outline(Cmd/Ctrl+Shift+O)
恢复 a9ed96b6b 被遗落在 feat/issue-313-sql-library 分支的完整实现:
SQL 库整理成 feat/sql-library 走 PR #383 时只挑了 b801a46,
磁盘下拉 UI 接线被丢下,dev 只剩 checkpoint 半截(WIP 标记 + allow(dead_code))。

cherry-pick 仅一处冲突(local_volume.rs 测试 import 块),取完整版;
另删掉 lib.rs / local_volume.rs 里已失效的 WIP 注释与 allow(dead_code)。

验证:cargo test -p sftp_view --lib 118 passed;cargo check -p main --tests、
cargo clippy -p sftp_view --all-targets 均通过
树行元素 id 用渲染索引(redis-node-{ix}),切库时 flat_entries 重组,
同索引指向不同节点子树,gpui-fast 布局保留机制跨帧复用错乱,
新文本测量丢失后 TextLayout::prepaint panic(release 直接 abort 进程)。
改用 node_id 作稳定身份,一行修复。

附真实 redis-server 集成回归测试(127.0.0.1:16379,无服务自动跳过):
- switching_to_an_empty_database_does_not_hang_or_crash
- manager 测试基建 empty_db_switch_test_support
- wait_until 轮询解耦真实 tokio IO 与测试调度器时序
#414:集群模式此前只连单个端点,SCAN/TYPE/DEL 只命中所连节点。
- RedisConnectionConfig 新增 cluster_nodes(config_from_stored 透传表单节点列表)
- CLUSTER SLOTS 发现全部 master,SCAN 逐 master 扫描聚合去重
- TYPE 逐键发送,MOVED 错误解析目标节点建连重试(pipeline 遇 MOVED 整批失败)
- DEL / db 键计数同样跨 master 汇总
- 集成测试:本机 3 master 集群(127.0.0.1:7001-7003)聚合验证,无集群自动跳过

#416:zset 徽章 Z 渲染 panic 与空库切换崩溃同根因(树行 id 用索引致
gpui-fast 布局保留错乱),已被上一提交的 node_id 修复覆盖。
回归测试改为 db2 放 2 个 zset 键,覆盖「类型异步补齐 → 徽章出现」时序,
并反证确认:回退索引 id 立即复现 panic。
Redis 表单暴露了 use_tls 复选项,to_url() 也会拼出 rediss://,但 redis_client 只启用了
tokio-comp / cluster-async / connection-manager,没有任何 TLS feature。redis-rs 0.27 在
URL 解析阶段(src/connection.rs)就返回 InvalidClientConfig("can't connect with TLS, the
feature is not enabled"),尚未发起任何网络请求,与服务器、证书、网络均无关。

改为启用 tokio-rustls-comp(隐含 tokio-comp + tls-rustls + tokio-rustls),这是异步 TLS
握手真正门控的 feature。刻意不启用 tls-rustls-webpki-roots:redis-rs 的
create_rustls_config 把系统根证书加载门控在 not(feature = "tls-rustls-webpki-roots") 上,
一旦启用,用户自装进系统钥匙串的私有 CA 会全部失效;保留 native-certs 才能同时信任公共
CA 与私有 CA。

新增回归测试 tls_config_builds_rediss_url_supported_by_client:先用 Client::open 复现该
报错,再断言 feature 开启后 rediss URL 能被正常解析。
@feigeCode
feigeCode merged commit 3c2b359 into main Oct 19, 2026
8 checks passed
feigeCode added a commit that referenced this pull request Oct 19, 2026
症状:连接后打开数据库,点刷新按钮必崩(Windows 11,v0.20.3 及之前)。

根因:树行右侧的加载中 spinner/错误图标是条件插入的无 id 子元素,
它们的出现与否改变后续兄弟元素的位置序号;gpui-fast 的布局 key
按路径+位置序号派生,序号漂移让计数/徽章文本的 key 在帧间变化,
测量保留缓存对不上号,prepaint 拿到未测量布局 panic
(measurement has not been performed),release panic=abort 整进程退出。

修复:给行内动态文本容器(类型徽章/名称/键计数)加稳定 id,
不随兄弟条件插入漂移。与 #410 的行级 node_id 修复同族——
那次修的是行 id,这次修的是行内元素 id。

回归测试:refreshing_a_loaded_database_does_not_crash(db4 种子键,
走 toolbar 刷新完整路径);空库切换用例改为 db 分离不再互踩。
@feigeCode feigeCode mentioned this pull request Oct 28, 2026
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.

1 participant