Skip to content

release: v1.4.0 — Trash by default, bigfiles top, TUI delete + dupes and subtree - #5

Merged
Par-python merged 1 commit into
mainfrom
v1.4
May 20, 2026
Merged

release: v1.4.0 — Trash by default, bigfiles top, TUI delete + dupes and subtree#5
Par-python merged 1 commit into
mainfrom
v1.4

Conversation

@Par-python

Copy link
Copy Markdown
Owner

Summary

v1.4.0 release. The headline change is bigfiles is now safe by defaultdelete and dupes --delete move files to your OS Trash unless you opt into permanent removal with --force. Plus a new bigfiles top subcommand, two TUI affordances, and a README refresh.

  • Send-to-Trash by default for both bigfiles delete and bigfiles dupes --delete. --force opts into permanent deletion. Trash unavailable → operation refuses cleanly and points you at --force (never a silent fallback).
  • bigfiles top <path> [-n N] — flat list of the N largest files (default 20), no category grouping. Pipes well; respects all global filters.
  • TUI d to send to Trash. Yellow confirm bar (y/Enter to confirm, any other key to cancel). Trash-only inside the TUI for safety; use the CLI with --force if you need permanent. Tree mutates in place — parent sizes propagate up to root on success.
  • TUI r to re-scan. Exits the TUI briefly, runs the spinner, re-enters with fresh data.
  • TUI D (capital) for dupes in the highlighted subtree. Scrollable popup; uses the v1.3 hash cache so repeated runs over the same subtree are near-instant.
  • README refreshed end-to-end: Trash phrasing, new top section, expanded TUI keybinding list, new flag tables for dupes/delete/top, updated Caveats and What it does bullets.
  • Cargo.toml: version → 1.4.0.

Why

User-trust unlock. The single biggest objection to bigfiles delete in early feedback was the bold red "files do not go to Trash" warning. Removing that fear converts curious tryers into regular users. Pairs naturally with the v1.3 dupes cache: the workflow "scan, find duplicates, send copies to Trash, recover anything you didn't mean to remove" now works end-to-end without leaving the terminal.

bigfiles top adds a discoverability win — the second-most-common ask after "show me what's on disk" is "just give me the biggest files," and right now that's buried inside --top N which still requires the category breakdown. A first-class subcommand makes it obvious and scriptable.

The two TUI affordances close the gap with ncdu for the daily-driver workflow — delete here, dupes here, refresh here, never leave the TUI.

Backward compatibility

Public API is preserved:

  • dupes::find / dupes::find_with_cache — unchanged
  • analyzer::analyze / analyzer::sort_summaries — unchanged
  • cache::HashCache — unchanged
  • audit::analyze / audit::render — unchanged

New surface:

  • destructive::{RemovalMode, RemovalError, remove_file, mode_verb, mode_short}
  • renderer::{render_top_flat, render_top_flat_to_string}
  • tui::ExitReason
  • walker::FileEntry now derives Clone

Signature changes on internal helpers (not documented public API):

  • dupes::delete_interactive(groups, root)dupes::delete_interactive(groups, root, mode)
  • delete::run(files, stale_years)delete::run(files, stale_years, mode)
  • tui::run(...) now returns Result<ExitReason> instead of Result<()> so the CLI can loop on r to refresh.

CLI flags added:

  • bigfiles dupes --force (opts into permanent delete; meaningless without --delete)
  • bigfiles delete --force (opts into permanent delete)
  • New subcommand: bigfiles top [-n N]

License note

Added the trash crate (Apache-2.0 + MIT). No deny.toml change required — both licenses are already in the allow list.

Test plan

  • cargo fmt --all -- --check — clean
  • cargo clippy --all-targets -- -D warnings — clean
  • cargo build --release — clean
  • cargo test --release --lib — 61 lib tests pass (was 53 on main; +8 across destructive and renderer)
  • cargo deny check bans licenses sources advisories — clean
  • Smoke (Trash): bigfiles delete ~/tmp-stale moves selected files to Trash; --force deletes permanently; refuses on a fake-trash environment with a clear --force hint
  • Smoke (top): bigfiles top ~/Documents/bigfiles -n 5 lists the five biggest files in size-desc order
  • Smoke (TUI delete): in bigfiles tui, d opens the yellow confirm bar; y removes the node from the tree and updates parent sizes; cancel works
  • Smoke (TUI dupes): D on a directory shows the dupes popup; warm-cache repeat runs are near-instant; scrolling and Esc work
  • Smoke (TUI refresh): r exits the TUI, the spinner runs, the TUI re-enters with fresh tree data

After merge

  • Tag v1.4.0 and publish to crates.io (cargo publish).
  • Update the LinkedIn / Reddit posts with the headline: "v1.4 — bigfiles is now safe by default. Send-to-Trash, in-TUI delete, dupes-for-subtree." This is the user-trust story you wanted ammunition for.
  • Cut a short release-note section at the top of the auto-generated GitHub Release describing the four new things and the Trash-by-default behavior change.

@Par-python
Par-python merged commit 19957dc into main May 20, 2026
4 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant