Repository navigation
fix: preserve fish activation environment - #431
Conversation
ekalinin
left a comment
There was a problem hiding this comment.
Thanks, this fixes #399. Two changes are needed before merge, plus two small ones.
-
[P1] Keep fish replacing NODE_PATH -
nodeenv.py:2227This prepend branch has never run since fish support landed in 2017: the initial
deactivate_node nondestructivepass erasedNODE_PATHfirst, so fish replaced it like the other shells. Now it runs, and modules from the user'sNODE_PATHresolve inside the env, under fish only. Please replace it, as the prefix variables below do:if set -q NODE_PATH set -gx _OLD_NODE_PATH $NODE_PATH end set -gx NODE_PATH "$NODE_VIRTUAL_ENV/__MOD_NAME__"
Then
test_activate_sets_env(tests/test_activate_shells.py:283) can compare the wholeNODE_PATH, not just its first element. -
[P2] Same fix for the --isolate-npm restore -
nodeenv.py:1768It still uses
test -n, so an emptynpm_config_*becomes unset and leaves an exported empty_OLD_npm_config_*behind. Please move__NPM_UNISOLATE__inside the new guard, drop its duplicate guard, switch toset -q, and add the threenpm_config_*names tonamesintest_fish_restores_original_variables. -
[P3] The REQUIRE_SHELLS comment (
tests/test_activate_shells.py:144) still refers to xfail markers, which this PR removes. -
[P3] Please add an
[unreleased]entry for #399 toCHANGES, noting that existing envs need--forceto get the newactivate.fish.
ekalinin
left a comment
There was a problem hiding this comment.
Thanks for the update, all four points from the last round are in. A few more things before merge.
-
Please rebase on master:
CHANGESconflicts with the #419 entry, and CI hasn't run on 306eb92. -
The new
if set -q NODE_VIRTUAL_ENVguard (nodeenv.py:2127) skips the restore whenNODE_VIRTUAL_ENVis already gone:set -gx NODE_PATH /old/np source env/bin/activate.fish set -e NODE_VIRTUAL_ENV deactivate_node
After this,
NODE_PATH,NPM_CONFIG_PREFIXandnpm_config_prefixstill point at the env, sonpm i -gkeeps installing there, and_OLD_NODE_PATH=/old/npstays exported. On master these three are at least erased.activatekeeps all of these restores under one guard,_OLD_NODE_VIRTUAL_PATH, and fish can do the same: move them into the existing PATH block and drop the new guard.if test -n "$_OLD_NODE_VIRTUAL_PATH" set -gx PATH $_OLD_NODE_VIRTUAL_PATH set -e _OLD_NODE_VIRTUAL_PATH # NODE_PATH, NPM_CONFIG_PREFIX and npm_config_prefix restores as now __NPM_UNISOLATE__ end
The nondestructive pass at the top still skips them unless another env is active, because only activation sets
_OLD_NODE_VIRTUAL_PATH. With this change the case above ends withNODE_PATH=/old/np, and the shell tests pass excepttest_isolate_npm_fish_content(tests/test_install_activate.py:411), which looks for theif set -q NODE_VIRTUAL_ENVstring. When you update it, please make its order check fail if__NPM_UNISOLATE__ends up outside the guard. Right now the guard is in everyactivate.fishand always comes first, so the check passes wherever the restores are. -
My
--forcesuggestion forCHANGESwas wrong, sorry. With-p, nodeenv appends the new code to the virtualenv'sactivate.fish, so the old block still runs first and erasesNODE_PATH. Without-p,--forcereinstalls node at the default version and drops--isolate-npmand--promptunless they are passed again. Something like "existing environments keep the oldactivate.fish; recreate them with the same options to get the fix (with-p, remove the old nodeenv part from the virtualenv'sactivate.fishfirst)" would be closer. -
Nit:
assert all(...)attests/test_activate_shells.py:340doesn't say which backup leaked. A dict comparison like the line above it would.
Resolve the conflicts with ekalinin#439 and ekalinin#448: keep the ekalinin#399 entry above the ekalinin#332 and ekalinin#436 entries in CHANGES, and keep the new python_venv test from ekalinin#448 under @every_shell, since this branch drops @restoring_shell. The earlier merge f506999 cut the "Nodeenv changelog" underline to 10 characters and dropped the blank line after it. docutils reports "Title underline too short" and readme_renderer refuses README.rst + CHANGES, so restore the title as it is on master.
The integration, git-bash and with-npm-windows jobs failed on 6d6b79b because master did not have the ekalinin#453 fix yet: latest resolved to 27.0.0-alpha.0.0.0 and crashed in parse_version. Master now has it (ekalinin#454) and keeps the ekalinin#453 entry in its 1.11.1 section (ekalinin#455), so the merge has no conflicts.
|
Thanks! |
Preserve and restore fish activation variables for #399, including unset/empty values and repeated activation. Active NODE_PATH remains isolated to the environment, and all six saved NODE_PATH/npm variables and their backups are restored together.
The latest review exposed a second case: NODE_VIRTUAL_ENV may be removed while the environment is still active. Restore under the existing saved-PATH guard so deactivation still restores the caller's variables in that case. The generated-script test checks that --isolate-npm restoration is inside that guard, and a mutation moving it outside fails the test. Backup assertions identify any leaked variable.
Merged current upstream master (0c67226) to resolve CHANGES while preserving published history. The #419 entry is retained. Corrected the migration guidance: existing environments retain the old activate.fish; recreate with the same options. With -p, remove the old nodeenv part from the Python virtualenv's activate.fish first. --force alone is not a safe migration instruction.
Validation on macOS with fish 4.9.3 and actual sh/dash/bash/zsh/fish, NODEENV_REQUIRE_SHELLS=1:
Real Node download/build integration, other Python/fish versions and Linux/Windows execution were not run locally. Hosted CI for this new head is not yet verified. AI assistance: OpenAI Codex inspected the Issue/review, implemented the correction, ran these checks and reviewed Standards/Spec.
Closes #399.