tvl-depot/tvix/docs/differences-drv-paths.md
Florian Klink d991548ea2 fix(tvix/docs): update builder magic string
It's `builtin:fetchurl`, not `builtins:fetchurl`.

Change-Id: I2e90fce5feecc75257a5156aee12e0737a525175
Reviewed-on: https://cl.tvl.fyi/c/depot/+/10961
Autosubmit: flokli <flokli@flokli.de>
Tested-by: BuildkiteCI
Reviewed-by: aspen <root@gws.fyi>
2024-02-19 15:52:14 +00:00

1.9 KiB

title author email lang
.drvPath inconsistencies
tazjin
flokli
tazjin@tvl.su
flokli@flokli.de
en-GB

Why .drvPath differs between Nix and Tvix

Nix and Tvix currently use a different approach when it comes to tracking input references, in order to build the right dependencies in advance. Nix is using string contexts, whereas Tvix is doing reference scanning 1.

There are some real-life cases, for example during nixpkgs bootstrapping, where multiple different fixed-output derivations are written to produce the same hash.

For example, bootstrap sources that are downloaded early are fetched using a special "builder hack", in which the builder field of the derivation is populated with the magic string builtin:fetchurl and the builder itself will perform a fetch, with everything looking like a normal derivation to the user.

These bootstrap sources are later on defined again, once curlis available, to be downloaded using the standard pkgs.fetchtarball mechanism, but yielding the same outputs (as the same files are being fetched).

In our reference scanning implementation, this output scanning of FOD will cause the path of the first derivation producing the given fixed output to be stored in the inputDrvs field of the derivation, while Nix will point to the derivation that was actually used.

This doesn't cause any differences in the calculated output paths, as paths to fixed-output derivations are replaced with a special fixed:out:${algo}:${digest}:${fodPath} string that doesn't contain the "path to the wrong derivation" anymore.

As we haven't fully determined if our reference scanning approach is gonna work, and comparing output paths is sufficient to determine equality of the build instructions, this is left as a future work item.