Repository navigation
Sorry my dear friends and lovers of dix, this release truly took a long time. Big thanks to @pieter0101 and @amaanq for their great help with this one. Love you guys ❤️.
Many many API breakages because major release, and many many features. Enjoy.
Added
- The
CHANGED,ADDEDandREMOVEDheadings now show how many packages
they contain, e.g.CHANGED (12). - Each package in the JSON output has a
kindfield that isversion,
amountorsize, depending on the most significant change it went
through.ChangeKindandPackageDiff::kindexpose the same in the library. - Added the
dix last [N]subcommand, which shows the changes leading up to
the current profile generation,dix last --allfor every generation, and
dix last --from A --to Bfor the generations numbered A to B. - Added the
dix snapshot <PATH>subcommand, which prints the closure of a
store path as a versioned JSONSnapshotDocument. This lets the closure be
captured on one machine (e.g. a remote deployment target) and diffed on
another. StorePath,StorePathInfoandStoreSnapshotnow implement
Serialize/Deserialize.SnapshotDocumentserializes with the current
format version, andSnapshotDocument::from_jsonrejects unknown format
versions before parsing anything else.dix diffaccepts JSON files written bydix snapshotin place of either
store path.Size, used in reports and snapshots, is re-exported from the crate root.- Added the default
cliandstorefeatures. Library users that only diff
snapshots can disable default features to drop the SQLite and command-line
dependencies.Storerequiresstore. dix diffanddix lasttake--exit-codeto exit with 1 if the compared
closures differ.-q/--quietdoes the same without printing the diff.
DiffReport::has_changesexposes the same check in the library.
Fixed
- Versions with a suffix other than a pre-release marker (
alpha,beta,
pre,rc) now sort above their base version, so updating from7.1.0to
7.1.0-unstable-2026-01-25is an upgrade instead of a downgrade. - Numbers inside version components compare by value and letters ignore case,
so1.0-rc10is newer than1.0-rc9, and1.0-RC1newer than
1.0-alpha. - Querying a path that is not a valid store path, e.g. one that exists on disk
but was never registered, now fails instead of producing an empty closure.
Changed
- Breaking: Diffing moved into the
diffsubcommand, sodix <OLD> <NEW>
is nowdix diff <OLD> <NEW>. Its options, like--output, belong to
diff. - Breaking: Removed
--force-correctness; its behaviour is now the only
one. dix never opens the Nix database with?immutable=1, and falls back
to Nix commands instead. - Breaking: The
storemodule is now private, soStoreBackend,
CombinedStoreBackend,DbConnection,CommandBackendand
query_store_snapshot_with_backendare no longer public.StorePathInfois
re-exported from the crate root. Remote stores were only reachable through
CommandBackend::store_url(...), whichdix snapshotreplaces. - Breaking: Removed the
jsoncargo feature.serdeandserde_jsonare
now always required. - Breaking: Errors now exit with 2 instead of 1, since
--exit-codeuses 1
to report that the compared closures differ. - Breaking:
-q/--quietno longer decreases logging verbosity. It is now
the--quietofdix diffanddix last. - Logs are now written to stderr instead of stdout.
RUST_LOGis no longer read. Use-v(repeatable) to show more log output.- Packages whose version did not change are hidden unless their size changed
by at least--min-size-delta(default 1 MiB). A note at the end of the
output says how many were hidden. Pass--fulltodix diffordix last
to show them. - Names of packages that are not selected are now dimmed, instead of names of
selected packages being bold. - Breaking:
write_diff_reporttakes aRenderOptionsargument and
returns the number of hidden package diffs instead of the number written. - Breaking: Removed
query_diff_report,query_adjacent_diff_reportsand
query_store_snapshot. Open aStoreonce and usediff_store_snapshots
on thesnapshotof itsquery_snapshot_documentresults instead. - Breaking: The
reportandsnapshotmodules are private. Their items
are still exported from the crate root. - Breaking:
StorePathInfoexposes publicpathandnar_sizefields
instead ofnew,path()andnar_size(). - Breaking:
StorePathis created withTryFrom<String>instead of
TryFrom<PathBuf>, only accepts paths of the form/nix/store/<hash>-<name>
and dereferences toPathinstead ofPathBuf.StorePath::as_strreturns
it as a string. - Breaking: Packages without a version, such as flake sources, have a
Noneversion instead of the version"<none>".VersionAmount::version
and theversionofVersionDiff::AmountChangedareOption<Version>, and
theirnamein the JSON output isnull. - Breaking:
json::display_diffis replaced byjson::JsonReport, which
serializes an already queried report instead of querying and printing it. - Breaking:
DiffReport,PathStatsandPackageSizeDeltaexpose public
fields instead of accessor methods, reverting the 2.0.0 change for
DiffReportandPathStats. Read and construct the fields directly, e.g.
report.size_oldinstead ofreport.size_old(),stats.addedinstead of
stats.added_count()andPackageSizeDelta { old, new }instead of
PackageSizeDelta::new(old, new). - dix links against the system SQLite instead of bundling its own copy, so
building it needslibsqlite3and its headers. - Breaking: The
dix-diffcrate is merged back intodixand is no
longer published.DiffStatus,Version,VersionAmountandVersionDiff
are still exported fromdix, and the rest of the diff engine is internal. - The repository is a single package again, so
cargo install --path .works. - Breaking:
PackageDiffholds the version change of a package in
change: Option<VersionChange>instead of theversions,statusand
has_omitted_versionsfields, andVersionChangeis exported fromdix.
changeisNonefor packages whose size changed but whose versions did
not.PackageDiff::status()still reports those asDiffStatus::Changed.
What's Changed
- build(deps): bump nixpkgs from
e1c1b84tof205b55by @dependabot[bot] in #96 - build(deps): bump nixpkgs from
f205b55to3b32825by @dependabot[bot] in #97 - render: inline size diff into SIZE reporting by @faukah in #101
- build(deps): bump nixpkgs from
3b32825tod3498f7by @dependabot[bot] in #105 - build(deps): bump actions/checkout from 7.0.0 to 7.0.1 by @dependabot[bot] in #104
- build(deps): bump nixpkgs from
d3498f7to9387b3fby @dependabot[bot] in #115 - update and drop cargo dependencies by @faukah in #108
- build(deps): bump nixpkgs from
9387b3fto34ca302by @dependabot[bot] in #119 - dix: add
snapshotsubcommand for versioned closure snapshots by @faukah in #124 - dix: add
snapshotsubcommand for versioned closure snapshots by @faukah in #125 - dix: drop
--force-correctness, cleanup by @faukah in #126 - dix: add
lastsubcommand by @faukah in #127 - render: add a count to the diff headings by @faukah in #129
- build: update nix + cargo dependencies by @faukah in #128
- report: classify package diffs by change kind by @faukah in #130
- ci: move to manic-systems/workflows v2 by @amaanq in #131
- dix: replace clap with pound and eyre with misstep by @amaanq in #132
- dix: drop the store backend connection lifecycle by @faukah in #137
- build: update cargo dependencies by @faukah in #136
- build: link against system sqlite instead of bundling it by @amaanq in #140
- dix: merge dix-diff back into dix by @faukah in #139
- dix: diff snapshot files by @faukah in #141
- BIG cleanup by @faukah in #142
- ci: bump the actions group with 4 updates by @dependabot[bot] in #134
- ci: bump the actions group with 4 updates by @dependabot[bot] in #143
- dix: fix version comparison! by @faukah in #144
- dix: add --exit-code and --quiet to diff and last by @faukah in #145
Full Changelog: v2.2.0...v3.0.0