Files
lix/doc/manual/rl-next/flake-file-input-correction.md
T
Jade Lovelace b22bee91f5 fix!: file type flake inputs are always recursive hashed
Well that is a mess. I don't like breaking derivation compatibility,
but I like non-deterministic evaluation much less.

We can break compat if we own up to it, which this does.

Fixes: https://git.lix.systems/lix-project/lix/issues/750

Change-Id: Ic9e2407393f1d42c2be604f80b4aa11bc872bc23
2025-03-21 13:19:15 -07:00

1.5 KiB

synopsis, issues, cls, category, credits
synopsis issues cls category credits
Flake inputs/`builtins.fetchTree` invocations with `type = "file"` now have consistent (but different from previous versions) resulting paths
fj#750
2864
Breaking Changes
jade

Previously fetchTree { type = "file"; url = "...", narHash = "sha256-..."; } could return a different result depending on whether someone has run nix store add-path --name source ... on a path with the same narHash as the flake input/fetchTree invocation (or if such a path exists in an accessible binary cache).

In the past type = "file" flake inputs were, in contrast to all other flake inputs, hashed in flat hash mode rather than recursive hash mode. The difference between the two is that flat mode hashes are just what you get from sha256sum of a single file, whereas recursive hashes are the SHA256 sum of a NAR (Nix ARchive, a deterministic tarball-like format) of a file tree.

Much of flakes assumes that everything is recursive-hashed including nix flake archive, substitution of flake inputs from binary caches, and more, which led to the substitution path code being taken if such a path is present, yielding a different store path non-deterministically.

To fix this non-deterministic evaluation bug, we needed to break derivation hash stability, so some Nix evaluations now produce different results than previous versions of Lix. Lix now has consistent behaviour with CppNix 2.24 with respect to file flake inputs: they are always recursively hashed.