Files
lix/tests
Maximilian Bosch 98946e2d9c nix-shell: restore backwards-compat with old nixpkgs
Basically an attempt to resume fixing #5543 for a breakage introduced
earlier[1]. Basically, when evaluating an older `nixpkgs` with
`nix-shell` the following error occurs:

    λ ma27 [~] → nix-shell -I nixpkgs=channel:nixos-18.03 -p nix
    error: anonymous function at /nix/store/zakqwc529rb6xcj8pwixjsxscvlx9fbi-source/pkgs/top-level/default.nix:20:1 called with unexpected argument 'inNixShell'

           at /nix/store/zakqwc529rb6xcj8pwixjsxscvlx9fbi-source/pkgs/top-level/impure.nix:82:1:

               81|
               82| import ./. (builtins.removeAttrs args [ "system" "platform" ] // {
                 | ^
               83|   inherit config overlays crossSystem;

This is a problem because one of the main selling points of Nix is that
you can evaluate any old Nix expression and still get the same result
(which also means that it *still evaluates*). In fact we're deprecating,
but not removing a lot of stuff for that reason such as unquoted URLs[2]
or `builtins.toPath`. However this property was essentially thrown away
here.

The change is rather simple: check if `inNixShell` is specified in the
formals of an auto-called function. This means that

    { inNixShell ? false }:
    builtins.trace inNixShell
      (with import <nixpkgs> { }; makeShell { name = "foo"; })

will show `trace: true` while

    args@{ ... }:
    builtins.trace args.inNixShell
      (with import <nixpkgs> { }; makeShell { name = "foo"; })

will throw the following error:

    error: attribute 'inNixShell' missing

This is explicitly needed because the function in
`pkgs/top-level/impure.nix` of e.g. NixOS 18.03 has an ellipsis[3], but
passes the attribute-set on to another lambda with formals that doesn't
have an ellipsis anymore (hence the error from above). This was perhaps
a mistake, but we can't fix it anymore. This also means that there's
AFAICS no proper way to check if the attr-set that's passed to the Nix
code via `EvalState::autoCallFunction` is eventually passed to a lambda
with formals where `inNixShell` is missing.

However, this fix comes with a certain price. Essentially every
`shell.nix` that assumes `inNixShell` to be passed to the formals even
without explicitly specifying it would break with this[4]. However I think
that this is ugly, but preferable:

* Nix 2.3 was declared stable by NixOS up until recently (well, it still
  is as long as 21.11 is alive), so most people might not have even
  noticed that feature.

* We're talking about a way shorter time-span with this change being
  in the wild, so the fallout should be smaller IMHO.

[1] https://github.com/NixOS/nix/commit/9d612c393abc3a73590650d24bcfe2ee57792872
[2] https://github.com/NixOS/rfcs/pull/45#issuecomment-488232537
[3] https://github.com/NixOS/nixpkgs/blob/release-18.03/pkgs/top-level/impure.nix#L75
[4] See e.g. the second expression in this commit-message or the changes
    for `tests/ca/nix-shell.sh`.
2022-06-13 23:29:28 +02:00
..
2020-04-14 18:45:06 +02:00
2021-07-07 10:48:47 +02:00
2019-12-13 19:05:26 +01:00
2014-08-21 21:50:19 +02:00
2021-07-07 11:30:35 +02:00
2018-02-13 14:26:19 +00:00
2022-06-02 21:21:10 +02:00
2020-07-30 16:38:04 -05:00
2022-04-19 13:41:32 +02:00
2022-04-19 21:47:13 +02:00
2022-03-11 10:00:19 -05:00
2021-11-04 15:04:04 +01:00
2022-01-19 14:24:14 +01:00
2022-06-07 14:27:10 +02:00
2006-07-21 13:21:43 +00:00
2022-05-19 18:24:49 +02:00
2021-01-21 11:02:09 +01:00
2022-06-07 14:27:10 +02:00
2022-05-13 22:02:28 +02:00
2020-07-30 16:38:04 -05:00
2018-01-16 19:23:18 +01:00
2021-10-15 16:58:21 +02:00
2022-06-07 14:27:10 +02:00
2018-01-16 19:23:18 +01:00
2019-11-27 00:05:30 +01:00
2018-02-25 16:40:05 -06:00
2016-04-11 16:20:15 +02:00
2022-06-07 14:27:10 +02:00
2021-12-07 21:45:09 +01:00
2007-08-13 13:15:02 +00:00
2022-01-26 14:15:03 +01:00
2012-12-04 14:47:50 +01:00
2021-04-09 23:13:08 +02:00