From f452533db5641ac53347f34de907450d2a73cfb8 Mon Sep 17 00:00:00 2001 From: Bryan Bennett Date: Tue, 31 Oct 2023 12:01:21 -0400 Subject: [PATCH] Fix nix-direnv-reload No longer assumes location of layout directory relative to code. --- direnvrc | 36 +++++++++++++++++++++++++++--------- 1 file changed, 27 insertions(+), 9 deletions(-) diff --git a/direnvrc b/direnvrc index e4b3e77..33282a1 100644 --- a/direnvrc +++ b/direnvrc @@ -37,16 +37,34 @@ _nix_direnv_preflight () { if [[ ! -d "$layout_dir/bin" ]]; then mkdir -p "$layout_dir/bin" fi + # N.B. This script relies on variable expansion in *this* shell. + # (i.e. The written out file will have the variables expanded) + # If the source path changes, the script becomes broken. + # Because direnv_layout_dir is user controlled, + # we can't assume to be able to reverse it to get the source dir + # So there's little to be done about this. + cat > "${layout_dir}/bin/nix-direnv-reload" <<-EOF +#!/usr/bin/env bash +set -e +if [[ ! -d "$PWD" ]]; then + echo "Cannot find source directory; Did you move it?" + echo "(Looking for "$PWD")" + echo 'Cannot force reload with this script - use "direnv reload" manually and then try again' + exit 1 +fi + +# rebuild the cache forcefully +_nix_direnv_force_reload=1 direnv exec "$PWD" true + +# Update the mtime for .envrc. +# This will cause direnv to reload again - but without re-building. +touch "$PWD/.envrc" + +# Also update the timestamp of whatever profile_rc we have. +# This makes sure that we know we are up to date. +touch -r "$PWD/.envrc" ${layout_dir}/*.rc +EOF - # shellcheck disable=SC2016 - echo > "${layout_dir}/bin/nix-direnv-reload" '#!/usr/bin/env bash -dir="$(realpath $(dirname ${BASH_SOURCE[0]})/../..)" -_nix_direnv_force_reload=1 direnv exec "$dir" true -direnv reload -# direnv reload updates the mtime of .envrc. Also update the timestamp of the -# profile_rc file to keep track that we actually are up to date. -touch $dir/.direnv/{nix,flake}-profile-*.rc -' if [[ ! -x "${layout_dir}/bin/nix-direnv-reload" ]]; then chmod +x "${layout_dir}/bin/nix-direnv-reload" fi