docs/src/release-notes/0.10.0.md
We are happy to announce the release of Rust Coreutils 0.10.0 - a release focused on GNU compatibility and robustness. The GNU test suite results improved sharply this cycle (645 passing, 29 failing, down from 56), we landed a second wave of security hardening (TOCTOU races, safe recursive descent, SELinux labeling at creation, backup guards), and we ran a broad anti-panic campaign across the utilities. On top of that: new features (mv --exchange, an OpenSSL backend for the checksum utilities), more zero-copy/read-ahead performance work, and wasm32-wasip2 support.
| Result | 0.9.0 | 0.10.0 | Change 0.9.0 to 0.10.0 | % Total 0.9.0 | % Total 0.10.0 | % Change 0.9.0 to 0.10.0 |
|---|---|---|---|---|---|---|
| Pass | 625 | 645 | +20 | 90.58% | 93.48% | +2.90% |
| Skip | 8 | 15 | +7 | 1.16% | 2.17% | +1.01% |
| Fail | 56 | 29 | -27 | 8.12% | 4.20% | -3.92% |
| Error | 1 | 1 | 0 | 0.14% | 0.14% | 0% |
| Total | 690 | 690 | 0 |
Note: 0.9.0 bumped the GNU reference to 9.11, which added 25 new tests and temporarily pushed the failure count up. This cycle absorbed most of that debt: failures dropped from 56 to 29 and passes reached an all-time high of 645. As we contributed many tests to the GNU implementation, we are also the source of some of these regressions!
GNU Compatibility
pr (-w/-W/-l/-e/-o, merge mode, page ranges), nproc (cgroups v2 quota, affinity mask, offline cores, OMP_* handling), date (out-of-range years, -d -, O modifier, timezone strings), numfmt, ls, du, install, od, truncate, fold, head/tail, sum, statSecurity Hardening
touch no longer uses O_TRUNC on create, mkfifo drops the path-based chmod, head checks the open fd instead of the path, split hardens the output-open path, chcon anchors recursive relabeling to the traversal dirfdchmod/chown (symlink cycles, --preserve-root re-checked during the descent), and cp no longer descends into a destination subdirectory that is a symlinkmkdir, mkfifo and mknod instead of being applied afterwardsmv fails closed when recreating a cross-device directory destination, compares file identity in the --backup=simple guard, and strips setuid/setgid when a cross-device copy cannot preserve ownershipchroot chroots exactly the path --skip-chdir validated; stdbuf refuses a libstdbuf path that cannot be represented in LD_PRELOAD; install finalizes ownership before modeSECURITY.md documenting our threat model, scope and reporting processRobustness: Anti-Panic Campaign
shuf, printf, numfmt, fmt, pr, chroot, dircolors, install, ln, touch, stat, split, expand, more, kill, cp, du, rm, runcon, sort, chown/chgrp, dirname, expr, cksum, dd, truncate, hashsum/dev/full, char-boundary panics on multibyte input, integer overflow on extreme widths/precisions/sizes, and unbounded allocations for huge argumentsexpr now uses an iterative parser, so deeply nested expressions no longer overflow the stackNew Features
mv --exchange to atomically swap two pathsinstall supports reflink, and install -C now works with --preserve-timestampscut -O as a short option for --output-delimiterrm --one-file-systemtimeout now works on Windows, and tail -f/-F finally follows files on WindowsPerformance
cksum family, sum, split, expand/unexpand and the base* utilitiestee zero-copy fast path; cat throughput improvements; faster non-reflink cp; cross-device mv via the fast copy pathexpr: index went from O(N*M) to O(N+M); uniq and du improvements; tsort now buffers its outputexpr, tr, cut, uniq and locale-aware sort mergesInternationalization
cut supports multibyte characters in non-UTF-8 localesls uses Unicode quotes for the locale/clocale styles in UTF-8 locales and escapes non-ASCII control charactersC.UTF-8 being detected as ASCII, and incomplete Fluent fallback bundlescksum quotes file names in a locale-aware wayCross-platform Reach
timeout implementation, sparse copy support in cp, tail -f, cksum CRLF fixls --numeric-uid-gid on non-unix platforms, uptime uses CLOCK_BOOTTIME on more platformsCode Quality
clippy::collapsible_if and clippy::match_same_arms are now clean and enabled workspace-widenix → rustix migration (dd, kill, sync, uptime) and further removal of unsafe and to_string_lossyContributions: This release was made possible by 50 new contributors joining our community
Try it in your browser - Online Playground powered by WebAssembly Help us translate - Contribute to Rust Coreutils on Weblate Sponsor us on GitHub to accelerate development: github.com/sponsors/uutils
--from nonexisting_group GROUP by @cakebaker in https://github.com/uutils/coreutils/pull/13490test_reference less strict on Linux by @cakebaker in https://github.com/uutils/coreutils/pull/13650backup_dest() by @cakebaker in https://github.com/uutils/coreutils/pull/12719-O as short for --output-delimiter by @cakebaker in https://github.com/uutils/coreutils/pull/13011COMPLEX_SEQUENCE in test by @cakebaker in https://github.com/uutils/coreutils/pull/12601uumain by @cakebaker in https://github.com/uutils/coreutils/pull/13757form to fmt by @cakebaker in https://github.com/uutils/coreutils/pull/12898%Od instead of %Ol in test by @cakebaker in https://github.com/uutils/coreutils/pull/13725if/else chain with match by @cakebaker in https://github.com/uutils/coreutils/pull/12822print! calls by @RenjiSann in https://github.com/uutils/coreutils/pull/13437Ok(()) outside of match by @cakebaker in https://github.com/uutils/coreutils/pull/13129relative_path fn by @cakebaker in https://github.com/uutils/coreutils/pull/13585map_err instead of match by @cakebaker in https://github.com/uutils/coreutils/pull/13546map_err instead of match by @cakebaker in https://github.com/uutils/coreutils/pull/12489is_prefix_of() by @cakebaker in https://github.com/uutils/coreutils/pull/12915match by @cakebaker in https://github.com/uutils/coreutils/pull/12916match instead of if/else chain by @cakebaker in https://github.com/uutils/coreutils/pull/13004translate macro for two error messages by @cakebaker in https://github.com/uutils/coreutils/pull/13730--parallel on WASI by @cakebaker in https://github.com/uutils/coreutils/pull/13028loop explicit by @cakebaker in https://github.com/uutils/coreutils/pull/13674map_err instead of match by @cakebaker in https://github.com/uutils/coreutils/pull/12664platform/wasi.rs by @cakebaker in https://github.com/uutils/coreutils/pull/13076write_line_terminator macro by @cakebaker in https://github.com/uutils/coreutils/pull/13632unreachable_patterns lint on Windows by @cakebaker in https://github.com/uutils/coreutils/pull/13616linux_execfn by @YumeYuka in https://github.com/uutils/coreutils/pull/12416time & adapt pinky and who to API change by @cakebaker in https://github.com/uutils/coreutils/pull/12872getrandom from 0.4.2 to 0.4.3 by @cakebaker in https://github.com/uutils/coreutils/pull/12957itertools from 0.14.0 to 0.15.0 by @cakebaker in https://github.com/uutils/coreutils/pull/12987phf & phf_codegen from 0.13.1 to 0.14.0 by @cakebaker in https://github.com/uutils/coreutils/pull/13048defmt from 1.1.0 to 1.1.1 by @cakebaker in https://github.com/uutils/coreutils/pull/13271winnow from skip list by @cakebaker in https://github.com/uutils/coreutils/pull/13290crossbeam-epoch from 0.9.18 to 0.9.20 by @cakebaker in https://github.com/uutils/coreutils/pull/13299thiserror & add syn to skip list by @cakebaker in https://github.com/uutils/coreutils/pull/13457spin from 0.10.0 to 0.10.1 by @cakebaker in https://github.com/uutils/coreutils/pull/13455Full Changelog: https://github.com/uutils/coreutils/compare/0.9.0...0.10.0