release: v1.4.0 — Trash by default, bigfiles top, TUI delete + dupes and subtree - #5
Merged
Conversation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
v1.4.0 release. The headline change is
bigfilesis now safe by default —deleteanddupes --deletemove files to your OS Trash unless you opt into permanent removal with--force. Plus a newbigfiles topsubcommand, two TUI affordances, and a README refresh.bigfiles deleteandbigfiles dupes --delete.--forceopts 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.dto 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--forceif you need permanent. Tree mutates in place — parent sizes propagate up to root on success.rto re-scan. Exits the TUI briefly, runs the spinner, re-enters with fresh data.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.topsection, expanded TUI keybinding list, new flag tables fordupes/delete/top, updated Caveats andWhat it doesbullets.Cargo.toml: version →1.4.0.Why
User-trust unlock. The single biggest objection to
bigfiles deletein 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 topadds 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 Nwhich still requires the category breakdown. A first-class subcommand makes it obvious and scriptable.The two TUI affordances close the gap with
ncdufor 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— unchangedanalyzer::analyze/analyzer::sort_summaries— unchangedcache::HashCache— unchangedaudit::analyze/audit::render— unchangedNew surface:
destructive::{RemovalMode, RemovalError, remove_file, mode_verb, mode_short}renderer::{render_top_flat, render_top_flat_to_string}tui::ExitReasonwalker::FileEntrynow derivesCloneSignature 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 returnsResult<ExitReason>instead ofResult<()>so the CLI can loop onrto refresh.CLI flags added:
bigfiles dupes --force(opts into permanent delete; meaningless without--delete)bigfiles delete --force(opts into permanent delete)bigfiles top [-n N]License note
Added the
trashcrate (Apache-2.0 + MIT). Nodeny.tomlchange required — both licenses are already in the allow list.Test plan
cargo fmt --all -- --check— cleancargo clippy --all-targets -- -D warnings— cleancargo build --release— cleancargo test --release --lib— 61 lib tests pass (was 53 onmain; +8 acrossdestructiveandrenderer)cargo deny check bans licenses sources advisories— cleanbigfiles delete ~/tmp-stalemoves selected files to Trash;--forcedeletes permanently; refuses on a fake-trash environment with a clear--forcehinttop):bigfiles top ~/Documents/bigfiles -n 5lists the five biggest files in size-desc orderbigfiles tui,dopens the yellow confirm bar;yremoves the node from the tree and updates parent sizes; cancel worksDon a directory shows the dupes popup; warm-cache repeat runs are near-instant; scrolling andEscworkrexits the TUI, the spinner runs, the TUI re-enters with fresh tree dataAfter merge
v1.4.0and publish to crates.io (cargo publish).