新闻详情

新闻详情

首页 / 资讯中心 / 详情

hg-git插件开发与测试完全指南:Mercurial标准.t测试套件实战

发布时间:2026/9/9 15:48:19来源:尧图网络
hg-git插件开发与测试完全指南:Mercurial标准.t测试套件实战
hg-git插件开发与测试完全指南Mercurial标准.t测试套件实战【免费下载链接】hg-gitmercurial to git bridge, pushed to directly from the hg-git plugin in Hg项目地址: https://gitcode.com/gh_mirrors/hg/hg-githg-git 是一款让 Mercurial 与 Git 仓库无缝互通的桥接插件它让 Hg 用户可以直接向 Git 服务器推送、拉取代码且转换过程无损。本文带你实战 hg-git 的插件开发与测试看懂它的 Mercurial 标准.t测试套件如何组织、运行与扩展并掌握从run-tests.py到testutil的完整测试工作流。一、为什么 hg-git 的测试值得学hg-git 的核心设计是无损双向同步所有数据以 Hg 原生格式存储Git 目录只是一份可重建的缓存详见 DESIGN.txt。这种翻译层最容易在边缘场景出 bug——标签、分支、书签、子模块、编码……所以项目用30 个.t测试脚本覆盖了几乎所有同步路径。这些测试采用的是Mercurial 官方标准的测试格式TAP 风格的 shell 脚本学会它等于同时学会了给 Mercurial 核心及任何扩展写测试的方法。二、测试目录结构速览打开tests/目录每个文件各司其职文件/目录作用tests/run-tests.py测试运行器驱动、比对、并行、跳过、超时处理tests/testutil公共测试逻辑固定时间的提交函数、依赖检查tests/hghave.py特性探测判断环境是否有 git、dulwich 等依赖tests/heredoctest.py执行.t文件中内嵌的 Python 代码块test-*.t如 tests/test-clone.t、tests/test-push.t一个个具体的场景测试脚本测试场景覆盖得很全克隆与拉取tests/test-clone.t、tests/test-pull.t、tests/test-git-clone.t推送与分支tests/test-push.t、tests/test-bookmark-workflow.t合并与冲突tests/test-merge.t、tests/test-conflict-1.t、tests/test-octopus.t标签与编码tests/test-git-tags.t、tests/test-encoding.t边缘场景tests/test-empty-working-tree.t、tests/test-illegal-contents.t、tests/test-subrepos.t三、最快启动方式一键运行测试套件项目根目录的 Makefile 提供了现成的入口只需 3 个目标make tests # 运行全部 .t 测试 make test-clone # 只跑指定测试自动加 test- 前缀如 test-push.t make all-version-tests # 跨多个 Mercurial 版本回归测试其中make test-clone本质是执行cd tests python run-tests.py --with-hgwhich hg test-clone而run-tests.py还有一组高频调试参数在 tests/run-tests.py 的parseargs()中定义参数用途-d/--debug实时输出测试脚本内容逐行排查-i/--interactive输出变化时交互确认用于更新期望输出-j2并行跑 2 个任务加速大套件-r/--retest只重跑上次失败的测试-f/--first首个失败即退出--time输出每个测试的耗时排行 新手建议先用make test-clone跑通单个测试再用-d观察它内部到底执行了什么。四、解剖一个 .t 测试文件以 test-clone.t 为例.t文件的语法极其简洁——缩进 2 空格 $表示要执行的命令缩进 2 空格的裸文本表示期望输出。以 tests/test-clone.t 为例Load commonly used test logic $ . $TESTDIR/testutil $ git init gitrepo Initialized empty Git repository in $TESTTMP/gitrepo/.git/ clone a tag $ hg clone -r alpha gitrepo hgrepo-a | grep -v ^updating importing git objects into hg 1 files updated, 0 files merged, 0 files removed, 0 files unresolved读懂它只需掌握 4 个约定$TESTTMP每个测试都运行在独立临时目录中避免互相污染$TESTDIR测试文件所在目录用来加载公共逻辑注释行就是标题顶格写的文字如clone a tag在 diff 报告里充当段落标题帮你快速定位失败位置$HGPORT等占位符运行器会把真实端口号、临时路径自动替换让期望输出保持稳定。对比 tests/test-push.t 可以看到完整闭环Git 端建库 → Hg 克隆 → Hg 端提交推送 → 回 Git 端用git branch -v验证分支是否如预期出现beta、master分列两边——一端写入、另一端断言就是 hg-git 测试的黄金套路。五、testutil让测试确定性的秘密武器 任何测试最大的敌人是每次输出都不一样。tests/testutil 用三招彻底解决① 固定提交者身份导出GIT_AUTHOR_NAMEtest、GIT_AUTHOR_EMAILtestexample.org两端日志永远一致。② 固定时间戳fn_git_commit和fn_hg_commit两个 shell 函数从2007-01-01 00:00:10开始逐秒递增提交时间——所以你会在所有测试里看到同一天的日期却从不出错。③ 依赖前置检查testutil 顶部会检查dulwich是否可导入、git客户端是否存在缺失时以退出码 80 优雅跳过skipped而不是报一堆莫名其妙的失败。六、hghave优雅跳过不支持环境的测试tests/hghave.py 提供了一组特性探测函数.t文件里可以用条件块按环境裁剪#if git $ git --version #endifhghave.py的checks字典注册了 30 种能力检测git、ssl、symlink、unix-permissions……每个都配了人类可读的描述。这样同一份测试文件能在 Linux、macOS、Windows 上各跑各的子集报告里清楚地告诉你为什么跳过。七、贡献一个新测试4 步走 ✅项目的 CONTRIBUTING 明确了硬性门槛提交补丁前测试套件必须通过。流程如下复制模板找个相近的现有文件比如推送相关就参考 tests/test-push.t改名复制保留开头的$ . $TESTDIR/testutil写场景按$ 命令 期望输出的格式写步骤注意所有提交都用fn_hg_commit/fn_git_commit保证确定性首跑捕获输出先随便填期望输出跑一遍用run-tests.py -i交互式接受实际输出再用--retest只复查该文件自检确认输出里没有残留$TESTTMP外的随机信息端口、路径、时间戳再跑一次全量make tests收尾。八、常见问题清单Q1测试全部显示 skipped 怎么办多半是环境缺dulwich或git客户端。testutil 检查不通过就会以skipped: missing feature退出先装好依赖再谈别的。Q2make tests和我直接跑run-tests.py有什么区别没有本质区别Makefile 只是帮你拼好了--with-hgwhich hg 参数你也可以从 Mercurial 源码树里调用run-tests.pyDESIGN.txt 中有说明以便测试不同的 Hg 版本。Q3输出对不上diff 里全是时间戳检查你是不是绕过了 testutil 的提交函数、直接用了hg commit——没有固定时间戳每次比对必然失败。总结hg-git 的测试体系是小而美的典范run-tests.py管执行、testutil管确定性、hghave管环境、.t文件管场景四者各司其职。无论是给这个 Mercurial-Git 桥接插件提补丁还是为自己的 Hg 扩展写测试这套模式都能直接照搬。跑通make tests看到0 failed的那一刻就是你入门贡献的最佳起点。【免费下载链接】hg-gitmercurial to git bridge, pushed to directly from the hg-git plugin in Hg项目地址: https://gitcode.com/gh_mirrors/hg/hg-git创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

