Skip to content

core: track stable Rust APIs above MSRV 1.96 for a future bundled bump #558

Description

@bug-ops

Description

Periodic sweep of stable Rust APIs released after the current MSRV (1.96.0), run against the current stable toolchain (1.98.0), per the rust-modern-apis reference (covers 1.89-1.98).

No dependency in the workspace forces a bump: the highest rust-version among resolved dependencies is sevenz-rust2 at 1.93, well below the current 1.96 MSRV.

Findings

A full scan of crates/*/src (~60k lines) against the modern-APIs trigger list (Duration minute/hour math, with_extension used as suffix-append, file_stem on compound extensions, Ipv4Addr::new/Ipv6Addr::new, checked_*().unwrap(), retain, LazyLock/LazyCell, compare_exchange loops, cfg_if, manual UTF-16 decoding, itoa, atomic transmute, raw Box pointer extraction, try_into().unwrap() for fixed arrays, etc.) turned up exactly one actionable pattern:

path.as_os_str().is_empty() -> path.is_empty() (Path::is_empty(), stabilized in Rust 1.98) at 13 call sites:

  • crates/exarch-cli/src/commands/extract.rs:556
  • crates/exarch-core/src/formats/common.rs:203,206,251,294
  • crates/exarch-core/src/security/hardlink.rs:128
  • crates/exarch-core/src/creation/zip.rs:195
  • crates/exarch-core/src/creation/tar.rs:307
  • crates/exarch-core/src/types/safe_path.rs:149,228
  • crates/exarch-core/src/types/safe_symlink.rs:126
  • crates/exarch-core/src/inspection/list.rs:602,1586

This is a behavior-identical, purely cosmetic simplification. It requires raising MSRV from 1.96.0 to 1.98.0.

Why not act now

The previous MSRV bump (1.93 -> 1.96, #401) was justified by bundling multiple substantive wins together: migrating 151 assert!(matches!(...)) sites to assert_matches! (real diagnostic improvement on test failure) plus applying core::hint::cold_path() to hot/cold branches in QuotaTracker. A single 13-site cosmetic cleanup with no diagnostic, performance, or safety benefit does not clear that bar on its own — bumping MSRV is a breaking change for downstream consumers pinned to older toolchains.

Recommendation

Keep this open as a backlog item. Revisit at the next rust-modern-apis sweep (or whenever another stable-API motivated need for 1.97/1.98 shows up, e.g. a dependency bump or a new pattern in newly added code) and bundle this Path::is_empty() cleanup into that bump instead of raising MSRV for it alone.

Environment

  • Version: exarch 0.6.0 (workspace)
  • Current MSRV: 1.96.0
  • Stable toolchain checked against: 1.98.0

Metadata

Metadata

Assignees

No one assigned

    Labels

    P4Nice-to-have: research ideas, future enhancementsbacklogDeferred — not scheduled for current milestonecoreChanges to exarch-coreenhancementNew feature or request

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions