Skip to content

Commit

Permalink
Merge pull request #487 from nix-community/GH-486
Browse files Browse the repository at this point in the history
Issue a warning if we are falling back to the old shell environment
  • Loading branch information
Mic92 authored Apr 23, 2024
2 parents 9b0b127 + a69341c commit 08ee079
Show file tree
Hide file tree
Showing 5 changed files with 43 additions and 31 deletions.
47 changes: 24 additions & 23 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -275,51 +275,52 @@ nix invocation.

#### Tracked files

`nix-direnv` makes a performance trade-off and only considers changes in a
limited number of files when deciding to update its cache.
As a convenience, `nix-direnv` adds common files to direnv's watched file list
automatically.

- for `use nix` this is:
The list of additionally tracked files is as follows:

- for `use nix`:
- `~/.direnvrc`
- `~/.config/direnv/direnvrc`
- `.envrc`,
- A single nix file. In order of preference:
- The file argument to `use nix`
- `shell.nix` if it exists
- `default.nix` if it exists
- `shell.nix` if it exists

- for `use flake` this is:
- for `use flake`:
- `~/.direnvrc`
- `~/.config/direnv/direnvrc`
- `.envrc`
- `flake.nix`
- `flake.lock`
- `devshell.toml` if it exists

To add more files to be checked use `watch_file` like this

```shell
watch_file your-file.nix
use nix # or use flake
```

Or - if you don't mind the overhead (runtime and conceptual) of watching all
nix-files:
Users are free to use direnv's builtin `watch_file` function to track additional
files. `watch_file` must be invoked before either `use flake` or `use nix` to
take effect.

```shell
watch_file $(find . -name "*.nix" -printf '"%p" ')
```
#### Environment Variables

Note that this will re-execute direnv for any nix change, regardless of whether
that change is meaningful for the devShell in use.
nix-direnv sets the following environment variables for user consumption. All
other environment variables are either a product of the underlying nix
invocation or are purely incidental and should not be relied upon.

`watch_file` must be invoked before either `use flake` or `use nix` to take
effect.
- `NIX_DIRENV_DID_FALLBACK`: Set when the current revision of your nix shell or
flake's devShell are invalid and nix-direnv has loaded the last known working
shell.

## General direnv tips

- [Changing where direnv stores its cache](https://github.com/direnv/direnv/wiki/Customizing-cache-location)
- [Quickly setting up direnv in a new nix project](https://github.com/nix-community/nix-direnv/wiki/Shell-integration)
- [Changing where direnv stores its cache][cache_location]
- [Quickly setting up direnv in a new nix project][new_project]
- [Disable the diff notice (requires direnv 2.34+)][hide_diff_notice]: Note that
this goes into direnv's TOML configuration!

[cache_location]: https://github.com/direnv/direnv/wiki/Customizing-cache-location
[new_project]: https://github.com/nix-community/nix-direnv/wiki/Shell-integration
[hide_diff_notice]: https://direnv.net/man/direnv.toml.1.html#codehideenvdiffcode

## Other projects in the field

Expand Down
19 changes: 15 additions & 4 deletions direnvrc
Original file line number Diff line number Diff line change
Expand Up @@ -298,6 +298,7 @@ use_flake() {
local tmp_profile_rc
local tmp_profile="${layout_dir}/flake-tmp-profile.$$"
if tmp_profile_rc=$(_nix print-dev-env --profile "$tmp_profile" "$@"); then
# If we've gotten here, the user's current devShell is valid and we should cache it
_nix_clean_old_gcroots "$layout_dir"

# We need to update our cache
Expand All @@ -318,13 +319,20 @@ use_flake() {
flake_input_paths="${flake_input_paths/${store_path}/}"
done

_nix_direnv_info "renewed cache"
_nix_direnv_info "Renewed cache"
else
# The user's current flake failed to evaluate,
# but there is already a prior profile_rc,
# which is probably more useful than nothing.
# Fallback to use that (which means just leaving profile_rc alone!)
_nix_direnv_warning "Evaluating current devShell failed. Falling back to previous environment!"
export NIX_DIRENV_DID_FALLBACK=1
fi
fi
else
if [[ -e ${profile_rc} ]]; then
# Our cache is valid, use that
_nix_direnv_info "using cached dev shell"
_nix_direnv_info "Using cached dev shell"
else
# We don't have a profile_rc to use!
_nix_direnv_error "use_flake failed - Is your flake's devShell working?"
Expand Down Expand Up @@ -469,12 +477,15 @@ use_nix() {
echo "$tmp_profile_rc" >"$profile_rc"
_nix_add_gcroot "$tmp_profile" "$profile"
rm -f "$tmp_profile" "$tmp_profile"*
_nix_direnv_info "renewed cache"
_nix_direnv_info "Renewed cache"
else
_nix_direnv_warning "Evaluating current nix shell failed. Falling back to previous environment!"
export NIX_DIRENV_DID_FALLBACK=1
fi
fi
else
if [[ -e ${profile_rc} ]]; then
_nix_direnv_info "using cached dev shell"
_nix_direnv_info "Using cached dev shell"
else
_nix_direnv_error "use_nix failed - Is your nix shell working?"
return 1
Expand Down
2 changes: 1 addition & 1 deletion flake.nix
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@
};

devShells.default = pkgs.callPackage ./shell.nix {
packages = [ config.treefmt.build.wrapper ];
packages = [ config.treefmt.build.wrapper pkgs.shellcheck ];
};

checks =
Expand Down
4 changes: 2 additions & 2 deletions tests/test_gc.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ def common_test(direnv_project: DirenvProject) -> None:
)
sys.stderr.write(out1.stderr)
assert out1.returncode == 0
assert "renewed cache" in out1.stderr
assert "Renewed cache" in out1.stderr
assert "Executing shellHook." in out1.stderr

run(["nix-collect-garbage"])
Expand All @@ -37,7 +37,7 @@ def common_test(direnv_project: DirenvProject) -> None:
)
sys.stderr.write(out2.stderr)
assert out2.returncode == 0
assert "using cached dev shell" in out2.stderr
assert "Using cached dev shell" in out2.stderr
assert "Executing shellHook." in out2.stderr


Expand Down
2 changes: 1 addition & 1 deletion tests/test_use_nix.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ def direnv_exec(
sys.stderr.write(out.stderr)
assert out.returncode == 0
assert out.stdout == "OK\n"
assert "renewed cache" in out.stderr
assert "Renewed cache" in out.stderr


@pytest.mark.parametrize("strict_env", [False, True])
Expand Down

0 comments on commit 08ee079

Please sign in to comment.