diff --git a/pkgs/by-name/ni/nix-bash-completions/0001-Fix-completion-with-Nix-2.4-on-non-NixOS.patch b/pkgs/by-name/ni/nix-bash-completions/0001-Fix-completion-with-Nix-2.4-on-non-NixOS.patch new file mode 100644 index 000000000000..3e3aac1cebdd --- /dev/null +++ b/pkgs/by-name/ni/nix-bash-completions/0001-Fix-completion-with-Nix-2.4-on-non-NixOS.patch @@ -0,0 +1,49 @@ +From 135798f6dff7cf5167906cecc0e9c86860c70f36 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Bj=C3=B8rn=20Forsman?= +Date: Mon, 4 Sep 2023 14:10:01 +0200 +Subject: [PATCH] Fix completion with Nix 2.4+ on non-NixOS + +Nix 2.4+ stopped setting NIX_PATH in the environment and instead uses a +built-in default in the C++ code (not exposed to shell processes). That +means this completion codes sees $override as empty and runs `NIX_PATH= +nix-instantiate ...`. Setting NIX_PATH to an empty string means Nix +won't use its default built-in value and completion breaks (assuming +the completion depends on '' or similar search path entries). + +NixOS isn't affected because there NIX_PATH is still set (by the OS, not +by code from the Nix repo). + +The fix is to not pass NIX_PATH unless we have a value for it. That +works for both old and new Nix, on NixOS and non-NixOS. + +(I initially tried with a single `$maybe_nix_path nix-instantiate ...`, +but apparently bash treats the value in $maybe_nix_path as a command +instead of setting environment variables for the process.) +--- + _nix | 10 +++++++++- + 1 file changed, 9 insertions(+), 1 deletion(-) + +diff --git a/_nix b/_nix +index 6b9c281..61052f1 100755 +--- a/_nix ++++ b/_nix +@@ -101,7 +101,15 @@ function _nix_eval_stdin () { + # Shortcut: since the output of this function is only used in the -W argument of compgen, + # which expects a shell-quoted list of words, we leave the double quotes from the Nix + # output intact to approximate shell quoting. +- NIX_PATH=$override nix-instantiate --eval - 2> /dev/null | tr '[]' ' ' ++ if [[ -n "$override" ]]; then ++ NIX_PATH=$override nix-instantiate --eval - 2> /dev/null | tr '[]' ' ' ++ else ++ # Don't set NIX_PATH to empty string, as that'll overwrite/clear Nix' ++ # built-in default (since version 2.4+). Nix 2.3 and older sets ++ # NIX_PATH in shell initialization files, which means for those ++ # versions we already have it in $override (code path above). ++ nix-instantiate --eval - 2> /dev/null | tr '[]' ' ' ++ fi + } + + # Resolve any urls ourselves, as nix will start downloading and block +-- +2.50.1 + diff --git a/pkgs/by-name/ni/nix-bash-completions/package.nix b/pkgs/by-name/ni/nix-bash-completions/package.nix index 71ea4e111dfc..0aff7d889d87 100644 --- a/pkgs/by-name/ni/nix-bash-completions/package.nix +++ b/pkgs/by-name/ni/nix-bash-completions/package.nix @@ -22,6 +22,9 @@ stdenv.mkDerivation rec { url = "https://github.com/hedning/nix-bash-completions/pull/28/commits/ef2055aa28754fa9e009bbfebc1491972e4f4e67.patch"; hash = "sha256-TRkHrk7bX7DX0COzzYR+1pgTqLy7J55BcejNjRwthII="; }) + # Fix completion with Nix 2.4+ on non-NixOS: https://github.com/hedning/nix-bash-completions/pull/26 + # Rebased locally due to conflict with the above patch (https://github.com/hedning/nix-bash-completions/pull/28). + ./0001-Fix-completion-with-Nix-2.4-on-non-NixOS.patch ]; postPatch = ''