Skip to content

chore(deps): hold unicode-width below 0.2.3 so ratatui keeps sound marks one cell wide - #717

Merged
hakula139 merged 2 commits into
mainfrom
chore/hold-unicode-width
Oct 28, 2026
Merged

hakula139 merged 2 commits into
mainfrom
chore/hold-unicode-width

Conversation

@hakula139

@hakula139 hakula139 commented Oct 28, 2026 •

Copy link
Copy Markdown
Owner

Summary

Renovate's #711 bumps unicode-width to 0.2.3, and every Rust and Nix job then fails testing::tests::buffer_rows::read_an_offset_area_and_skip_the_cells_wide_symbols_cover, which reads ["界ガa", " "] where it expects ["界ガa ", " "]. The new width table is correct, but ratatui double counts with it. ratatui-core 0.1.2 adds a cell to each halfwidth katakana sound mark (U+FF9E, U+FF9F) in CellWidth (ratatui/ratatui#2499) because unicode-width used to count them as zero-width, and unicode-width 0.2.3 counts them as one cell itself (unicode-rs/unicode-width#89). Together they lay ガ out over three cells while terminals draw it in two, so ratatui reserves a cell after each mark that the terminal never draws. This PR holds unicode-width at 0.2.2, where ratatui paints each mark one cell wide.

The hold has a cost: ox's own measures, such as wrap.rs and the ox --list padding, still count each mark as zero cells, as on main, one cell less than ratatui and the terminal draw. unicode-width 0.2.3 would fix ox --list, which writes to the terminal directly, but not the TUI, since ratatui would then paint one cell more than wrap.rs measures. Both gaps close once a fixed ratatui lets the bound go.

  • Bound: Cargo.toml requires unicode-width = ">=0.2, <0.2.3", so cargo update and lock file maintenance stay on 0.2.2. ratatui-core 0.1.2 is its latest release, ratatui's main still adds the cell, and its manifest accepts any unicode-width from 0.2.0, so no ratatui update fixes the combination yet.
  • Renovate: Renovate widens a range with a < bound by default, and a local dry run proposed >=0.2, <0.2.4 in the Rust dependencies group. A packageRules entry with allowedVersions: "<0.2.3" stops that, so Renovate's rebase of chore(deps): update rust crate xattr to v1.7.0 #711 leaves only xattr 1.7.0.
  • Upstream: No ratatui issue or PR reports the double count yet. Drop the unicode-width bound once ratatui counts halfwidth sound marks once #718 tracks dropping the bound once a ratatui-core release counts each mark once.

Test plan

  • With chore(deps): update rust crate xattr to v1.7.0 #711's lock on main (unicode-width 0.2.3, xattr 1.7.0), cargo test -p ox-tui --lib testing::tests fails with the same ["界ガa", " "] as CI
  • With the bound, cargo update -p unicode-width locks nothing, and a full cargo update changes only xattr 1.6.1 → 1.7.0, on which cargo test --workspace passes
  • renovate-config-validator --strict --no-global .github/renovate.json passes, and renovate --platform=local --dry-run=lookup --enabled-managers=cargo proposes no unicode-width update and keeps xattr 1.7.0 in renovate/rust-dependencies
  • cargo fmt --check, cargo build, cargo clippy --all-targets, cargo clippy, and cargo doc --no-deps pass
  • cargo llvm-cov: 3543 tests pass with 99.17% line coverage
  • cargo deny check passes: advisories, bans, licenses, and sources ok
  • pnpm format, pnpm lint, and pnpm spellcheck pass
  • CI passes on every job at 64f1c61, including Rust and Nix on every platform, Lint, MSRV, and the release builds

…rks one cell wide

ratatui-core 0.1.2 adds a cell to each halfwidth katakana sound mark
(U+FF9E, U+FF9F) because unicode-width used to count them as zero-width.
unicode-width 0.2.3 counts them as one cell itself, so with both,
ratatui lays "ガ" out over three cells while terminals draw it in two,
which fails the buffer_rows test on every platform in #711.

Bound unicode-width below 0.2.3 so cargo update and lock file
maintenance stay on 0.2.2, and hold Renovate to the same bound, since
Renovate otherwise widens the range to admit 0.2.3.
@hakula139 hakula139 added dependencies Applied to PRs that update dependencies, by Renovate or by hand chore Maintenance with no user-facing change, such as tooling or housekeeping (chore) labels Oct 28, 2026
@hakula139 hakula139 self-assigned this Oct 28, 2026
@codecov

codecov Bot commented Oct 28, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.

📢 Thoughts on this report? Let us know!

@hakula139
hakula139 merged commit 9cee747 into main Oct 28, 2026
17 checks passed
@hakula139
hakula139 deleted the chore/hold-unicode-width branch October 28, 2026 07:15
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

chore Maintenance with no user-facing change, such as tooling or housekeeping (chore) dependencies Applied to PRs that update dependencies, by Renovate or by hand

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant