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: https://git.lix.systems/lix-project/lix/issues/341 Change-Id: I3747f75ce26e0595e953069c39ddc3ee80699718
This commit is contained in:
parent
548c973e82
commit
1a6d7a3af4
4 changed files with 49 additions and 3 deletions
|
@ -57,6 +57,11 @@ ericson:
|
|||
display_name: John Ericson
|
||||
github: ericson2314
|
||||
|
||||
goldstein:
|
||||
display_name: goldstein
|
||||
forgejo: goldstein
|
||||
github: GoldsteinE
|
||||
|
||||
horrors:
|
||||
display_name: eldritch horrors
|
||||
forgejo: pennae
|
||||
|
|
11
doc/manual/rl-next/repl-edit-store.md
Normal file
11
doc/manual/rl-next/repl-edit-store.md
Normal 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.
|
|
@ -652,10 +652,13 @@ ProcessLineResult NixRepl::processLine(std::string line)
|
|||
// using runProgram2 to allow editors to display their UI
|
||||
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();
|
||||
reloadFiles();
|
||||
}
|
||||
}
|
||||
|
||||
else if (command == ":t") {
|
||||
Value v;
|
||||
|
|
|
@ -244,3 +244,30 @@ testReplResponseNoRegex '
|
|||
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"
|
||||
|
|
Loading…
Reference in a new issue