prepare job failed: git-cliff --latest crashed with 'trim_start_matches on
null' because the checkout was shallow (no tags/history) so no release existed.
- checkout prepare with fetch-depth: 0 + fetch-tags so git-cliff sees full
history and tags (also fixes an otherwise-truncated CHANGELOG)
- generate release notes with --unreleased --tag v$VERSION instead of --latest:
--latest selected the previous real tag (stale notes); --unreleased --tag
renders the version being released
The old manual dist/build/* scripts and dist/{deb,rpm}.sh are superseded by the
automated release workflow. Add the chocolatey package consumed by release.yml.
Pin every action to a commit SHA whose tag comment matches (verified via gh api),
add least-privilege permissions, set persist-credentials: false, and replace the
archived actions-rs/cargo with a plain cargo test. zizmor clean at default persona.
Single workflow_dispatch (version, dry_run) that bumps versions, regenerates
CHANGELOG via git-cliff, rebuilds site CSS, builds all targets, creates the
GitHub release, updates the Homebrew tap and publishes Chocolatey.
- dist/release/bump_version.sh: version replacer across all tracked locations (+tests)
- .github/workflows/release.yml: prepare -> build matrix -> homebrew/release -> choco
- retire build-artifacts.yml (merged into release.yml)
- Linux builds via cargo-zigbuild (old glibc) for broad compatibility
Some non-compliant FTP servers (e.g. LiteSpeed) include a self-reference
to the listed directory in the LIST response, causing the current folder
to appear as a duplicate entry in the explorer.
Closes#410
Upgrade tuirealm (3.x -> 4.0.0), tui-realm-stdlib (3 -> 4), tui-term
(0.2 -> 0.3). Apply all breaking changes from the 4.0 migration guide
across the termscp UI.
Key changes:
- Root-level re-exports removed; imports moved to module-qualified
paths (`tuirealm::application`, `::component`, `::event`, `::props`,
`::state`, `::subscription`, `::listener`, `::ratatui`). Same for
stdlib component types (`tui_realm_stdlib::components::*`).
- `MockComponent` trait renamed to `Component`; old `Component` trait
renamed to `AppComponent`. `#[derive(MockComponent)]` is now
`#[derive(Component)]`. `Component::on` now takes `&Event<_>`.
- `TextSpan` replaced with `SpanStatic`/`LineStatic`/`TextStatic`
(ratatui-based); tuple `(String, Alignment)` titles replaced with
the new `Title` builder; `Alignment` split into
`HorizontalAlignment`/`VerticalAlignment`; stdlib components use
`.alignment_horizontal` instead of `.alignment`.
- `State::One`/`PropPayload::One` -> `Single`. `CmdResult::None`
-> `NoChange`. `Props::get_or` removed; `Props::get` now returns a
borrowed `Option<&AttrValue>` (call sites switched to
`.and_then(AttrValue::as_*)`). `Component::query` returns
`Option<QueryResult<'a>>`.
- `Attribute::HighlightedColor` -> `HighlightStyle` (a full `Style`).
`.highlighted_*` helpers renamed to `.highlight_*`.
- `PollStrategy::UpTo(n)` now requires a `Duration`; tick timeout moved
from `EventListenerCfg::poll_timeout` into `PollStrategy`.
- `TerminalBridge` removed; `Context` now holds
`CrosstermTerminalAdapter` directly and enables raw mode + alternate
screen explicitly. The `TerminalAdapter` trait is imported where its
methods are used.
- `Update` trait removed; activity `update` methods are plain inherent
functions.
- `ProgressBar` replaced by stdlib `Gauge`. Paragraph `.wrap` renamed
to `.wrap_trim`; `.text` now takes an `Into<Text>`. Stdlib `List` row
items are now individual lines (`Vec<Span>` per row) rather than a
`Table` of spans; custom `FileList`/`Log` convert between the two
models.
- Radio builders drop `.foreground(color)` so unselected items render
with the terminal default foreground, and set
`highlight_style(Style::default().fg(color).add_modifier(REVERSED))`
so the selected entry is visibly highlighted only with the theme
color.
- Custom `FileList` keeps the selected row highlighted with the full
highlight style when focused and falls back to a foreground-only
style when unfocused.
- Theme loading is now backwards compatible: `Theme` uses a custom
`Deserialize` through an intermediate `ThemeFile` with optional
fields, so missing keys, unknown values or legacy aliases
(`transfer_progress_bar_full`/`_partial`) fall back to defaults on a
per-field basis instead of failing the whole load.
The old 1% progress threshold caused the UI to appear frozen on large
files (e.g. 1GB) because many read/write iterations passed between
redraws. Switching to a 100ms time-based interval ensures consistent
UI responsiveness regardless of file size.