github uutils/coreutils 0.8.0

5 hours ago

Rust Coreutils 0.8.0 Release:

We are excited to announce the release of Rust Coreutils 0.8.0 — a major release featuring significant performance gains across core utilities, expanded WebAssembly (WASI) support with a brand-new online playground, and continued hardening against edge-case panics, /dev/full aborts and start of a large-scale migration from nix to rustix** for lower-level syscall safety!


GNU Test Suite Compatibility:

Result 0.7.0 0.8.0 Change 0.7.0 to 0.8.0 % Total 0.7.0 % Total 0.8.0 % Change 0.7.0 to 0.8.0
Pass 629 630 +1 94.59% 94.74% +0.15%
Skip 13 14 +1 1.95% 2.11% +0.16%
Fail 23 21 -2 3.46% 3.16% -0.30%
Error 0 0 0 0% 0% 0%
Total 665 665 0

GNU testsuite evolution


Highlights:

  • GNU Compatibility & Upstream Collaboration

    • 630 passing GNU tests, with 2 fewer failures than 0.7.0
    • Continued contributing tests and bug reports upstream to GNU coreutils, strengthening both projects
    • Our compatibility work regularly uncovers edge cases in GNU itself, leading to fixes on both sides
  • nixrustix Migration

    • Replaced nix crate with rustix across cat, df, wc, tty, tsort, tail, touch, date, mkdir, and uucore
    • Reduced range of unsafe code in hostname, logname, who, and nice
    • uucore: uses rustix for splice(), restricted to Linux
  • Performance Improvements

    • uucore: Share fluent resources between threads — dd perf +45%
    • uucore: Call rt_sigaction once instead of 62 times — faster startup
    • ls: Replace recursion with iterative depth-first search; remove many unnecessary allocations
    • sort: Performance improvements across sorting paths
    • wc: Improved -c performance with unextended pipe input (Linux)
    • cat: Avoid unnecessary pipe() when stdout is already a pipe; don't lock stdout before splice()
    • dd: Avoid zero-filling buffer at read_and_discard
    • tee: Increased buffer size for large input; removed Box and dyn overhead
    • numfmt: Protect name from argv[0] — +3% perf
    • pr: Avoid String conversion when storing lines to print
    • true/false/echo: Avoid uu_app().render_version() for smaller binary
  • WebAssembly (WASI) Support & Online Playground

    • New: Online Playground — try Rust Coreutils directly in your browser, powered by WebAssembly (blog post)
    • Added WASI support for 70+ utilities including ls, head, cat, cp, mv, sort, tail, and many more
    • Embedded all locales in the WASI binary
    • Added WASI platform stubs for FileInformation and IO module in uucore
    • Single-threaded sort path for WASI; disabled rayon on WASI
  • Platform Support

    • NetBSD: Multiple fixes, stdbuf support, expanded CI coverage
    • pathchk: Now builds for Windows
    • wc: Cross-platform building and 32-bit support
    • stdbuf: Fixed Cygwin cfg block; detect unsupported target at build time
    • uucore(fs): Made display_permissions_unix cross-platform
    • uucore: Support realtime signals (RTMIN/RTMAX) in signal_by_name_or_value
    • uucore: Permit D as decimal suffix modifier for GNU compatibility
  • Documentation & Manpages

    • Manpages now include TL;DR examples, links to the source code, and open bugs — see for example ls
    • Manpages are available in multiple languages including French and Spanish, refreshed daily
    • Added manpage linting in CI to catch formatting issues early
    • TL;DR attribution and disclaimer are now translatable
  • Contributions: This release was made possible by 13 new contributors joining our community


Call to Action:

Try it in your browserOnline Playground powered by WebAssembly
Help us translate — Contribute to Rust Coreutils on Weblate or TL;DR pages
Sponsor us on GitHub to accelerate development: github.com/sponsors/uutils

What's Changed

cat

chown

cksum

coreutils

cp

cut

date

dd

df

env

expand

expr

  • expr: fix eager evaluation of parenthesized dead branches by @can1357 in #11395

factor

head

install

ln

ls

mkdir

  • mkdir: replace libc and unsafe by rustix by @oech3 in #11647

nice

  • nice: Remove unsafe and reduce bin size by @oech3 in #11489

numfmt

od

pr

  • pr: don't convert to String when storing lines to print by @venoosoo in #11327

sort

split

  • split: preserve non-UTF-8 bytes in output filename generation by @can1357 in #11397

stdbuf

stty

  • stty: Fix incorrect ppc64el type presumption by @BAMF0 in #11284

sync

  • sync: fix exit code when fcntl failed & 2>/dev/full abort by @oech3 in #11508
  • sync: fall back to full sync when --file-system has no operands by @can1357 in #11393

tail

tee

timeout

  • timeout: return timed-out status after kill grace period by @can1357 in #11392
  • feat(timeout): add benchmarking support with divan by @mattsu2020 in #9733

touch

tr

  • tr: reject unknown character classes during sequence parsing by @can1357 in #11398
  • tr: fix graph/print character class mapping by @can1357 in #11405

true/false

  • true, false, echo: avoid uu_app().render_version() for smaller binary by @oech3 in #11362

tsort

tty

wc

yes

