nix-bash-completions: fix for non-NixOS use

Apply https://github.com/hedning/nix-bash-completions/pull/26 to
nixpkgs, since upstream seems dead. (PR has been sitting there for 2
years.)

Due to a conflict with
https://github.com/hedning/nix-bash-completions/pull/28, which is
already applied here in nixpkgs, pull 26 cannot be applied as is. I
rebased it and added it locally to nixpkgs.
This commit is contained in:
Bjørn Forsman
2025-10-16 19:21:26 +02:00
parent 72338f399c
commit da688b585b
2 changed files with 52 additions and 0 deletions
@@ -0,0 +1,49 @@
From 135798f6dff7cf5167906cecc0e9c86860c70f36 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Bj=C3=B8rn=20Forsman?= <bjorn.forsman@gmail.com>
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 '<nixpkgs>' 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
@@ -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 = ''