SpringBoot+Vue3+MyBatis社区网格化管理系统实战开发 2026/9/9 15:47:49

SpringBoot+Vue3+MyBatis社区网格化管理系统实战开发

1. 项目概述与场景定位社区网格化管理,这几年从政务口到街道办再到物业公司,已经成了数字化治理的标配。简单说就是把辖区拆成一个个“格子”,每个格子配专人负责,从人口信息登记、事件上报、任务派发到台账归档,全流程…

阅读更多 →
AI Agent架构拆解:大模型+记忆+RAG+工具调用的协同实战 2026/9/9 15:47:49

AI Agent架构拆解:大模型+记忆+RAG+工具调用的协同实战

先抛个结论:AI Agent 从来没有那么玄乎,它本质上就是“大模型 记忆 RAG 工具调用”这四样东西按一定规则组合起来的执行系统。网上教程一抓一大把,但大部分只教你调某个框架的API,很少讲清楚这四块是怎么协同的、为什么非这么拼…

阅读更多 →
用Excel完成公众号全年数据体检:好奇博士545篇爆款复盘 2026/9/9 15:47:49

用Excel完成公众号全年数据体检:好奇博士545篇爆款复盘

去年底我给自己定了一个小目标:把“好奇博士”这个公众号的全年数据完整扒下来做一次体检。这个账号我一直比较关注,理由很简单——在公众号打开率普遍走低的背景下,它还能在2025年发布545篇文章,其中阅读数10万的文章有473篇&…

阅读更多 →
DWG转DXF解析与渲染:CAD图纸显示到业务系统的完整方案 2026/9/9 15:47:49

DWG转DXF解析与渲染:CAD图纸显示到业务系统的完整方案

简介:面向需要在桌面应用中加载并显示CAD图纸的.NET开发者,这份资源用C#实现了一个可直接运行的DWG/DXF文件读取与界面展示示例,适合从零搭建CAD查看器原型的初学者,也适合需要对照模块结构做二次开发的中级工程师。RAR压缩包内共…

阅读更多 →
基于约束差分进化算法的多微电网拓扑优化与Matlab实现 2026/9/9 15:47:49

基于约束差分进化算法的多微电网拓扑优化与Matlab实现

1. 先从实际问题说起:为什么多微电网需要做拓扑设计做电力系统优化的同行应该都有体会,微电网这东西从单台套走向多台套之后,复杂度完全不是一个量级。早年做单个微电网的调度优化,最多是“源-荷-储”协调一下、充放电策略调一调&…

阅读更多 →
ROS2 daemon与Docker daemon:具身智能后台服务排错详解 2026/9/9 15:44:48

ROS2 daemon与Docker daemon:具身智能后台服务排错详解

做具身智能这行,你要是没被daemon这个词折腾过几次,都不好意思说自己调过机器人。我刚从ROS1切到ROS2那阵子,最懵的就是为什么ros2命令动不动就提daemon;后来在Docker里部署感知算法,终端里刷屏的又变成error response…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