Breaking
--links/LINKSno longer exists off Windows. It was accepted
everywhere and did nothing off Windows — the value was only ever read
inside a#[cfg(windows)]branch, becausest_nlinkarrives inside
thestatxresult a Unix scan already asks for. It is now compiled
out there, so a Linux or macOScamembert --linksfails with an
unknown-argument error instead of silently ignoring it. Migration:
drop the flag; nothing about the scan changes, since nothing about it
ever depended on the flag on those platforms. This matters more than
it did before because the man page and shell completions are generated
from the sameclapdefinitions and are now installed by the
.deb/.rpm/PKGBUILDpackages — a no-op flag documented in terms
of Windows would have shipped to every Linux user.camembert-coreno longer exposesrustix::io::Errnoin its error
taxonomy, replaced bycamembert_core::errno::ScanErrno— a newtype
over the canonical POSIX errno number in Linux/x86-64 numbering.
Tree::error_reason,Tree::error_reason_counts,Row::error_reason,
errno::{name, from_name, label, severity, breakdown}and the dump
reader'serror_reasonfields all change type. Migration: swap
Errno::ACCESSforScanErrno::ACCESS(the taxonomy's names are
mirrored as associated constants), and convert a host errno at the
boundary withScanErrno::from(errno)on Unix. Dumps are unaffected —
theerfield's bytes are unchanged, in both directions.
Added
- Native
.deband.rpmpackages, built forx86_64andaarch64
and attached to every release. They install the binary, the three man
pages, and bash/zsh/fish completions. The packaged binary is the same
static musl build as the tarballs, so the packages declare no
dependencies and install on any glibc vintage — at the price of not
being distro-archive-policy packages. There is no APT/DNF repository
yet: upgrading means downloading the next release. - Shell completions for bash, zsh and fish, generated from the live
clapdefinitions by a newcamembert-completionsbinary (the same
patterncamembert-mangenalready used for the man pages). Packagers
and from-source installers get them with
cargo run --release --package camembert --bin camembert-completions -- <OUT_DIR>. - The Arch
PKGBUILD(packaging/aur/) installs the
shell completions too, and now carriesoptions=('!lto'): makepkg's
default LTO makeszstd-sysemit GCC LTO bitcode that rustc's linker
cannot resolve, so the package did not build at all on a stock Arch
configuration. scripts/build-packages.sh, which builds the release binary,
regenerates the man pages and completions, and produces both packages.
It is what the release workflow runs, so a package can be reproduced
locally exactly as CI built it.- A Windows scan backend (
x86_64-pc-windows-msvc).camembert-core
builds and its scan engine runs there: real allocated sizes from
AllocationSize(measured compression-aware on NTFS), real hardlink
dedup fromNtQueryInformationByName, reparse points classified by tag,
and paths beyondMAX_PATH. Thecamembertbinary builds and runs
there too, with a reduced interface: deletion, the freeable oracle and
the open-file confidence verdict are compiled out rather than disabled,
so the keys do not exist,?does not list them and the palette does
not offer them. See the README's "Platform support" for the full split.
Prebuiltx86_64-pc-windows-msvcbinaries are attached to releases as
a.zip. errno::ScanErrno::SHARING_VIOLATION, the taxonomy's first non-POSIX
reason: Windows'ERROR_SHARING_VIOLATION/ERROR_LOCK_VIOLATION, i.e.
another process holding the file open. Its wire name is
WIN_SHARING_VIOLATION, deliberately without anEprefix so it cannot
be read as an errno, and non-POSIX reasons are numbered from 2^24 so the
dump's decimal fallback can never collide with a real errno. The entry is
unconditional, notcfg(windows): a dump written on Windows has to
decode on Linux.
Changed
- The
directory unreadabledebug log renders its errno as the canonical
name (EACCES) instead of the host's prose description (Permission denied (os error 13)). Asking the host to describe a canonical number
would reintroduce the very numbering assumption the newtype removes.
Fixed
- The test suite is green on btrfs again. Two directory-index
fixtures asserted their own potency ("this directory reports allocated
index bytes, so the test can tell the corrected answer from the
listing's zero") on every platform. That is a Windows property: the
correction it guards reconciles a listing's resident-index zero with
the by-handle figure, a gap only Windows has, and on Unix "a directory
has allocated blocks" is not an invariant at all — btrfs keeps
directory entries in metadata B-trees and reports zero for any
directory. The guards are now Windows-only; the agreement assertions
the tests exist for still run everywhere. camembert diffno longer renders a Unix path with a backslash
separator when the dump's root is a relative directory whose own name
contains one (camembert 'back\slash' -o dump.cmbt). The join picked the
first/-or-\byte in the directory path, which for such a root is part
of a filename, and printedback\slash\plain.txt— a path that exists
nowhere and that the dump's owndlines (back\slash/sub) contradict.
A legacy 0.3.0 Windows dump is now recognised by its root being a Windows
absolute path (C:\…,\\server\share,\\?\C:\…), which is the only
shape that writer could have produced, so those still render as the
Windows paths a user recognises.
Full Changelog: v0.3.0...v0.4.0