YAOTU INSIGHTS

Rust Coreutils 0.0.28 版本解析:GNU 兼容性跃升 476 例与关键工具链修复全览

Rust Coreutils 0.0.28 版本解析:GNU 兼容性跃升 476 例与关键工具链修复全览
Rust Coreutils 0.0.28 版本解析GNU 兼容性跃升 476 例与关键工具链修复全览【免费下载链接】coreutilsCross-platform Rust rewrite of the GNU coreutils项目地址: https://gitcode.com/GitHub_Trending/co/coreutilsRust Coreutilsuutils/coreutils是一个用 Rust 重写的 GNU coreutils 跨平台替代实现。0.0.28 版本发布于 2024-11-16是该项目兼容性进程中的一次重要里程碑GNU 测试套件通过数从 0.0.27 的 455 提升至 476净增 21失败数从 113 降至 94同时汇聚了 37 位贡献者含 16 位新人的 80 余个合并改动。本文以官方发布说明 docs/src/release-notes/0.0.28.md 为骨架结合仓库源码与测试逐项解析本次版本在cksum/hashsum、cp、tr、ls、mkdir等核心工具上的行为变化帮助读者理解每项改动背后的实现原理与实测验证方式。版本概览与兼容性数据0.0.28 的核心卖点是兼容性与稳定性的显著提升。发布说明给出的 GNU 测试套件对比数据如下结果0.0.270.0.28变化% 总量 (0.0.27)% 总量 (0.0.28)% 变化Pass通过4554762174.35%77.65%3.30%Skip跳过4443-17.19%7.01%-0.18%Fail失败11394-1918.46%15.34%-3.12%Error错误0000.00%0.00%0.00%三个关键信号通过率突破 77%且失败数首次降至 100 以下Error 保持 0说明所有测试均能正常执行完毕不存在崩溃或不可运行的用例性能层面发布说明点名的优化集中在cksum、mkdir和tr三个工具。该测试数据由仓库的 GNU 测试运行流程产出相关工具脚本位于 util/run-gnu-test.sh 与 util/analyze-gnu-results.py感兴趣的读者可以在本仓库tests/目录下复现对应用例。cksum / hashsum本版本改动最密集的模块0.0.28 对校验和工具链投入最大共 7 项功能与修复覆盖--check校验、非 UTF-8 文件名、注释行、-z/--zero输出分隔符以及错误处理等方向。--check支持 base64 编码校验和此前--check只能解析十六进制摘要本次新增对 base64 编码校验和文件的支持PR #6452。实测用例见 tests/by-util/test_cksum.rs它验证了同一份校验文件里混用MD5、SHA256、BLAKE2b三种 base64 摘要时的场景MD5 (empty) 1B2M2Y8AsgTpgAmY7PhCfg SHA256 (empty) 47DEQpj8HBSa/TImW5JCeuQeRkm5NMpJWZG3hSuFU BLAKE2b (empty) eGoC90IBWQPGxv2FJVLScpEvR0DhWEdhiobiF/cfVBnSXhAxr5YUxOJZESTTrBLkDpoWxRIt1XVb3Aa/pvizg执行cksum --check check后三个文件均输出empty: OK。与之配套的还有输出侧编码选项--base64由 src/uu/cksum/src/cksum.rs 中OutputFormat::from_cksum的base64标志驱动以及测试模块cksum_base64_encoding对每种算法都能配合--base64生成校验和的覆盖见 tests/by-util/test_cksum.rs。非 UTF-8 文件名与校验文件内容GNU/Linux 文件系统允许文件名和文件内容包含任意字节0.0.28 为这两条路径都补齐了支持文件名层面PR #6575接受非 UTF-8 文件名作为cksum的输入参数内容层面PR #6793--check读取的校验文件中可以出现非 UTF-8 字节。测试模块check_encodingtests/by-util/test_cksum.rs专门验证了这两点例如在注释行中嵌入\xff字节test_check_non_utf8_comment以及创建名为含\xff的文件test_check_non_utf8_filename仅 Linux。注意这些测试在 Windows 上被#[cfg(not(windows))]排除原因是 Windows 缺少OsString与字节序列之间的安全转换。校验文件中的注释行PR #6782 为--check增加了注释行支持以#开头的行被静默丢弃。测试 tests/by-util/test_cksum.rs 展示了三种边界情况行首#注释可正常跳过只有注释的文件等价于空文件此时--check报错no properly formatted checksum lines foundtest_check_comment_only#必须位于行首才被识别为注释前导空格不算test_check_comment_leading_space这保证了与 GNU 行为一致。-z/--zeroNUL 分隔输出PR #6815 实现了-z/--zero选项在--check模式下用 NUL\0而非换行符分隔输出行便于脚本安全处理包含特殊字符如换行的文件名。对应测试 tests/by-util/test_cksum.rs 分别用-z单文件与多文件和--zero长选项验证了输出。实现层面该选项由 src/uu/checksum_common/src/cli.rs 的with_zero()注册并在 src/uu/checksum_common/src/lib.rs 通过LineEnding::from_zero_flag()决定行结束符。其他 cksum 修复错误处理强化PR #6801统一了各类校验错误的返回路径依赖uucore::checksum::ChecksumError体系缺失/非法文件自动跳过PR #6524--check时如果第一个校验文件缺失或格式非法自动读取下一个文件而不是中断整个流程未打标签时自动探测摘要长度PR #6499hashsum当校验文件行未带算法标签untagged时根据摘要长度自动推断算法Windows 二进制模式PR #6808hashsumWindows 上默认以二进制模式检查并开放--binary/--text选项--strict/--quiet单独使用的报错PR #6584hashsum单独给出--strict或--quiet不配合--check时返回错误。tr多字节与转义解析的正确性修复tr在 0.0.28 中获得 8 项改动集中在转义序列解析与非 UTF-8 输入两大方向这是本版本另一个兼容性攻坚重点。多字节八进制转义序列PR #6779 修复了形如\NNN多字节八进制序列的处理。实现位于 src/uu/tr/src/operation.rs解析器先尝试按三位八进制解析当数值超过\3770xFF时回退为两位解析并给出多义八进制转义警告tr-warning-ambiguous-octal-escape对应测试test_multibyte_octal_sequence。这一逻辑同时保证了\400这类越界序列不再被错误截断。尾随反斜杠的判定PR #6731 修复了尾随反斜杠的判定逻辑——此前未转义的结尾\会产生误导性警告0.0.28 改为正确识别并处理src/uu/tr/src/diagnostics.rs 附近的相关诊断逻辑。同时 PR #6713 消除了对未转义尾随反斜杠的误报警告。非 UTF-8 参数与补集约束PR #6563tr的 SET1/SET2 参数现在接受非 UTF-8 字节串解析器如 src/uu/tr/src/operation.rs 的补集处理改为按字节而非字符工作PR #6564当对补集类complemented class操作时若 SET2 过大即补集展开后元素数超过 SET2 长度则报错tr-error-complement-more-than-one-unique避免静默截断PR #6513正确检测[:upper:]在补集/翻译模式下的匹配行为另有多个被修复的历史遗留测试在 Unix 上重新启用PR #6737、PR #6756。cp健壮性与 GNU 用例对齐cp是本版本改动第二多的文件工具共 8 项重点覆盖硬链接、符号链接、大文件与参数校验。大文件写入避免 OOM 与部分写入PR #6694 修复了复制大文件时可能的内存耗尽OOM与部分写入问题——复制逻辑改为分块缓冲不再一次性把大文件读入内存。从源码结构看src/uu/cp/src/cp.rs 区域专门处理源与目标为同一硬链接时的--remove-destination场景而分块复制逻辑在 src/uu/cp/src/copydir.rs 与平台实现src/uu/cp/src/platform/中完成。符号链接与硬链接语义PR #6586修复符号链接覆盖时的错误优先级确保与 GNU 报错顺序一致PR #6588对齐 GNUpart-symlink测试用例部分复制场景PR #6496--verbose模式下正确报告保留的硬链接此前该信息会被遗漏PR #6825检查重复源文件前先规范化路径normalize避免./a与a被误判为不同源。权限与参数校验PR #6700当目标文件缺少S_IWUSR用户写权限时显示 mode帮助定位权限问题PR #6690为cp增加参数数量校验参数不足时给出明确错误PR #6683空文件名按不存在的文件处理行为与 GNU 一致。ls / mvGNU 测试用例对齐ls 的 11 项改动--dired适配PR #6144、#6538跟随 GNU v9.5 的格式变化调整-D/--dired输出并修复日期与父目录字节偏移缺失的问题颜色用例修复PR #6481、#6507、#6537color-norm、color-clear-to-eol、color-ext三个 GNU 用例逐一通过引号与列宽PR #6559递归模式下含冒号:目录名的引号转义修正并打上quote-alignGNU 用例PR #6510 重构parse_width函数输出细节PR #6528-CF组合时使用 Tab 分隔关闭 #5396PR #6521 修复子目录输出错误性能/代码质量PR #6609unwrap_or/or改为惰性求值的unwrap_or_else/or_else避免不必要的求值。mv 的 5 项改动GNU 用例对齐to-symlink#6578、mv-n#6599、dup-src#6837三个用例修复错误消息对齐PR #6641调整错误消息以通过tests/mv/mv-exchange.sh测试代码清理PR #6583跨分区复制测试代码重构。mkdir / ln / touch目录与链接细节mkdirACL 权限继承PR #6676为子目录增加 ACL 权限继承支持主要面向带默认 ACL 的文件系统防止改动已存在目录的 modePR #6682mkdir -m只作用于新建目录不再意外修改已存在目录的权限参数与路径校验PR #6790、#6802mkdir/rmdir强制要求参数空路径直接报错--parent可多次给出PR #6831mkdir -p -p dir不再报错PARENTS选项src/uu/mkdir/src/mkdir.rs允许多次指定。ln 与 touchlnPR #5975-nf--no-dereference --force组合允许以目录作为最终目标touch触碰目录时的提示消息更清晰PR #6506为 Nushell 暴露touch命令PR #5946。其他工具修复一览basencPR #6719改为更快、流式streaming编码不再一次性缓冲全部输入datePR #6503修复设置 UTC 时间时的时区错误新增两处测试#6526、#6471ddPR #6622错误消息对齐 GNU修复 #5905dircolorsPR #6636优化 clippy nightly 要求的整数与字符串操作echoPR #6803正确处理多字节转义序列joinPR #6736支持多字节分隔符-i模式下减少多余分配#6774odPR #6674、#6675允许地址基数address radix带尾随字符空基数不再 panicpastePR #6714允许分隔符列表为空printfPR #6511、#6548先校验精度再写 stdout修复 #1879修复多余填充runconPR #6657、#6680错误消息与帮助信息改进sortPR #6535--batch-size的错误管理改进syncPR #6547用USimpleError取代crash!避免直接崩溃testPR #6642-o参数现在触发错误而非被忽略uptimePR #6514、#6571OpenBSD 通过utmp支持macOS 上放宽 errno 差异导致的错误消息usersPR #6406、#6761、#6509、#6772OpenBSDutmp支持、文件参数类型从Vec改为Option、两处 lint 修复tsortPR #5968、#6785重构提议与tsort.pl错误消息对齐。uucore 公共库演进uucore是所有工具共享的公共库本版本的改动为后续工具开发铺路进程信息重构PR #6593、#6597、#6600tty从proc_info中拆分独立、修复ProcessInformation::tty返回值、为process.rs增加getsid进程相关代码上移PR #6483pgrep/process.rs移入uucore供更多工具复用信号处理PR #6382timeout接受任意大小写的信号名PR #6806 禁用 Rust 默认信号处理器避免干扰自定义行为错误体系PR #6549fsext移除crash!PR #6792 允许使用已弃用的PanicInfo校验和公共逻辑PR #6500简化determine_regex()。工程与 CI质量基础设施本版本工程侧同样活跃bin/coreutils的 help 输出新增--listPR #6692Cargo.toml 新增expensive_testsfeature 并将 lints 从 rustflags 迁入 Cargo.tomlPR #6498、#6751fuzz 测试改为以LC_ALLC运行 GNU 工具以对齐模糊测试环境PR #6795CI 新增 Windows arm64 构建PR #6624、GNU 测试工作流升级到 Ubuntu 24PR #6765。依赖方面renovate 自动化批量更新了serde、thiserror、regex、blake3、libc、tempfile、procfs等数十个 crate并随nix/ctrlcAPI 变化适配了代码PR #6648。总结0.0.28 通过 80 余个合并请求将 GNU 测试套件通过率推进到 77.65%其中cksum/hashsum的 base64 校验、注释行、非 UTF-8 输入与--zero输出tr的多字节转义解析以及cp的大文件健壮性构成了本次兼容性跃升的主要支柱。对使用者而言本版本可以直接替换 GNU coreutils 完成日常文件操作、校验和验证与文本处理对开发者而言uucore公共库的重构与测试用例的持续对齐为后续版本0.0.29 及更高的兼容率继续爬升奠定了基础。可继续阅读仓库中的 docs/src/release-notes/ 目录追踪后续版本演进或通过 tests/by-util/test_cksum.rs 等测试文件深入学习各工具的行为约定。【免费下载链接】coreutilsCross-platform Rust rewrite of the GNU coreutils项目地址: https://gitcode.com/GitHub_Trending/co/coreutils创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考