Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
libstore: fix "illegal reference specifier 'man'"-error in postgresql_14
Nixpkgs issues / PRs: * NixOS/nixpkgs#368091 * NixOS/nixpkgs#369366 This can be triggered with the postgresql_14 derivation from nixpkgs rev 19305d94dacca226ca048b78e6de00f599c65858 (/nix/store/bxp6g57limvwiga61vdlyvhy7i8rp6wd-postgresql-14.15.drv on x86_64-linux): for reasons unknown to me, only the `man` and `lib` outputs are cached on cache.nixos.org: $ nix derivation show /nix/store/bxp6g57limvwiga61vdlyvhy7i8rp6wd-postgresql-14.15.drv | jq '.[].outputs.[].path' -r | xargs nix path-info --store https://cache.nixos.org warning: The interpretation of store paths arguments ending in `.drv` recently changed. If this command is now failing try again with '/nix/store/bxp6g57limvwiga61vdlyvhy7i8rp6wd-postgresql-14.15.drv^*' don't know how to build these paths: /nix/store/m9vb40xxr6gckjzpfxnqcmjqsks2gx03-postgresql-14.15 /nix/store/nm1415wa53iawar9axwxy0an6ximhayn-postgresql-14.15-dev /nix/store/v9vrvfhiw9gk8hj9895sb15fxvxnyylj-postgresql-14.15-debug /nix/store/zi12g1p99g2173i8093ixbqkfh9ng87b-postgresql-14.15-doc /nix/store/3i3fpz0xss9inampf51gp3pkx24ypxpj-postgresql-14.15-man /nix/store/db8797h2cp4rm1cnsqrf87apkkxwwdff-postgresql-14.15-lib error: path '/nix/store/m9vb40xxr6gckjzpfxnqcmjqsks2gx03-postgresql-14.15' does not exist in the store Also, the derivation uses the `outputChecks` feature (and thus `__structuredAttrs`) to make sure that e.g. the `out` output doesn't reference the `man` output: __structuredAttrs = true; outputs = [ "out" "dev" "doc" "lib" "man" ]; outputChecks.out.disallowedReferences = [ "dev" "doc" "man" ]; With all that in place, the following error was hit on all CppNix / Lix versions currently supported when trying to build the derivation above: error: derivation contains an illegal reference specifier 'man' The following happened here: * The `man` & `lib` outputs were substituted at some point. * When register outputs, the reference checks are made. * `LocalDerivationGoal::checkOutputs` gets a map of all outputs that were built and are NOT already registered in the store. In the example above this means `out`, `dev`, `debug` and `doc`. * `checkOutputs` tries to resolve the `man` output and fails to do so because it's a store-path that's already registered and thus not part of the map passed to `checkOutputs`. Since the map passed to `checkOutputs` is used in various other places that appear to assume that the paths aren't registered already, I didn't write the already registered paths into it. Instead, I created a second map that contains all already registered outputs and pass it as third argument to `checkOutputs`. If the other lookups fail, this map will be now checked before the "illegal reference specifier"-error is thrown. This fixes the problem with `postgresql_14` for me. Also wrote a small regression test that fails locally without the patch in place. Change-Id: Ieacca80c001fcfbebf6f5fe97e25c49d2724c3ff
- Loading branch information