Rust Coreutils 0.11.0 Release:
We are happy to announce the release of Rust Coreutils 0.11.0 - a release focused on error messages, performance and GNU compatibility.
The big change is a new diagnostic engine built on ariadne. When a chmod mode, a cut list, a sort key or a tr set fails to parse, we now echo the arguments back with a caret under the character at fault, like a compiler does. See our blog post for more information: https://uutils.org/blog/2026-08-error-diagnostics/
PGO release builds are enabled for Linux, macOS and Windows (up to 31% faster), and a lot of per-utility optimization work landed on top of that. We also now treat a utility being significantly slower than GNU as a bug.
We continued to improve the GNU compatibility and we are now at 653 passing, 22 failing, 0 errors.
GNU Test Suite Compatibility:
| Result | 0.10.0 | 0.11.0 | Change 0.10.0 to 0.11.0 | % Total 0.10.0 | % Total 0.11.0 | % Change 0.10.0 to 0.11.0 |
|---|---|---|---|---|---|---|
| Pass | 645 | 653 | +8 | 94.44% | 95.33% | +0.89% |
| Skip | 9 | 10 | +1 | 1.32% | 1.46% | +0.14% |
| Fail | 28 | 22 | -6 | 4.10% | 3.21% | -0.89% |
| Error | 1 | 0 | -1 | 0.15% | 0% | -0.15% |
| Total | 683 | 685 | +2 (new tests) |
Note: 653 passing and 23 failing are both records for us, and this is the first release with no erroring test. Note that the suite grew by 2 tests this cycle (local backport). We also list the tests excluded from the pass/fail percentages now.
Highlights:
-
Modern Error Diagnostics (new)
- A new diagnostic engine based on ariadne. When stderr is a terminal, a parse error is printed as a report: the arguments are echoed back as a source line, a caret marks the culprit and a help line explains the syntax. See the blog post for before/after examples
- Carets landed in
chmod,mkdir,mkfifo,mknod,install,tr,expr,sort,numfmt,cut,env,head,tail,truncate,split,shred,stdbuf,od,seq,dd,stat,join,csplit,ls,dfanddu - A caret can point inside a quoted argument and at a single character. The reports are localized (format, checksum and advice strings) and still print the usual
Try '... --help'hint. A label is only added when it says something useful UUTILS_DIAGcontrols the behavior, and the caret rendering can be compiled out for size-constrained builds- Diagnostics are written in a single
stderrcall, so concurrent writers cannot interleave them
-
Performance
- PGO (profile-guided optimization) release builds: up to 31% faster - now enabled for the published Linux, macOS and Windows artifacts too.
cp: opens the file only once (+32.93%) and reuses the already-open destination fd when a reflink clone falls backjoin: 1.37x faster on paired input, 2.5x faster than GNU, by skipping the locale comparison when it cannot change the resultod --skip-bytesusessplice(2)on non-seekable input;tacusesfast_copy;ddno longer faults in the whole copy buffer before reading and page-aligns its read buffer- Fewer allocations and syscalls in
ptx(+4% via fxhash, plus fewer per-word allocations),nl(hoisted per-line prefix),tail(no double allocation per reverse chunk, nostat),expand/unexpand(nostat/is_dir),numfmtandsort - New benchmarks for
ptx,basencand thenumfmtstdin path - A utility being significantly slower than GNU is now considered a bug - please report it as one
-
GNU Compatibility
- 653 passing GNU tests (+8), 23 failures (-6) and no erroring test
- New GNU-matching options:
uname -A/--all-labeled,cut -Fand--whitespace-delimited,pr --columns/--join-lines/-falias and an optional argument for-n - Behavior fixes in
pr(page length of exactly 10, columns that do not divide evenly,-eat the end of a cluster),numfmt(leading+, scientific notation),uniq/truncate/paste(a repeated option overrides the earlier one),join -oaccumulating fields,idgroup ordering,unexpand/expandtab-list separators,mkdirEEXIST,more -f/-l,foldwidths,sort -t=,statnanosecond timestamps andBlock size,od16 significant digits,datetrailing timezones - A new
gnu/usage_vs_refs.shcheck verifies that every option we document also appears in GNU's texi docs - More error messages carry the real OS text instead of a stripped or made up one (
rm,env,od,chroot,stdbuf,tee,cut,date,tsort,pathchk,sort)
-
Security Hardening
mv/cp: xattr TOCTOU fixed by moving to file-descriptor-based operationsrm: no longer follows a symlink swapped in at the-roperandchmod: usesfchmodatfor recursive mode changes and no longer follows in-tree symlinks with-R --referencecp: does notchmodthrough the destination symlink;mvdoes not put a symlink in its target's hardlink groupstdbuf: fixed a temporary-directory leak
-
Robustness: Anti-Panic & Anti-Hang
- Hangs fixed:
splitendless loop,yesdeadlock,sortLinesfuse when a chunk boundary lands exactly at EOF - Panics and aborts fixed in
statandcspliton/dev/full,lswith an invalidQUOTING_STYLEon unwritable stderr,odon large ASCII dump widths,printfon large numeric and%s/%cfield widths,nlwith-w i32::MAX(rejection plus a 32-bit OOM fix),prandcsplitinteger overflow,ddu64wraparound,touchleap-second year overflow,tail -c +Npast the seek limit,tacSIGBUSon a truncated mmap,who -qstdout write errors uucore::parse_sizeno longer overflows on a large%size
- Hangs fixed:
-
Cross-platform Reach
- Windows:
killanduptimeimplementations, andtest -ef,-t,-h/-L,-r,-w,-x - WASI:
touchtimestamps,cpsymlinks,expr, cleaned-up core platform abstractions andcatintegration coverage dfgot a fallbackstatfspath using the mount table;uptimedropped its/procdependency on more targets;sttyandchgrpare now gated by target support; better iOS and Fuchsia handling
- Windows:
-
Dependency Diet
- Dropped
byteorder,same-file,filetime,winapi-util,file_diff,mockstream,binary-heap-plus,compare,arrayref,exaclanddns-lookupin favor ofstd,rustixandwindows-sys
- Dropped
-
Internationalization
- Symbolic mode parsing errors, the
chmod --verbosemessages and the new diagnostic strings are now translatable lssorts names using locale-aware collation,commcompares lines with the locale collation,nlsupports multibyte one-character section delimiters andcuthandles multibyte fields, bytes and delimiters correctlyuucorerebuilds its embedded locales when the consumer's dependencies change
- Symbolic mode parsing errors, the
-
Contributions: This release landed 358 pull requests from 26 new contributors. We also passed 1000 people having contributed to uutils coreutils. Per our activity tracking, August 2026 was our busiest month so far, with 476 commits from 57 authors
Call to Action:
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
What's Changed
base32
basename
basenc
cat
- cat: remove unnecessary impl by @oech3 in #13819
- cat: reduce nest & avoid accessing by index by @oech3 in #13820
- cat: catch 2nd+ splice's error by @oech3 in #13847
- cat: always exit with 1 on error by @mtvb in #14216
chmod
- chmod: only report umask-curtailed modes for option-like operands by @dhruv-15-03 in #13731
- chmod: don't follow in-tree symlinks with -R --reference by @Angadi56 in #13842
- chmod: translate chmod-verbose-neither-changed much more by @oech3 in #13872
- chmod: use the libc fchmodat symbol for recursive mode changes by @sylvestre in #14121
- chmod: remove duplicate code handling symlinks by @cakebaker in #13873
- chmod: simplify a nested match by @Devel08 in #14234
chroot
- chroot: strip errno by @oech3 in #14114
- chroot: extract proper error message from OS by @oech3 in #13884
cksum
- cksum: do not guard openssl by unix for MinGW by @oech3 in #13821
- cksum: fix typo in comment by @cakebaker in #13871
comm
- test(comm): enable --check-order/--nocheck-order order-checking tests by @AH64-dll in #13969
- comm: add missing error-write locale by @Devel08 in #14140
- comm: compare lines with the locale collation by @luantaraschi in #14047
cp
- cp: don't chmod through the destination symlink by @Angadi56 in #13443
- cp: support symlinks on WASI by @DePasqualeOrg in #13804
- cp: reject --attributes-only self-copies (#13161) by @alexchen-sys in #13894
- cp: use default suffix when backup suffix is empty by @TheAdamWarlock in #13966
- cp: honor --reflink=never on macOS by @nagendramohan in #14076
- tests_cp.rs: replace filetime by std by @oech3 in #14174
- cp: label the destination of -Z when it is named relatively by @sylvestre in #14161
- cp: reuse the open dest fd when a reflink clone falls back by @sylvestre in #14136
- tests_cp.rs: ensure error of ioctl is catched when --reflink=always by @oech3 in #14270
- test_cp.rs: fix error message of ficlone on musl by @oech3 in #14273
- cp: open file only once (+32.93%) + add tests for mv & cp by @sylvestre in #14272
csplit
- csplit: avoid negate-with-overflow on an i32::MIN regex line offset by @leeewee in #13753
- csplit: don't panic on /dev/full stdout by @Devel08 in #14130
cut
- cut: match GNU diagnostics for invalid ranges and options by @sylvestre in #13925
- cut: add -F option and --whitespace-delimited=trimmed, fix -s/-n edge cases by @sylvestre in #13926
- cut: char-aware multibyte field, byte and delimiter handling by @sylvestre in #13927
- cut: allow shortcuts for
--whitespace-delimitedby @cakebaker in #13972 - cut, dd: use plain text help headings by @fly1d in #13982
- cut: strip i/o errno by @Devel08 in #14060
- cut: simplify by .map_err by @oech3 in #14074
- cut: improve and shorten help text by @cakebaker in #13985
- cut: rename const
NOTHINGtoNO_PARTIALby @cakebaker in #14042
date
- date: strip errno when write to stdout fails by @Devel08 in #14206
- date: update parse_datetime to 0.16.0 to accept \v and \f as whitespace by @wtcpython in #14221
- date: reject a trailing timezone when the input already has one by @ARMeeru in #14168
dd
- dd: give the delayed reader test more slack between writes by @sylvestre in #13945
- dd: report transfer statistics when the copy fails by @sylvestre in #13856
- dd: stop faulting in the whole copy buffer before reading by @luantaraschi in #14044
- dd: page-align read buffer by @chrboe in #12143
- dd: u64 wraparound fix by @mtvb in #14200
df
- df: simplify fn find_mount_point by @oech3 in #13916
- df: add a fallback path for statfs with a mount table by @Gelbpunkt in #12072
- df: split platform specific code by @nikolalukovic in #14080
dircolors
- dircolors: turn integration test into unit tests by @cakebaker in #12507
dirname
env
- env: extract error message from OS instead of showing unknown error by @oech3 in #13960
- env: avoid accessing by index & simplify loop by @oech3 in #14107
expand
- expand: simplify match by @oech3 in #14082
- expand: remove .is_dir() overhead by @oech3 in #13203
- expand: accept tab as tab-list separator by @cakebaker in #14204
expr
- expr: remove redundant about text from after-help by @alexchen-sys in #13987
- expr: fix bug-prone index access pattern by @oech3 in #13596
fmt
- fmt: remove condition that is always true by @cakebaker in #13809
- fmt: simplify match by @oech3 in #14093
fold
- fold: match GNU error messages for an invalid -w/--width value by @AlejandroCoronadoN in #14056
- fold: do not fold a bytewise line that is exactly the width by @Socialpranker in #14189
hashsum
head
- head: fix flaky
test_zero_bytes_with_suffixby @cakebaker in #13768 - head: propagate a write error from the -v filename header by @MsfPablo in #13996
- head, tail: keep leading zeros in an invalid count message by @arbelonson-source in #14249
hostname
id
- id: order groups= by effective gid and -G by real gid, like GNU by @sylvestre in #14103
install
- install: allow non-directory special files as targets by @MsfPablo in #13791
- install: strip "(os error N)" from --strip-program failure by @MsfPablo in #13914
- install: remove filetime from dep by @oech3 in #13947
- install, comm: remove file_diff in favor of uucore::fs::are_files_identical by @wtcpython in #14113
- test_install.rs: test for ficlone (reflink) by @oech3 in #13580
- install: reduce nest by if & match by @oech3 in #13346
- install: remove a to_string_lossy by @oech3 in #13338
- tests_install.rs: replace filetime by std by @oech3 in #14172
join
- join: let -o accumulate fields across occurrences like GNU by @AlejandroCoronadoN in #14070
- join: report the field number the user gave by @MsfPablo in #13995
- join: 1.37x faster on paired input, 2.5x faster than GNU, by skipping the locale compare by @sylvestre in #14213
- join, od: report a hyphen-leading value instead of rejecting it by @arbelonson-source in #14257
kill
- kill: implementation for Windows by @nikolalukovic in #13604
- kill: skip flaky realtime signal test on i686 by @sylvestre in #13943
- kill: skip realtime signal tests when the signal is ignored by @sylvestre in #13953
- kill: fix for accepted duplicate signal prefixes by @mtvb in #14178
ln
- hard link creation failure has src and dst swapped in error message by @Devel08 in #13745
- ln: swap dest & source in french locale by @Devel08 in #13905
- ln: remove pub to improve the public API by @oech3 in #14225
- ln: avoid accessing by index & simplify if by @oech3 in #14197
- ln: clarify exclusive pattern by @oech3 in #14266
ls
- ls: use locale-aware collation for name sort by @sylvestre in #11841
- ls: only track listed directories when recursing by @sylvestre in #13855
- ls: reduce cfg for fn symlink by @oech3 in #13911
- ls: simplify long if block by unwrap_or by @oech3 in #13917
- ls: exit with code 2 on write error by @Devel08 in #14111
- ls: fix QUOTING_STYLE=invalid ls 2>/dev/full SIGABRT by @oech3 in #13209
- ls: test that an invalid QUOTING_STYLE does not abort on unwritable stderr by @sylvestre in #14138
mkdir
- mkdir: return a proper error mesage when dir is inexistent by @Devel08 in #13836
- strip errno when argument is not a directory but an existing file by @Devel08 in #13890
- mkdir: do not ignore EEXIST on non-recursive creation by @alexchen-sys in #13986
mkfifo
- mkfifo: use std::io::Result, remove manual conversion by @oech3 in #13777
- mkfifo: fix mismatched types error on freebsd by @xtqqczze in #14259
mktemp
- mktemp: remove the temp file when its name cannot be printed by @sylvestre in #13853
more
- more: swap -f and -l short flags to match GNU/util-linux by @c-tonneslan in #12337
mv
- mv: use GNU default error when overwriting non-empty directory by @aaron-ang in #10078
- tests_mv.rs: replace filetime by std by @oech3 in #13948
- mv: don't put a symlink in its target's hardlink group by @sylvestre in #14170
nl
- nl: continue processing files after error by @lauchimoon in #13778
- nl: support multibyte one-char section delimiters by @cakebaker in #13848
- nl: simplify match by @oech3 in #13921
- nl: hoist the per-line blank-line prefix allocation by @haydonryan in #13920
- nl: reject -w values > i32::MAX to avoid capacity-overflow panic by @koopatroopa787 in #13348
- nl: avoid OOM on 32-bit when -w i32::MAX is used by @sylvestre in #14078
- nl: drop unused translation by @oech3 in #14072
numfmt
- numfmt: benchmark the stdin path, not only arguments by @sylvestre in #13993
- numfmt: name the only conversion in a bad --format directive by @sylvestre in #14001
- numfmt: improve performances by @sylvestre in #14003
- numfmt: reject a leading + and scientific notation to match GNU by @AlejandroCoronadoN in #13899
od
- od: avoid panic on large ASCII dump widths by @0Whisperos in #13787
- od: replace hardcoded error massage by OS's message by @oech3 in #13959
- od: improve perf for --skip-bytes non-seekable input by splice(2) by @oech3 in #13748
- od: remove mockstream which is not used at production by @oech3 in #13968
- od: match GNU's 16 significant digits for f64 output by @sylvestre in #13965
- od: simplify a match in input_decoder.rs by @Devel08 in #14006
- od: remove unused properties from
InputDecoderby @cakebaker in #14023 - od, ls: simplify match by @oech3 in #14100
- od: replace byteorder with std endian methods by @wtcpython in #14094
pathchk
- pathchk: readable error message without scrolling terminal by @oech3 in #13220
- pathchk: reject missing operand by clap by @oech3 in #14147
- pathchk: prepend pathchk: to error message & improve error for long name by @oech3 in #14146
pinky
- pinky: make tests resilient to the idle column changing between runs by @sylvestre in #14155
pr
- pr: fix overflow issues by @MuntasirSZN in #13770
- pr: accept -e at the end of a short flag cluster by @m0g3r in #13949
- pr: treat a page length of exactly 10 as omitting the header by @luantaraschi in #14045
- pr: stop dropping lines the columns do not divide evenly by @luantaraschi in #14088
- pr: make -n/--number-lines argument optional to match GNU by @AlejandroCoronadoN in #13900
- pr: rename
--columnto--columnsby @cakebaker in #14133 - pr: add
--join-linesas long option for-Jby @cakebaker in #14135 - pr: show alias
-fin help by @cakebaker in #14132
printf
- printf: omit errno from write errors by @floze-the-genius in #13852
- printf: diagnose a failed write of unterminated output by @sylvestre in #13854
- fix(printf): compute asterisk width magnitude in unsigned arithmetic by @bolverk in #13800
- printf: avoid panic on %s/%c field width above u16::MAX by @AlejandroCoronadoN in #13883
- printf: use plain text help headings by @nagendramohan in #14075
- printf: fix for \c inside %b by @mtvb in #14165
- printf: avoid panic on large numeric field widths by @Air-crypto in #13857
ptx
- ptx: handle -g by clap & reject 0 by @oech3 in #13796
- ptx: add benchmark by @Aisha630 in #13480
- ptx: refactor to avoid multiple string heap allocations by @haydonryan in #13897
- ptx: perf +4% by fxhash by @oech3 in #13946
- ptx: reduce per-word allocation overhead and speedup line scans by @Aisha630 in #14021
- ptx: accept invalid UTF-8 input and trailing backslash regexps by @sylvestre in #14032
readlink
rm
- rm: replace a hardcoded error message by @oech3 in #13956
- rm: extract permission denied message from OS by @oech3 in #13967
- rm: do not follow a symlink swapped in at the -r operand by @sylvestre in #14122
sleep
sort
- sort: avoid reopening non-seekable inputs by @wtcpython in #13494
- sort: replace if block by .filter by @oech3 in #13773
- sort: simplify loop & 2 if blocks by @oech3 in #13909
- sort: reject --batch-size arguments above the fd soft limit by @sylvestre in #14033
- sort: refuse a random source shorter than the salt by @luantaraschi in #14067
- sort: replace binary-heap-plus and compare with std::collections::BinaryHeap by @wtcpython in #14106
- sort: fix for Lines fuse if chunk boundary is exactly at EOF #14126 by @mtvb in #14127
- sort: report read failures with context by @arcusbuilds in #14005
- sort: run read_error_message only on gnu glibc linux by @Devel08 in #14141
- sort: support attached '-t=' to select '=' as field separator by @MadeNavaneeth in #14144
- sort: accept musl's EIO text in read_error_message test by @sylvestre in #14150
split
- split: restore --io-blocksize & remove io::copy by @oech3 in #13643
- Split enters endless loop fix #14118 by @mtvb in #14123
stat
- stat . > /dev/full panics by @Devel08 in #13401
- stat: don't depend on /dev/stdin for unmounted /dev by @oech3 in #13810
- stat: truncate string precision on a byte boundary to avoid a panic by @leeewee in #13752
- stat: fix "unnecessary qualification" clippy error by @cakebaker in #13877
- stat: preserve nanosecond timestamp precision by @kevinburke in #13976
- stat: print the format up to a bad directive by @sylvestre in #14102
- stat: remove unnecessary
#[cfg(unix)]by @cakebaker in #14109 - stat: reject missing operand by clap by @oech3 in #14152
- stat: print "Block size" in file system mode by @Socialpranker in #14188
stdbuf
- stdbuf: move LIBSTDBUF_DIR from config.toml for crate.io by @oech3 in #13889
- stdbuf: extract error message from OS & strip errno by @oech3 in #13955
- stdbuf: fix tmpdir leak by @Ecordonnier in #14059
tac
- tac: read regular files instead of mmap to avoid SIGBUS on truncation by @DarthStrom in #12971
- tac: replace io::copy with fast_copy by @oech3 in #13837
- tac: simplify error propagation by @Devel08 in #14083
tail
- tail: warn when --pid=0 is ignored by @wtcpython in #13572
- tail: reduce a nest by @oech3 in #13918
- tail: avoid a double allocation per reverse chunk by @haydonryan in #13919
- tail: remove overhead by stat by @oech3 in #14129
- tail: do not abort on -c +N when the start offset is past the seek limit by @SAY-5 in #14091
- tail: replace same-file with rustix and drop the dependency by @wtcpython in #14208
tee
- tee: show_err instead of writing directly in stderr and strip error by @Devel08 in #14125
- tee: align error message with GNU by @oech3 in #14134
test
- test: support -N, -G and -O on Windows by @sylvestre in #13658
- test: implement -ef, -t, -h/-L, -r, -w and -x on Windows by @nikolalukovic in #14030
touch
- touch: support timestamps on WASI by @DePasqualeOrg in #13803
- touch: move platform-specific code into platform/ by @sylvestre in #13906
- touch: Fix leap second year overflow by @mtvb in #14214
tr
true
truncate
- truncate, paste, uniq: let a repeated option override the earlier one by @arbelonson-source in #14258
tsort
- tsort: include filename in error message by @abhijeetvichare76 in #14253
uname
- uname: add -A/--all-labeled, following GNU master by @sylvestre in #13912
- uname: move label separators into locale strings for -A/--all-labeled by @sylvestre in #13954
unexpand
- unexpand: simplify loop by while let by @oech3 in #13876
- unexpand: remove overhead of stat call by @oech3 in #14108
- unexpand: accept a blank as a tab-list separator like GNU by @AlejandroCoronadoN in #14057
uniq
- uniq: simplify loop by while by @oech3 in #13908
- uniq: accept a repeated -D/--all-repeated, last one wins by @AlejandroCoronadoN in #13898
uptime
- uptime: remove /proc dependency from more targets by @oech3 in #13293
- uptime: windows implementation by @nikolalukovic in #13874
- uptime: follow up of #13874 by @sylvestre in #14024
- uptime: exclude Android from utmpx paths by @sylvestre in #14081
- uptime: disable some tests on Android by @cakebaker in #14097
- uptime: fix cfg for get_uptime by @xtqqczze in #14201
who
- who: do not abort on a stdout write error with -q by @costajohnt in #13952
yes
- yes: catch 2nd+ splice's error by @oech3 in #13840
- yes: deadlock fix by @mtvb in #14210
- yes: simplify if block by @oech3 in #14218
Error Diagnostics
- uucore: translate symbolic mode parsing errors by @sylvestre in #13789
- Introduce ariadne to provide better error messages + chmod support by @sylvestre in #13785
- Refactor a bit uucore/diag by @sylvestre in #13825
- mkdir: point at the failing part of an invalid mode by @sylvestre in #13826
- mkfifo: point at the failing part of an invalid mode by @sylvestre in #13827
- mknod: point at the failing part of an invalid mode by @sylvestre in #13828
- install: point at the failing part of an invalid mode by @sylvestre in #13829
- expr, tr, sort, numfmt: point a caret at the argument that is at fault by @sylvestre in #13929
- uucore: locate diagnostic operands by argument, not by text by @sylvestre in #13930
- diagnostics: label carets only when they add, and span format errors by @sylvestre in #13931
- diagnostics: let the caret rendering be compiled out by @sylvestre in #13932
- diagnostics: localize the format, checksum and advice-line strings by @sylvestre in #13933
- diagnostics: point inside quoted arguments, share the locating by @sylvestre in #13934
- env, cut, head, tail, truncate: point at the failing part of a value by @sylvestre in #13935
- split: point the caret at the failing part of a SIZE by @sylvestre in #14008
- shred: point the caret at the failing part of a SIZE by @sylvestre in #14009
- stdbuf: point the caret at the failing part of a buffering mode by @sylvestre in #14010
- sort: point the caret at the failing part of the -S size by @sylvestre in #14011
- od: point the caret at the failing part of a SIZE by @sylvestre in #14012
- seq: point the caret at the failing part of a format by @sylvestre in #14013
- dd: point the caret at the failing part of an operand by @sylvestre in #14014
- stat: point the caret at the failing directive of a format by @sylvestre in #14015
- join: point the caret at the failing field of -o by @sylvestre in #14016
- uucore: keep the usage hint when a caret replaced the message by @sylvestre in #14017
- uucore: share the caret diagnostic plumbing across the utilities by @sylvestre in #14068
- Improve the modern error message + add UUTILS_DIAG to control it by @sylvestre in #14195
- csplit: use the modern error diag by @sylvestre in #14236
- ls/df//du: use modern reporting too by @sylvestre in #14237
- uucore: write each diagnostic in a single stderr call by @haydonryan in #14220
Performance (PGO)
- perf: PGO release builds - up to 31% faster on Linux x86_64/aarch64 by @sylvestre in #14235
- Enable PGO on Mac builds too by @sylvestre in #14243
- build-pgo.sh: drop wrong comment by @oech3 in #14268
- build-pgo.sh: instrument with the same LTO settings as the final build by @sylvestre in #14279
- ci: build the published macOS and Windows artifacts with PGO by @sylvestre in #14246
Security
- mv,cp: fix xattr TOCTOU by using file descriptor-based operations by @sylvestre in #10545
uucore
- uucore: fix parse_size overflow on a large
%size by @MsfPablo in #13742 - uucore: fix clippy::match_same_arms without => _, by @oech3 in #13831
- uucore::pipes: simplify by @oech3 in #13858
- uucore::pipes::drain_pipe: catch 2nd+ splice's error by @oech3 in #13859
- encoding.rs: simplify many match by @oech3 in #14096
- validate.rs: simplify errors by @oech3 in #14099
- uucore, cat: remove winapi-util dependency in favor of windows-sys and std by @wtcpython in #14110
- validate.rs: extract actual error message from OS by @oech3 in #14098
- uucore: rebuild embedded locales when the consumer's dependencies change by @sylvestre in #14233
- fsext: do not confuse f_bsize with f_frsize on Linux by @Socialpranker in #14192
Testing
- uutests: add stderr_as_displayed to compare terminal output by @sylvestre in #13843
- Bench drop runner sensitive benches by @sylvestre in #13760
- tests: replace GNU-derived material with original coverage by @sylvestre in #14004
- dd: move the test-only parse shim into the unit tests by @sylvestre in #14039
- tests: use convenience functions to ensure empty output by @cakebaker in #14115
- improve the env fuzzer by @sylvestre in #14173
Code Quality & Cleanup
- coreutils: remove invalid fallback for symlinks from binary_path by @oech3 in #13088
- simplify return None by @oech3 in #13776
- simplify return None by @oech3 in #13793
- use std::io::Result<> instead of Result<,std::io::Error> by @oech3 in #13811
- fix unused_qualifications lint by @xtqqczze in #13814
- uufuzz: simplify match by @oech3 in #13907
- clippy: fix drain_collect lint by @xtqqczze in #14048
- clippy: fix needless_late_init lint by @xtqqczze in #14050
- clippy: fix chunks_exact_to_as_chunks lint by @xtqqczze in #14046
- remove rust-version from fuzz by @oech3 in #14095
- clippy: add deprecation comment for
from_iter_instead_of_collectlint by @cakebaker in #14062 - clippy: add
renamed_and_removed_lintssetting by @cakebaker in #14064 - remove unnecessary .as_fd() by @oech3 in #14265
- drop unused code by @sylvestre in #14269
- avoid unnecessary clone by @xtqqczze in #14250
CI & Build
- publish.sh: adjust to the new API by @sylvestre in #13761
- fetch-gnu.sh: remove unnecessary 2 spaces by @oech3 in #13792
- ci: trust preinstalled Homebrew taps on macOS by @xtqqczze in #13782
- uucore/Cargo.toml: don't guard openssl by unix by @oech3 in #13824
- fix cspell by @oech3 in #13861
- fetch-gnu.sh: remove incorrect exit 0 (pass tests/cat/splice) by @oech3 in #13860
- Revert "ci: trust preinstalled Homebrew taps on macOS" by @xtqqczze in #13875
- Update automake download URL and add checksum verification by @sylvestre in #13922
- ci: add copilot-code-review.yml to declare a runner for Copilot code review by @sylvestre in #13942
- gnu: list the tests excluded from the pass/fail percentages by @sylvestre in #13891
- Add empty-backup-suffix.sh to backport list by @sylvestre in #13973
- add misc/getopt_vs_usage.sh to the GNU unfixable tests by @sylvestre in #13979
- wasm: add expr & test to feat_wasm by @sylvestre in #13981
- gnu/usage_vs_refs.sh checks that all options appear in GNU's texi docs. by @sylvestre in #13997
- Cargo.toml: move 3 utils to feat_Tier1 by @oech3 in #14027
- GnuTests: remove LD_PRELOAD from dd/fail-ftruncate-fstat by @oech3 in #14053
- CI: pin the GNU test comparison to the latest main reference run by @sylvestre in #14112
- ci: add check for empty output assertions by @cakebaker in #14116
- CI: don't use the lagging server-side status filter by @sylvestre in #14137
- build cygwin cksum with openssl on the CI by @oech3 in #14079
- CI: remove unnecessary rust-toolchain by @oech3 in #14142
- ci: fix benchmarks workflow to only run on changed crates by @BipulLamsal in #14124
- try to fix publishing tag/latest-commit by @oech3 in #14143
- GnuTests: fix hardcoded pathes to GNU executables by @oech3 in #14190
- build: use "selinux" instead of "feat_selinux" feature name by @xtqqczze in #12431
Documentation
- Add AGENTS.md - not a statement for or against AI agents by @sylvestre in #13790
- add the 0.10.0 release notes by @sylvestre in #13762
- docs: recommend gh stack for large changes by @sylvestre in #13835
- test: explain more typical errors by @sylvestre in #13844
- docs: remove
-wflag ofcutfrom the extensions by @cakebaker in #13962 - docs/extensions: list utils alphabetically by @cakebaker in #13312
- man pages: fix typo, merged lists and wrong indentations by @matttbe in #14038
- Document the PGO builds by @sylvestre in #14277
Platform Support
- wasi: clean up core platform abstractions by @DePasqualeOrg in #12503
- uucore: fix uptime build on Android and wasm32 by @sylvestre in #14058
- tests: enable cat integration coverage on WASI by @DePasqualeOrg in #13802
- simplify by cfg(windows) by @oech3 in #14224
- prefer target_vendor apple to cover iOS by @oech3 in #14226
- cfg out uucore::signals on fuchsia by @xtqqczze in #14166
- order target_vendor before target_os in cfg by @xtqqczze in #14230
- stty: gate by target support by @xtqqczze in #14238
- order target_vendor before target_os in cfg by @xtqqczze in #14240
- chgrp: gate by target support by @xtqqczze in #14242
Dependency Updates
- chore(deps): update rust crate blake3 to v1.8.6 by @renovate[bot] in #13765
- chore(deps): update rust crate clap_mangen to v0.3.1 by @renovate[bot] in #13759
- build(deps): update rust crates by @xtqqczze in #13763
- chore(deps): update rust crate clap_mangen to v0.3.2 by @renovate[bot] in #13783
- chore(deps): update rust crate clap_complete to v4.6.9 by @renovate[bot] in #13781
- chore(deps): update rust crate thiserror to v2.0.20 by @renovate[bot] in #13807
- chore(deps): update endbug/add-and-commit action to v11 by @renovate[bot] in #13817
- chore(deps): update rust crate ctor to v1.0.13 by @renovate[bot] in #13838
- chore(deps): update rust crate bstr to v1.13.1 by @renovate[bot] in #13846
- chore(deps): update rust crate clap_mangen to v0.3.3 by @renovate[bot] in #13904
- chore(deps): update rust crate icu_datetime to v2.3.0 by @renovate[bot] in #13940
- chore(deps): update rust crate icu_collator to v2.3.0 by @renovate[bot] in #13944
- chore(deps): update dawidd6/action-download-artifact action to v22 by @renovate[bot] in #13961
- chore(deps): update dawidd6/action-download-artifact action to v23 by @renovate[bot] in #13963
- chore(deps): update rust crate cc to v1.4.3 by @xtqqczze in #13971
- chore(deps): update rust crate similar to v3.2.0 by @renovate[bot] in #13984
- chore(deps): update rust crate blake2b_simd to v1.0.5 by @renovate[bot] in #14035
- chore(deps): update rust crate blake3 to v1.8.7 by @renovate[bot] in #14036
- fix(deps): refactor RustCrypto crates package configuration by @xtqqczze in #14037
- Cargo.lock: remove
arrayrefby @cakebaker in #14041 - chore(deps): update rust crate icu_locale to v2.3.1 by @renovate[bot] in #14055
- chore(deps): update rust crate icu_collator to v2.3.1 by @renovate[bot] in #14054
- chore(deps): update rust crate icu_provider to v2.3.1 by @renovate[bot] in #13941
- chore(deps): update dawidd6/action-download-artifact action to v24 by @renovate[bot] in #14061
- Cargo.toml: remove unused exacl workspace dependency by @wtcpython in #14089
- chore(deps): update rust crate dns-lookup to v4 by @renovate[bot] in #14194
Version Management
- prepare release 0.11.0 by @sylvestre in #14247
New Contributors
- @MsfPablo made their first contribution in #13742
- @0Whisperos made their first contribution in #13787
- @MuntasirSZN made their first contribution in #13770
- @Angadi56 made their first contribution in #13443
- @floze-the-genius made their first contribution in #13852
- @Aisha630 made their first contribution in #13480
- @haydonryan made their first contribution in #13897
- @bolverk made their first contribution in #13800
- @costajohnt made their first contribution in #13952
- @AH64-dll made their first contribution in #13969
- @m0g3r made their first contribution in #13949
- @fly1d made their first contribution in #13982
- @AlejandroCoronadoN made their first contribution in #13898
- @myunbin made their first contribution in #14022
- @luantaraschi made their first contribution in #14045
- @Gelbpunkt made their first contribution in #12072
- @mtvb made their first contribution in #14123
- @nagendramohan made their first contribution in #14076
- @chrboe made their first contribution in #12143
- @arcusbuilds made their first contribution in #14005
- @MadeNavaneeth made their first contribution in #14144
- @Air-crypto made their first contribution in #13857
- @Socialpranker made their first contribution in #14189
- @arbelonson-source made their first contribution in #14258
- @abhijeetvichare76 made their first contribution in #14253
- @ARMeeru made their first contribution in #14168
Full Changelog: 0.10.0...0.11.0

