src/libcmd/repl.cc: avoid unneeded reload after :e

If `:edit`ing a store path, don't reload repl afterwards
to avoid losing local variables: store is immutable,
so "editing" a store path is always just viewing it.

Resolves: #341
Change-Id: I3747f75ce26e0595e953069c39ddc3ee80699718
This commit is contained in:
Max “Goldstein” Siling 2024-07-15 23:28:55 +03:00 committed by Max Siling
parent 548c973e82
commit 1a6d7a3af4
4 changed files with 49 additions and 3 deletions

View file

@ -57,6 +57,11 @@ ericson:
display_name: John Ericson display_name: John Ericson
github: ericson2314 github: ericson2314
goldstein:
display_name: goldstein
forgejo: goldstein
github: GoldsteinE
horrors: horrors:
display_name: eldritch horrors display_name: eldritch horrors
forgejo: pennae forgejo: pennae

View file

@ -0,0 +1,11 @@
---
synopsis: "`:edit`ing a file in Nix store no longer reloads the repl"
issues: [fj#341]
cls: [1620]
category: Improvements
credits: [goldstein]
---
Calling `:edit` from the repl now only reloads if the file being edited was outside of Nix store.
That means that all the local variables are now preserved across `:edit`s of store paths.
This is always safe because the store is read-only.

View file

@ -652,10 +652,13 @@ ProcessLineResult NixRepl::processLine(std::string line)
// using runProgram2 to allow editors to display their UI // using runProgram2 to allow editors to display their UI
runProgram2(RunOptions { .program = editor, .searchPath = true, .args = args }).wait(); runProgram2(RunOptions { .program = editor, .searchPath = true, .args = args }).wait();
// Reload right after exiting the editor // Reload right after exiting the editor if path is not in store
// Store is immutable, so there could be no changes, so there's no need to reload
if (!state->store->isInStore(path.resolveSymlinks().path.abs())) {
state->resetFileCache(); state->resetFileCache();
reloadFiles(); reloadFiles();
} }
}
else if (command == ":t") { else if (command == ":t") {
Value v; Value v;

View file

@ -244,3 +244,30 @@ testReplResponseNoRegex '
y = { a = 1; }; y = { a = 1; };
} }
' '
# Test that editing a store path does not reload...
echo '{ identity = a: a; }' > repl-test.nix
repl_test_store="$(nix-store --add repl-test.nix)"
EDITOR=true testReplResponseNoRegex "
a = ''test string that we'll grep later''
:l $repl_test_store
:e identity
a
" "test string that we'll grep later"
# ...even through symlinks
ln -s "$repl_test_store" repl-test-link.nix
EDITOR=true testReplResponseNoRegex "
a = ''test string that we'll grep later''
:l repl-test-link.nix
:e identity
a
" "test string that we'll grep later"
# Test that editing a local file does reload
EDITOR=true testReplResponseNoRegex "
a = ''test string that we'll grep later''
:l repl-test.nix
:e identity
a
" "undefined variable"