资讯动态

MooTool Next Compose 的 Git 同步语义:`fetch --prune` 与 behind 状态的 Electron 对齐实现

发布时间:2026/10/16 6:02:56 来源:尧图企业网站定制
桌面应用开发工具【免费下载链接】MooToolHandy tool set for developers项目地址https://gitcode.com/gh_mirrors/mo/MooTool点击查看免费下载本文以 MooTool Next Compose 的 DIFF-474 切片为线索讲解 Vault Git 面板中fetch动作如何通过git fetch --prune origin在不触碰工作区的前提下更新behind计数以及该行为在桌面端Electron 与 Compose之间如何通过集成单测实现逐条对齐。读完你可以掌握 Git 面板拉取远程前同步语义的底层实现、测试构造方法与验证命令。一、背景为什么需要 DIFF-474在 MooTool Next 桌面产品线中Vault Git 面板提供init、fetch、pull、push、commit、discard、冲突解决与 merge/rebase 中止等一套完整的仓库管理能力。作为行为基准的 Electron 端VaultGitService早已支持fetch其动作对应原生 Git 命令git fetch --prune origin。而 ComposeKotlin Multiplatform / Desktop一侧GitEngine.fetch已经在 Vault Git 面板的拉取远程按钮前承担 fetch 职责但当时存在一个覆盖缺口当远程仓库领先于本地remote ahead时缺少关于behind计数、且 fetch 不自动 merge 工作区的集成单测。也就是说实现存在但行为没有被测试锁定后续演进时容易出现语义漂移。DIFF-474 正是为补齐这一缺口而引入的切片。补充说明--prune的作用是清理远端已删除分支在本地的origin/*tracking ref。DIFF-474 聚焦behind 计数与工作区不被自动合并这一面prune 与分叉状态分别在后续切片 DIFF-478 与 DIFF-479 中单独锁定三份文档共同构成fetch语义的完整测试矩阵。二、变更内容两条新增集成单测本次切片在GitEngineTest中新增两条测试1.fetchUpdatesBehindWithoutPullingWorkingTreebehind 计数且不合并工作区该测试用双 clone 上游 push 第二笔提交构造 remote 领先场景完整验证了三条关键断言client 在fetch前执行GitEngine.statusbehind必须为 0tracking ref 尚未同步属于过期状态client 执行GitEngine.fetch后再次status得到behind 1同时v2.txt仍不存在——证明 fetch 只更新了远端跟踪信息没有把远程提交合并进工作区最后执行GitEngine.pullv2.txt落盘证明 fetch 与 pull 职责分离fetch 只取对象与更新 tracking refpull 才真正合并。实现位于 GitEngineTest.kt测试用临时裸仓库git init --bare 本地文件协议 URLbare.toAbsolutePath().toUri().toString()构造三端拓扑bare作为远端枢纽upstream负责推送新提交client作为被测工作区。2.fetchFailsWhenRemoteIsNotConfigured无 remote 时的失败语义该测试在未配置 origin 的仓库上直接调用GitEngine.fetch断言返回success false且错误消息包含remote。实现位于 GitEngineTest.kt。这一条锁定了 fetch 的前置条件必须在配置 origin 远程后才允许 fetch与 UI 层未配置 remote 时 fetch 按钮禁用的展示逻辑形成一致约束。三、底层原理GitEngine.fetch与status的 ahead/behind 解析GitEngine是 Compose 桌面端的 Git 命令执行引擎所有命令统一经由run调度并受仓库级锁locked保护。fetch的实现非常简洁核心是requireRemote守卫 一条原生命令fun fetch(root: Path, isolateConfig: Boolean false, token: String ): GitActionResult locked(root) { requireRemote(root, isolateConfig) { run(listOf(fetch, --prune, origin), root, isolateConfig, token, REMOTE_TIMEOUT_MS) } }代码位于 GitEngine.kt。其中requireRemote先执行status检查repository与remote未初始化仓库返回Git repository is not initialized未配置 origin 返回No origin remote is configured随后才真正执行git fetch --prune origin。远程类命令使用独立的REMOTE_TIMEOUT_MS 120_000L超时区别于本地命令的TIMEOUT_MS 30_000L。behind计数并不在 fetch 内部计算而是由status从git status --porcelainv1 -z --branch --untracked-filesall的输出中解析behind Regex(behind (\\d)).find(parsed.branchLine)?.groupValues?.get(1)?.toIntOrNull() ?: 0,代码位于 GitEngine.kt。也就是说fetch 先更新origin/main等 tracking ref随后status在## main...origin/main [ahead X, behind Y]这一 branch 行里解析出同步计数。测试中fetch 前 behind0、fetch 后 behind1的差异本质就是status --branch依据 tracking ref 新旧状态的输出变化——这正是 Git 中本地落后于远程但尚未 fetch时的典型行为。GitStatus数据类完整承载这一信息GitEngine.kt 中定义ahead、behind、branch、remote、changes、conflicts、merging、operation等字段UI 层与测试均依赖它做断言。四、与 Electron 基准的逐条对齐DIFF-474 是 MooTool 的Electron → Compose 行为对齐parity工程的一部分。对照基准位于 Electron 的 vaultGitService.ts其fetch动作定义为case fetch: return this.result([fetch, --prune, origin], true)而status同样从 branch 行解析计数const ahead Number(/ahead (\d)/.exec(branchLine)?.[1] ?? 0) const behind Number(/behind (\d)/.exec(branchLine)?.[1] ?? 0)两端的命令参数与解析正则完全一致Compose 端的差异主要体现在工程形态Kotlin 的GitEngine为同步对象式封装、带仓库级互斥锁与可选的配置隔离isolateConfigElectron 端则以enqueueRepositoryOperation队列串行化仓库操作、支持 credential/token 注入。DIFF-474 新增的两条测试正是为了把这些行为差异压缩到测试层确保两条产品线的 Git 面板在fetch 只同步、不合并这一语义上保持一致。这一对齐关系已被登记进 electron-next-vaultGitService-vitest.md其中fetch-prune-behind一行将 Electron 的fetchaction 映射到GitEngineTest.fetchUpdatesBehindWithoutPullingWorkingTree与fetchFailsWhenRemoteIsNotConfigured两条 Compose 测试形成可追溯的对照登记表。五、UI 接线fetch 按钮的可用性规则GitEngine.fetch之上Vault Git 面板顶栏的 fetch 按钮由GitVaultRemotePresentation.fetchActionEnabled控制见 GitVaultRemotePresentation.ktfun fetchActionEnabled(persistedRemote: String, busy: Boolean): Boolean !busy fetchEnabled(persistedRemote)即只要已持久化 remote 且面板不处于 busy 状态fetch 即可用。与 pull/push 不同fetch 在 merge/rebase 进行中甚至存在未解决冲突时依然可用注释明确对齐 Electron冲突/merge 期间仍可用这是它的安全特性——fetch 不动工作区因此可以在任何状态执行以观察远端进展。按钮接线位于 VaultGitDialog.kt点击后调用GitEngine.fetch(root, token token())。与之对比pullActionEnabled与pushActionEnabled会额外要求conflicts 0且非merging——这正是 DIFF-474 强调fetch 不自动 merge 工作区的 UI 侧体现只有 fetch 能安全地在任何工作区状态下探测远端状态。六、验证方法本切片为集成单测验证命令与 MooTool Next Compose 其余桌面测试一致JDK 21 Gradle 离线模式export JAVA_HOME$(/usr/libexec/java_home -v 21) ./gradlew :composeApp:desktopTest --offline测试通过assumeGit()跳过无 Git 环境的机器并在finally中清理所有临时仓库。从仓库验收记录acceptance.md看Vault Git 相关测试随:composeApp:desktopTest全量执行产品证据校验脚本verify-product-evidence-prep.sh同步把关。七、与前后的切片关系DIFF-474 属于 MooTool 桌面 Git 行为对齐的系列切片之一理解它需要串联整体脉络DIFF-478在 DIFF-474 基础上补充--prune对已删除远端分支的 tracking ref 清理断言fetchPruneRemovesStaleRemoteTrackingBranchDIFF-479补充本地与远端各自有新提交分叉时fetch后ahead 1且behind 1的断言fetchReportsAheadAndBehindWhenBranchesDivergeDIFF-619从产品证据流角度确认 merge/rebase 冲突期 fetch 仍可用pull 则禁用。三者与 DIFF-474 共同回答了Vault 仓库同步状态从何而来、何时刷新、何种状态可用这三个核心问题fetch 是唯一在工作区任意状态下安全的远程探测动作behind 计数在 fetch 后才会反映远程真实进度实际合并始终交由 pull 完成。赞分享桌面应用开发工具【免费下载链接】MooToolHandy tool set for developers项目地址https://gitcode.com/gh_mirrors/mo/MooTool点击查看免费下载相关推荐MooTool Next Compose 的 Vault Git 面板对齐GitOperationPresentation 状态机与 pull 语义修正实践MooTool Next Compose 的 Vault Git 面板对齐GitOperationPresentation 状态机与 pull 语义修正实践桌面应用开发工具MooTool Next Compose 的 Git Remote URL 安全校验从 Electron 对齐到 Compose 实现解析MooTool Next Compose 的 Git Remote URL 安全校验从 Electron 对齐到 Compose 实现解析 导读 本文以仓库内桌面应用开发工具MooTool Next Compose 的 Vault Git 远程输入框同步规则syncRemoteField 实现解析与 Electron 一致性对齐MooTool Next Compose 的 Vault Git 远程输入框同步规则 syncRemoteField 实现解析与 Electron 一致性对齐桌面应用开发工具上一篇web-clone WebGL / Canvas 逆向拆解如何读懂 shader、物理与渲染架构下一篇mirrord 架构全解Agent、Layer、CLI 与 IDE 插件如何协作实现 Pod 级本地开发创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