Skip to content

Releases: sniner/fifi

v0.6.0

10 Jun 08:38

Choose a tag to compare

Release v0.6.0

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

v0.5.0

09 Jun 21:16

Choose a tag to compare

Breaking change: --dupes-only output is now strictly NUL-delimited,
as documented — every path is terminated by a NUL byte, making the
stream safe for xargs -0. Previously a newline separated duplicate
groups, which glued adjacent paths together under xargs -0. Group
boundaries are no longer represented in this format; use --json if
you need the grouping. Non-UTF-8 file names now pass through unmangled.

Scans are more trustworthy: directories that could not be entered are
warned about and counted (skipped_dirs in the JSON statistics and the
summary line), duplicate root arguments are scanned once, and the
bytewise comparison handles unreadable files and short reads correctly.

Library API: walk_paths returns a WalkResult; ScanResult gains
skipped_dirs; unused ScanError::Io, util::path_sort and
util::path_sort_paths were dropped.

See CHANGELOG.md for the full entry.

v0.4.0

23 May 00:48

Choose a tag to compare

Breaking change: exit codes are inverted. 0 now means "no duplicates"
(the clean, nothing-to-act-on state) and 1 means "duplicates were
found". 2 for errors is unchanged. This matches the linter convention
used by tools like clippy and shellcheck, and avoids set -e
scripts tripping on a successful scan that simply found nothing.

If you scripted the previous behaviour, swap the branches:
fifi /backup && handle_dupes becomes fifi /backup || handle_dupes.

See CHANGELOG.md for the full entry.

v0.3.2

18 May 19:06

Choose a tag to compare

A small readability tweak to the default text output: duplicate groups
are now separated by a blank line. Helpful when scrolling through scans
with many groups; JSON and --dupes-only output are unchanged.

See CHANGELOG.md for the full entry.

v0.3.1

17 May 19:14

Choose a tag to compare

A small visual change to the default text output. Each duplicate
group now renders as a two-level tree: distinct inodes on level
one, hardlink aliases indented under their inode on level two.
All paths line up in the same column, so they're easier to compare
by eye, and the first line of each group starts with ─┬ to make
group boundaries visible at a glance.

JSON and --dupes-only output are unchanged.

See CHANGELOG.md for the full entry.

v0.3.0

16 May 15:22

Choose a tag to compare

Adds --depth as a generalization of the no-recursion case other
duplicate finders spell as the absence of -r. --depth 0 limits the
scan to files directly in the named directories; --depth N allows N
levels of subdirectory descent; omitted, the scan remains unbounded
as before.

Also includes an internal refactor: the binary-only modules moved
from src/bin_support/ to src/cli/, and the inner clap-definitions
file was renamed from cli.rs to args.rs to keep import paths flat.
No user-facing impact from the rename.

See CHANGELOG.md for the full entry.

v0.2.0

15 May 20:36

Choose a tag to compare

Both placeholder full-hash strategies from 0.1.0 are now real:
--algo sha256 (cryptographic, audit-trail value), --algo bytewise
(literal byte-for-byte comparison, no probabilistic argument).

The pipeline architecture didn't have to change for either — both
slot into the FullHashStrategy dispatch that was reserved in v0.1.0.
sha256 implements the DigestHasher trait like xxh3. bytewise gets a
parallel bucketing function (bucket_one_group_bytewise) that compares
files pairwise within each candidate group; for the typical case after
partial-xxh3 (all entries truly identical) it's O(N) comparisons.

Also in this release: cleaner CLI error messages (no more redundant
"scan failed:" prefix on the underlying ScanError variants), updated
--algo help text, README install paths now lead with cargo install fifi from crates.io.

Highlights:

  • --algo sha256 actually computes SHA-256, no longer a placeholder
  • --algo bytewise actually does pairwise comparison, no longer a
    placeholder
  • xxh3 remains the default; the partial-hash prefilter (head + tail
    of files ≥ 64 KiB) is always xxh3 regardless of --algo
  • Error output dropped the "scan failed:" wrapper
  • README: install via cargo install fifi documented up front

See CHANGELOG.md for the full entry.

v0.1.0

15 May 19:32

Choose a tag to compare

Initial release of fifi — a duplicate file finder for POSIX systems.

Highlights:

  • Three-phase pipeline (size grouping → partial xxh3 → full xxh3) with
    rayon for parallel hashing.
  • Storage-aware deduplication: hardlinks (and, in a future release,
    reflinks) collapse into a canonical entry with aliases. --per-path
    flips to per-directory-entry counting.
  • Synthetic-inode safety net: dedup requires matching size, so SMB/CIFS
    fake inodes don't silently merge unrelated files.
  • File age uses the inode birth time when the filesystem provides one
    (statx on Linux 4.11+, st_birthtime on macOS); min(mtime, ctime)
    fallback elsewhere.
  • Tree-style text output, NUL-delimited --dupes-only, structured
    --json with a reclaimable-bytes statistics block, --summary alone
    or combined with --json.
  • Grep-style exit codes: 0 for found, 1 for none, 2 for error.
  • Deterministic output ordering across runs.

See CHANGELOG.md for the full feature list.