diff --git a/default.nix b/default.nix index f108b17..b9059c3 100644 --- a/default.nix +++ b/default.nix @@ -7,8 +7,8 @@ stdenv.mkDerivation { src = ./.; postPatch = '' + sed -i "2iNIX_BIN_PREFIX=${nixFlakes}/bin/" direnvrc substituteInPlace direnvrc \ - --replace "\''${NIX_BIN_PREFIX:-}" "\''${NIX_BIN_PREFIX:-${nixFlakes}/bin/}" \ --replace "grep" "${gnugrep}/bin/grep" ''; diff --git a/direnvrc b/direnvrc index df5b65b..50141de 100644 --- a/direnvrc +++ b/direnvrc @@ -1,6 +1,9 @@ # shellcheck shell=bash -NIX_BIN_PREFIX=${NIX_BIN_PREFIX:-} +if [[ -z ${NIX_BIN_PREFIX:-} ]]; then + NIX_BIN_PREFIX=$(command -v nix-shell) + NIX_BIN_PREFIX="${NIX_BIN_PREFIX%/*}/" +fi _nix_export_or_unset() { local key=$1 value=$2 @@ -118,12 +121,27 @@ use_flake() { _nix_export_or_unset TEMPDIR "$old_tempdir" } +_nix_extract_direnv() { + local found_direnv + found_direnv=0 + while read -r line; do + if [[ "$found_direnv" == "1" ]]; then + echo "$line" + break + elif [[ "$line" == "_____direnv_____" ]]; then + found_direnv=1 + else + echo "$line" >&2 + fi + done +} + use_nix() { local path layout_dir path=$("${NIX_BIN_PREFIX}nix-instantiate" --find-file nixpkgs) layout_dir=$(direnv_layout_dir) local experimental_flags=() - if nix-shell --experimental-features '' --version 2>/dev/null >&2; then + if "${NIX_BIN_PREFIX}nix-shell" --experimental-features '' --version 2>/dev/null >&2; then experimental_flags+=('--experimental-features' 'nix-command flakes') fi @@ -157,13 +175,12 @@ use_nix() { then [[ -d "$layout_dir" ]] || mkdir -p "$layout_dir" local dump_cmd tmp - dump_cmd="echo -n _____direnv_____; \"$direnv\" dump bash" + dump_cmd="echo _____direnv_____; \"$direnv\" dump bash" tmp=$("${NIX_BIN_PREFIX}nix-shell" \ "${experimental_flags[@]}" \ --show-trace --pure "$@" --run "$dump_cmd") # show original shell hook output - echo "$tmp" | grep -vP '(?<=_____direnv_____).*' - echo "$tmp" | grep -oP '(?<=_____direnv_____).*' > "$cache" + echo "$tmp" | _nix_extract_direnv >&2 > "$cache" update_drv=1 else log_status using cached derivation