uucore

  • uucore: tr, nice -n . 2>/dev/full does not abort by @oech3 in #10762
  • uucore: share a fluent resource between threads - dd perf + 45% by @oech3 in #11220
  • uucore: Permit 'D' as a decimal suffix modifier in size parsing for GNU compatibility by @aweinstock314 in #11354
  • uucore: use rustix'splice & restrict to Linux by @oech3 in #11566
  • uucore: add WASI support for FileInformation and io module by @sylvestre in #11568
  • uucore: pipes.rs replace != with > by @oech3 in #11629
  • uucore: add a function returning /dev/null to use splice() for wc,dd,tail by @oech3 in #11601
  • uucore: add missing feature of rustix by @oech3 in #11632
  • uucore: support realtime signals (RTMIN/RTMAX) in signal_by_name_or_value by @kevinburkesegment in #11425
  • uucore(fs): make display_permissions_unix cross-platform by @kaladron in #11538
  • uucore: drop an unused function by @oech3 in #11460
  • perf(uucore): call rt_sigaction once not 62 times by @danielzgtg in #11350
  • utmpx.rs: Remove duplicated const by @oech3 in #11323

uudoc

CI & Build

Documentation

  • docs(sort): fix random number generation example by @xtqqczze in #11295
  • docs(performance): Use gnuls where ls is uutils by @danielzgtg in #11342
  • ls,pr: wrap angle-bracket placeholders in backticks to fix mdbook HTML warnings by @sylvestre in #11520
  • CONTRIBUTING.md: drop outdated hint, add policies and links by @oech3 in #11433
  • arch, uname, Cargo.toml: update outdated info by @oech3 in #11556
  • fr-FR: fix anglicisms (supporté→pris en charge, drapeau→option, removed→supprimé) by @sylvestre in #11651
  • Remove useless translations by @sylvestre in #11652

Code Quality & Cleanup

Version Management

Dependency Updates

  • chore(deps): update actions/upload-artifact action to v7 by @renovate[bot] in #11275
  • chore(deps): update dawidd6/action-download-artifact action to v16 by @renovate[bot] in #11277
  • chore(deps): update rust crate tempfile to v3.27.0 by @renovate[bot] in #11289
  • chore(deps): update reactivecircus/android-emulator-runner action to v2.36.0 by @renovate[bot] in #11293
  • chore(deps): update rand and related crates to version 0.10 by @xtqqczze in #11172
  • chore(deps): update dawidd6/action-download-artifact action to v17 by @renovate[bot] in #11300
  • chore(deps): update rust crate nix to 0.31.2 by @xtqqczze in #11301
  • chore(deps): update rust crate bitflags to 2.11.0 by @xtqqczze in #11303
  • chore(deps): update rust crate getrandom to 0.4.2 by @xtqqczze in #11304
  • chore(deps): update rust crate clap to v4.6.0 by @renovate[bot] in #11305
  • chore(deps): update rust crate clap_complete to v4.6.0 by @renovate[bot] in #11306
  • chore(deps): update rust crate clap_mangen to v0.2.33 by @renovate[bot] in #11308
  • chore(deps): update rust crate console to v0.16.3 by @renovate[bot] in #11319
  • chore(deps): update dawidd6/action-download-artifact action to v18 by @renovate[bot] in #11322
  • chore(deps): update reactivecircus/android-emulator-runner action to v2.37.0 by @renovate[bot] in #11324
  • chore(deps): update rust crate console to v0.16.3 by @xtqqczze in #11331
  • chore(deps): update rust crate pretty_assertions to v1.4.1 by @xtqqczze in #11332
  • chore(deps): update nick-fields/retry action to v4 by @renovate[bot] in #11426
  • chore(deps): update rust crate zip to v8.3.0 by @renovate[bot] in #11418
  • chore(deps): update rust crate itoa to v1.0.18 by @renovate[bot] in #11424
  • chore(deps): update dawidd6/action-download-artifact action to v19 by @renovate[bot] in #11382
  • chore(deps): update rust crate zip to v8.3.1 by @renovate[bot] in #11446
  • chore(deps): update endbug/add-and-commit action to v10 by @renovate[bot] in #11459
  • chore(deps): update rust crate zip to v8.4.0 by @renovate[bot] in #11462
  • chore(deps): update rust crate terminal_size to v0.4.4 by @renovate[bot] in #11468
  • chore(deps): update davidanson/markdownlint-cli2-action action to v23 by @renovate[bot] in #11501
  • chore(deps): update codecov/codecov-action action to v6 by @renovate[bot] in #11509
  • chore(deps): update rust crate clap_mangen to 0.3 by @renovate[bot] in #11527
  • chore(deps): update rust crate uutils_term_grid to 0.8 by @renovate[bot] in #11267
  • chore(deps): update rust crate rustc-hash to v2.1.2 by @renovate[bot] in #11533
  • chore(deps): update rust crate ctor to 0.8.0 by @renovate[bot] in #11528
  • Bump sm3 & add crates to skip list by @cakebaker in #11535
  • Bump icu_* crates from 2.1.1 to 2.2.0 & fix deprecation warnings by @cakebaker in #11590
  • chore(deps): update rust crate blake3 to v1.8.4 by @renovate[bot] in #11550
  • chore(deps): update rust crate platform-info to v2.1.0 by @renovate[bot] in #11552
  • chore(deps): update rust crate zip to v8.5.0 by @renovate[bot] in #11586
  • chore(deps): update rust crate icu_provider to v2.2.0 by @renovate[bot] in #11585
  • fix(deps): update rust crate similar to v3 by @renovate[bot] in #11588
  • chore(deps): update rust crate icu_calendar to v2.2.1 by @renovate[bot] in #11600
  • chore(deps): update dawidd6/action-download-artifact action to v20 by @renovate[bot] in #11608
  • chore(deps): update rust crate libredox to 0.1.15 by @xtqqczze in #11625

New Contributors

Full Changelog: 0.7.0...0.8.0

Don't miss a new coreutils release

NewReleases is sending notifications on new releases.