Skip to content

fix(windows): 修复翻译缺失、AI 沙箱、ZIP 导出等 8 个 Windows 专属 bug - #1

Merged
Sam-Fic merged 10 commits into
mainfrom
fix/windows-portable-compat
Nov 10, 2026
Merged

Sam-Fic merged 10 commits into
mainfrom
fix/windows-portable-compat

Conversation

@Sam-Fic

@Sam-Fic Sam-Fic commented Nov 9, 2026

Copy link
Copy Markdown
Owner

背景

项目在 Linux 上开发, 现转 Windows 使用。对 v4.9.1 Windows 便携包做了完整检查:

  • ✅ CI 全绿 (编译 + 11 单元测试 + lint), ZIP SHA256 校验通过
  • ✅ CLI 冒烟: --help / 导出 / 项目存取 / 中文文件名全部正常
  • ✅ GUI 冒烟: 渲染正常, 配置落 %LOCALAPPDATA%\filecollector
  • ❌ 深挖后发现 8 个 Windows 专属 bug, 本 PR 全部修复

修复清单

# 问题 修复
1 Windows 包纯英文界面 (.mo 被 MSYS2 参数路径转换静默丢弃, CI 日志证实) MSYS2_ARG_CONV_EXCL + locale/zip.exe 硬性校验
2 AI 助手所有文件工具报 "Access denied" (沙箱 "/" 字符串手术对反斜杠路径恒不命中) normalize_path/rel_path 归一分隔符
3 ZIP 导出失败 (包内无 zip.exe; compute_relative_path 分隔符 bug) 捆绑 zip.exe + msys-2.0.dll; 改用 GIO 相对路径
4 文件树懒加载失效 / 工作目录内文件误标外部 / 复制路径退化 (6 处) 全部归一分隔符或改用 GIO has_prefix
5 AI list_files 的 ** 模式永不命中 (前导 \ 剥不掉) glob_helper 归一
6 Git 集成漏中文文件名 (core.quotePath 八进制转义) run_git 注入 -c core.quotePath=false
7 cmd/PowerShell 下 CLI 输出不可见 (GUI 子系统不接管控制台) 新增 win32_console_shim (附加父控制台 + UTF-8)
8 --work-dir + 相对路径 --select-file 不符 README 语义 cli.vala 输入路径按 work_dir 兜底解析

验证状态

  • 打包脚本 bash -n 通过
  • MSYS2_ARG_CONV_EXCL 行为本机 Git Bash 原生实验验证 (--prefix=/usr 被转换 → 排除后保持字面)
  • 根因由 v4.9.1 CI 日志证实 (locale 被装入 install-windows/a/_temp/msys64/usr/...)
  • Vala 改动待本 PR CI 编译验证 (本机无 MSYS2 工具链)

检查发现 Windows 便携包存在多个 Linux 上没有的功能缺陷, 全部修复:

- 打包: 加 MSYS2_ARG_CONV_EXCL 排除 --prefix=/usr 的参数路径转换,
  locale 不再被装进错误嵌套路径而静默丢弃 (v4.9.1 及之前的 Windows
  包均为纯英文界面); 硬性校验 filecollector.mo 与捆绑的 zip.exe
  (含 msys-2.0.dll) 存在于 ZIP 内
- ai_controller: normalize_path/rel_path 归一分隔符为 /, 修复 AI 助手
  文件工具在 Windows 上全部误判 "Access denied: path outside work
  directory" (反斜杠路径与 allowed + / 前缀永不匹配)
- zip_exporter: compute_relative_path 改用 GIO get_relative_path,
  修复工作目录内文件全部落入 _external/; 无工作目录时剥盘符冒号,
  修复 dest 指回源文件导致复制自身失败
- window/context_menus: 6 处 has_prefix(wd + "/") 字符串手术归一分隔符,
  修复文件树懒加载失效、工作目录内文件被误标外部文件、复制路径退化
- glob_helper: 归一分隔符, 修复 AI list_files 的 ** 模式永不命中
- git_service: 注入 -c core.quotePath=false, 中文文件名不再被八进制
  转义成 "\346\226\207..." 而被解析端静默漏掉
