CLI数据同步网络【免费下载链接】rsyncAn open source utility that provides fast incremental file transfer. It also has useful features for backup and restore operations among many other use cases.项目地址https://gitcode.com/gh_mirrors/rs/rsync点击查看免费下载testsuite/skiplist/README.md定义了 rsync 项目 Python 测试套件中一套精密的预期跳过expected-skip机制它以RSYNC_EXPECT_SKIPPED环境变量为媒介把哪些测试应当被跳过声明为精确集合由 runtests.py 在完整运行时强制校验防止某个测试悄悄退化为永久 no-op 而不被察觉。本文以该文档为骨架结合 runtests.py 的解析与校验实现、testsuite/skiplist-spec_test.py 的守卫测试以及 testsuite/fleettest.py 的舰队测试逻辑说明这份清单的用途、格式规则、维护规范以及同目录下backport.txt为何是性质完全不同的另一类文件。读完你可以理解并正确维护任意平台的跳过清单并弄清预期跳过与排除不跑两种机制的根本区别。一、为什么需要预期跳过清单防止测试悄悄变成永久 no-opruntests.py在完整运行full run时会把实际跳过的测试集合与预期跳过的测试集合做精确比对二者必须完全相等。这个预言机oracle的价值在于一旦某个测试开始跳过——探测probe回归、辅助程序缺失、环境变化——运行就会失败而不是继续报告全绿。换句话说make check不再容忍任何静默的跳过。实现上集合比对发生在 runtests.py跳过结果按测试原本的执行顺序排序输出随后把got与want转为集合做无序比较任何差异都会把退出码置为 1。这正是文档所述若某测试开始跳过运行即失败的代码级证据。历史上这套预期集合是通过一条横跨七个 CI 工作流步骤的超长逗号分隔行传入的。这意味着任何新增跳过测试的分支都要在同一文件同一行上做修改于是两个同时添加跳过测试的分支必然产生合并冲突。为消除这种冲突清单被拆分为一个测试名一行的文件集中存放于testsuite/skiplist/工作流步骤只做一次引用run: RSYNC_EXPECT_SKIPPEDtestsuite/skiplist/common.txt,testsuite/skiplist/linux.txt make check于是新增一个跳过测试变成修改一行、一个文件两个分支各加各的不同测试可以干净合并——这正是 runtests.py 注释中反复强调的设计动机清单保持一个测试名一行是避免分支冲突的关键。二、清单文件一览按平台与协议分层文件内容common.txt在所有运行预言机的平台上都跳过的测试——主要是require_tcp真实 TCP 传输与require_asanAddressSanitizer 构建类测试默认的 stdio-pipemake check无法满足这些前置条件linux.txt仅 Linux 的追加项macos.txt仅 macOS 的追加项cygwin.txt仅 Cygwin 的追加项proto29.txt针对--protocol29运行的追加项与平台无关proto30.txt针对--protocol30运行的追加项与平台无关各清单以逗号组合结果是并集因此同一测试名出现在多个文件中无害。裸测试名可以与FILE条目混用。common.txt的头部注释testsuite/skiplist/common.txt#L6-L10还特别说明各平台可能因不同原因跳过同一测试清单中记录的原因只是本机报告的那个。分层组合的实际语义一个 Linux 的常规 stdio-pipe 运行使用common.txt linux.txt如开篇的 YAML 所示macOS 运行使用common.txt macos.txt其中macos.txt收录了pseudo-pathsprocfs 伪路径仅 Linux 有、partial-protected-regular-retry-policy确定性 EACCES 恢复依赖 dyld interposing等平台特定项Cygwin 运行使用common.txt cygwin.txt可见大量基于 symlink/ACL/socket 的测试如daemon-stdin-local-socket注明 Cygwin Python has no AF_UNIX socketpaircheck29/check30步骤在平台清单之上追加proto29.txt/proto30.txt。以 proto29.txt 为例这些测试传输的内容超出了协议 29 线格式所能承载的范围ACL、xattr或驱动了只讲 30 协议的辅助程序因此与平台无关地按协议门控——acls-unpinnable # ACL transfer requires protocol 30、scanner-batch-flag-mismatch # xattrs (-X) need protocol 30。有趣的是write-touched-blocks同时出现在两个协议文件中原因是其逻辑块统计需要协议 33在 29 和 30 下都会跳过。三、格式规则与强制校验排序不是装饰清单文件的格式规则非常严格每一行都是一条可验证的约束一个测试名一行#起注释行尾的# reason是记录跳过原因的唯一位置被明确鼓励每个文件必须排序且无重复排序不是装饰——正是有序让两个独立的新增落在不同行上从而可无冲突合并每个名字都必须是真实的裸测试名对应存在testsuite/name_test.py的测试。这些规则的强制力来自 runtests.py 的expand_skip_spec()任何格式问题都通过die()以退出码 2 终止——包括不可读的文件、空文件或纯注释文件、空条目a,,b即未设置变量展开的结果、未排序或重复的名字、过期stale名字。代码注释点明其动机任何格式错误都不得悄悄缩小预期集合否则会解除预言机的武装runtests.py#L370-L374。为什么空条目必须报错因为RSYNC_EXPECT_SKIPPED来自 shell 环境变量未设置变量会展开成空串而a,,b中的空段正是这种失误的痕迹。文档同时强调整体为空的RSYNC_EXPECT_SKIPPED仍是合法的预期无任何跳过与条目中出现空段截然不同——前者是显式意图后者是配置事故。精确的集合比较意味着清单被截断绝不会蒙混过关它会表现为一整页unexpected skips意外跳过把清单丢失的每个测试都点名出来读起来像套件级回归而不是清单损坏。在源头失败退出码 2能准确说出实际发生了什么这正是校验选择解析期即报错而非运行期再发现的原因。-name减法允许特定主机从清单中移除测试除加法外规格还支持-name形式的减法条目用于某主机确实能运行其平台清单预期会跳过的测试的场景。减法必须实际移除某样东西——runtests.py#L443-L452规定移除一个规格从未添加的名字清单已不再期望该跳过或拼写错误与重复移除都会报错退出因为悄悄缩小预期集合正是本解析器要杜绝的失败模式。减法在全部加法之后应用因此顺序无关。skiplist-spec_test.py#L153-L172专门验证了这一语义-victim恰好移除一个名字、移除顺序不影响结果、过期移除会被拒绝。四、相对路径与srcdir让外部构建与make installcheck可用FILE条目中的相对路径基于srcdir解析而不是当前工作目录。这保证了外部out-of-tree构建在构建目录里执行make check时清单文件仍在源码树中make installcheck此时srcdir本身也可能是相对路径如--srcdir../src。runtests.py 的处理是非绝对路径一律os.path.join(srcdir, path)。skiplist-spec_test.py 用两组用例分别验证了相对 srcdir与安装检查场景下嵌套相对 srcdir两种情形都能正确解析。五、格式违规的完整守卫skiplist-spec_test.py文档中exit 2 on anything malformed并非空话——testsuite/skiplist-spec_test.py 是一份针对解析器的自检测试逐条验证了这些失败模式确实会硬报错而非静默放行缺失文件、未知测试名、未排序清单、重复条目、清单中的过期名字空文件、纯注释文件、非 UTF-8 文本二进制空条目acls,,sparse、前导/尾随逗号名字中夹带路径../testsuite/acls、一行两个名字、名字含逗号、目录冒充测试。它甚至构造了一个 fakesuite 站桩目录skiplist-spec_test.py#L45-L51让各种畸形名字看起来像真实测试从而确保某个守卫被移除时不会被其他检查掩盖。同时它还核对已提交的清单本身可解析、非空并保证每个已提交清单都被某个工作流引用、每个工作流引用都能展开——孤儿清单无任何工作流指向意味着它静默停止被强制执行同样是失败skiplist-spec_test.py#L130-L152。六、修改清单的准则修复优先于登记文档对往清单里加名字给出明确的行为准则优先修复测试使其不再跳过——新出现的跳过通常是该测试环境设置中的真实回归跳过确实正当legitimate时把名字加到**最窄适用范围最小**的匹配文件中并附原因不要用无法解释的名字来掩盖不匹配——意外跳过通常意味着该测试前置条件的真实退化。这背后是预期清单即声明的设计哲学清单不只告诉 CI 这些会跳过还承诺除此之外任何跳过都是故障。因此登记一个名字等于签署一份此跳过有正当理由的声明而理由只能写在行尾注释里。七、舰队测试fleettest.py如何复用这些清单testsuite/fleettest.py 在 ssh 舰队上构建 rsync 并以 stdio-pipe 与--use-tcp两种传输并行跑套件。它读取这些清单的路径与runtests.py不同每个目标target镜像某个.github/workflows/*.yml作业其RSYNC_EXPECT_SKIPPED规格直接从对应工作流解析testsuite/README.md#L159-L164、fleettest.py在解析结果之上按fleettest.json中的expect_skip_extra合并单机事实——即只对某一台机器成立、而非对整个平台成立的跳过如某台机器没有独立文件系统而导致的跨设备用例差异反过来expect_skip_omit可从清单中移除名字用于某目标反而能跑平台清单预期跳过的测试例如testsuite/fleettest.json.example#L262-L267中 SIMD 目标专门移除simd-checksum因为该目标就是为启用 SIMD 而建的。fleettest.py通过正则从工作流步骤中解析字面规格fleettest.py#L323附近并用-name减法把expect_skip_omit表达为runtests能理解的规格。协议 pass 的预言机取自同名工作流步骤每个protocols目标跑一次额外的 stdio-pipe passruntests --protocolN而每个 pass 的预期跳过规格取自同名工作流步骤testsuite/README.md#L194-L201。这意味着目标声明protocols: [29]时只有其工作流确实有make check29步骤并组合了proto29.txt预言机才生效目前只有 Ubuntu 工作流做check29/check30macOS 或 Cygwin 目标即使声明运行协议 29也不会得到该 pass 的错误预言机——宁缺毋滥不会用一个错误的预言机去校验。八、backport.txt同目录下的另一类文件testsuite/skiplist/backport.txt与前述清单性质完全不同。回移植分支backport branch如v3.4.1-sec-patches3、v3.2.7-sec-patches3会用比其自身更新的测试套件来测试fleettest.py --repo backport --testsuite-repo 3.5.0。这样的树无法通过它未携带的修复对应的测试也无法构建其 Makefile 从未听说过的单元测试辅助程序。因此这些分支各自携带自己的testsuite/skiplist/backport.txt其语义差异必须分清目录中其他文件是RSYNC_EXPECT_SKIPPED预言机——这些测试应当跳过若有变化请告诉我backport.txt是RSYNC_EXCLUDE清单——这些测试根本不要运行。它必须是排除而非预期跳过原因直白部分测试在较老树上是失败而非跳过而预期跳过清单无法描述失败。从被构建的树读取而不是从提供套件的树读取runtests.py 的read_backport_exclude()与 fleettest.py 一致backport.txt从被构建BUILD的树读取而非提供套件的树——因为只有被构建的树知道自己缺什么。把较新testsuite/覆盖到较老树上的 overlay 是不含删除的合并因此只存在于回移植分支上的文件如backport.txt能在覆盖后幸存。这也正是它不能作为FILE出现在预期跳过规格中的原因FILE按srcdir套件树解析而backport.txt属于构建树runtests.py 注释明确说明这一点。相应地skiplist-spec_test.py 把backport.txt从每个已提交清单必须被工作流引用的规则中豁免没有任何东西引用它这是设计使然。已接受的破损accepted breakage与缺失特性absent features必须区分backport.txt中的条目分两类且必须保持可区分absent缺失——分支没有的修复、特性或辅助程序。测试永远不会通过也不提供任何信息accepted breakage已接受的破损——该分支上真实存在的缺陷但项目选择带着它发布。测试本可以提示问题排除它是一个决策而非记账。第二类必须放在带注释的独立小节中注明缺陷名称及其书面记录位置。文档给出了实例v3.2.7-sec-patches3当前有一例fake-super-acl-xattr即--remote-option本地传输 bug。若清单不区分这两类约一个发布周期内我们知道且已接受就会退化成此测试在此从未适用过——排除的理由将不可追溯。回移植分支 CI 的配套义务当回移植分支的 CI 被配置为用此套件测试它们时必须与fleettest.py保持一致从被构建的分支读取backport.txt并以RSYNC_EXCLUDE传入。不这样做的 CI 作业会在每一条上失败最终被关闭——也就是说正确读取回移植排除清单不是可选项而是此类 CI 存活的前提。九、实践要点总结新增跳过测试优先修测试确需跳过时把名字加到最窄适用的清单文件平台级 → 平台文件协议级 → 协议文件保持排序、无重复并写# reason。验证清单任何格式错误都会让runtests.py以退出码 2 终止完整运行的集合比对是精确的截断清单会表现为整页unexpected skips。主机级例外用-name减法或fleettest.json的expect_skip_omit/expect_skip_extra表达单机事实而非改动平台清单。回移植分支backport.txt走RSYNC_EXCLUDE通道从构建树读取区分缺失特性与已接受破损后者务必附缺陷说明。这套机制的价值在于把跳过从 CI 日志里无人问津的灰色地带变成一份被强制校验、逐行可追溯、跨分支可合并的精确契约。testsuite/skiplist/目录是它的唯一真源而 runtests.py、testsuite/skiplist-spec_test.py 与 testsuite/fleettest.py 分别从解析、守卫与舰队复用三个层面保证了它始终可信。赞分享CLI数据同步网络【免费下载链接】rsyncAn open source utility that provides fast incremental file transfer. It also has useful features for backup and restore operations among many other use cases.项目地址https://gitcode.com/gh_mirrors/rs/rsync点击查看免费下载相关推荐git-imerge测试策略构建可靠的合并冲突测试套件git imerge测试策略构建可靠的合并冲突测试套件 git imerge作为Git的增量合并工具其核心价值在于将复杂的合并冲突分解为最小粒度的成对冲突。Apache Maka Windows 测试跳过清单解析98 条 skip 声明的分类治理与自动化清单机制Apache Maka Windows 测试跳过清单解析98 条 skip 声明的分类治理与自动化清单机制 本指南围绕 Apache MakaIncubat人工智能AI Agent自主智能体工具调用交互助手AI 评测3行代码发出第一个HTTP请求Python库Requests完整上手指南3行代码发出第一个HTTP请求Python库Requests完整上手指南 还在为一个GET请求写十行代码用Python HTTP请求库Requests发请后端网络通信上一篇VisualCppRedist AIO一站式解决Windows应用程序兼容性问题下一篇免费风扇控制终极指南用FanControl彻底解决电脑噪音和散热难题创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考 SEO 优化官网定制响应式建站教育培训建站