diff --git a/direnvrc b/direnvrc index e4b3e77..3e1cdd6 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 @@ -194,6 +212,7 @@ use_flake() { flake_expr="${1:-.}" flake_dir="${flake_expr%#*}" + flake_dir=${flake_dir#"path:"} if [[ "$flake_expr" = -* ]]; then if [[ -n "$2" ]]; then @@ -235,9 +254,9 @@ use_flake() { then if [[ "$_nix_direnv_manual_reload" == "1" && -z "${_nix_direnv_force_reload-}" ]]; then if [[ -e "$profile_rc" ]]; then - log_status "nix-direnv: cache is out of date. use \"nix-direnv-reload\" to reload" + log_error "nix-direnv: cache is out of date. use \"nix-direnv-reload\" to reload" else - log_status "nix-direnv: cache does not exist. use \"nix-direnv-reload\" to create it" + log_error "nix-direnv: cache does not exist. use \"nix-direnv-reload\" to create it" fi else @@ -390,9 +409,9 @@ use_nix() { then if [[ "$_nix_direnv_manual_reload" == "1" && -z "${_nix_direnv_force_reload-}" ]]; then if [[ -e "$profile_rc" ]]; then - log_status "nix-direnv: cache is out of date. use \"nix-direnv-reload\" to reload" + log_error "nix-direnv: cache is out of date. use \"nix-direnv-reload\" to reload" else - log_status "nix-direnv: cache does not exist. use \"nix-direnv-reload\" to create it" + log_error "nix-direnv: cache does not exist. use \"nix-direnv-reload\" to create it" fi else _nix_clean_old_gcroots "$layout_dir"