- 新增 win32_console_shim: GUI 子系统 exe 在 cmd/PowerShell 下附加父
  控制台并切 UTF-8 码页, CLI 输出可见; 管道环境 (Git Bash/CI) 零影响
- cli: --select-file/--load 相对路径在 cwd 找不到时按 --work-dir 兜底
  解析, 与 README 完整工作流示例的文档语义一致
- docs/building/windows.md: 记录 MSYS2 路径转换陷阱与新增卡关
视觉转换 (默认, 保图表/公式/表格) 与可选文本抽取 (离线/免凭据) 双管线:

- Windows 主包捆绑 poppler: pdftoppm (PDF→页图→VLM, 视觉转换链路恢复)
  与 pdftotext (文本抽取模式用), 含 poppler-data CMap (中文 PDF 必需);
  运行时 POPPLER_DATADIR 指向包内 share/poppler
- soffice 探测链: 转换器包约定布局 tools/LibreOffice/program/soffice.exe
  → 官方安装路径 → PATH; 探测失败抛带指引的错误而非裸 warning
- 新增 OfficeTextExtractor: 纯 Vala 最小 ZIP 读取器 (STORED/DEFLATE,
  ZIP64/加密明确报错) + OOXML/ODF 文本抽取; PDF 经 pdftotext,
  抽空 (扫描版) 自动回退视觉/OCR; 抽取分支置于凭据检查之前,
  未配置 AI 的用户在文本模式下也能处理 Office/PDF
- PreprocessCache 条目增加 flow 标记 (vlm/text), 两种模式产物互不命中,
  旧缓存视为 vlm 向后兼容
- ConfigManager.binary_process_mode 设置 + 偏好对话框 "处理方式" 下拉
- 失败原因全链路透出: ItemData.preprocess_error 字段, task_completed
  信号追加 error_message, 队列行/预览占位/重试 tooltip 显示原因
- CI 新增 converter-package job: 官方 LibreOffice MSI 经 msiexec /a
  解包为 tools/LibreOffice/... 布局的独立转换器包, 随 Release 发布
  (msiexec /a 参数经 cmd 复合字符串绕过 MSYS2 路径改写)
- 测试: test_office_text_extractor (内存 ZIP fixture, STORED/DEFLATE/
  排序/实体解码/EOCD 注释/ZIP64/加密/垃圾数据)
- i18n: POTFILES + zh_CN.po 手工补录 (本机无 msgmerge, 重新生成 .pot
  时逐条核对); README/USAGE 双语 + windows.md 转换器包章节
@Sam-Fic
Sam-Fic force-pushed the fix/windows-portable-compat branch from e939f1f to f23991e Compare November 9, 2026 21:19
- ZlibDecompressor 构造参数在 0.56 vapi 中复用 ZlibCompressorFormat
  枚举 (无独立的 ZlibDecompressorFormat 绑定)
- 0.56 vapi 无 GLib.BytesBuilder: inflate 结果与测试 ZIP fixture
  改为分块收集 + Memory.copy 拼接
- 0.56 vapi 的 StringBuilder 属性是 len 而非 length
- Gee.ArrayList<string> 的 foreach 用 owned 变量接收 (0.56 迭代器
  get() 为 owned, unowned 接收报错)
- ZipReader.get 更名 find, 避免遮蔽 GLib.Object.get 的警告
- Converter.convert 0.56 签名带 ConverterFlags 参数
binary_converter 含 Gdk.Pixbuf (图片转换), 被测试闭包拉入后
test_office_text_extractor 因未链 gtk4 编译失败。resolve_bundled_tool
与 new_poppler_launcher 无 GDK 依赖, 移到 Platform; 测试只链
office_text_extractor + platform
zlib 在输入耗尽后需要显式 FLUSH 才输出终止流, 单次 convert 返回
非 FINISHED 导致 error() 直接 abort 测试进程
@Sam-Fic
Sam-Fic merged commit d2b16c6 into main Nov 10, 2026
7 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.

1 participant