Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix PATH changes not triggering REPL reconfiguration (#2015) #10817

Open
wants to merge 1 commit into
base: master
Choose a base branch
from

Conversation

mpickering
Copy link
Collaborator

When a user's PATH environment variable changes between Cabal commands, the environment in the REPL becomes incorrect. This occurs because during initial package configuration, the current PATH is captured via programSearchPathAsPATHVar and then stored in the programOverrideEnv field of a ConfiguredProgram. These ConfiguredPrograms are subsequently serialized into the setup-config file, effectively baking in the PATH environment from the time of configuration.

The issue manifests when PATH is updated after initial configuration. Although the solver re-runs when detecting PATH changes, the dryRunLocalPkg function examines ElaboratedConfiguredPackage and incorrectly determines that nothing has changed that would require reconfiguration. This decision is incorrect because setup-config now contains a stale reference to the original PATH value, which no longer matches the current environment.

To fix this problem, we need to store the ConfiguredPrograms directly in ElaboratedConfiguredPackage. This approach will ensure that when PATH changes, the ConfiguredPrograms will also change, properly triggering reconfiguration. While this solution will cause more recompilations when PATH changes, it guarantees that the correct environment is always used during builds and REPL sessions.

An alternative approach would be to stop baking the PATH variable into the environment of programs, but this would require more substantial changes to how Cabal manages environment variables.

Fixes #2015

Please read Github PR Conventions and then fill in one of these two templates.


Template Α: This PR modifies behaviour or interface

Include the following checklist in your PR:

When a user's PATH environment variable changes between Cabal commands,
the environment in the REPL becomes incorrect. This occurs because
during initial package configuration, the current PATH is captured via
`programSearchPathAsPATHVar` and then stored in the `programOverrideEnv`
field of a ConfiguredProgram. These `ConfiguredProgram`s are subsequently
serialized into the setup-config file, effectively baking in the PATH
environment from the time of configuration.

The issue manifests when `PATH` is updated after initial configuration.
Although the solver re-runs when detecting `PATH` changes, the
`dryRunLocalPkg` function examines `ElaboratedConfiguredPackage` and
incorrectly determines that nothing has changed that would require
reconfiguration. This decision is incorrect because `setup-config` now
contains a stale reference to the original `PATH` value, which no longer
matches the current environment.

To fix this problem, we need to store the `ConfiguredProgram`s directly in
`ElaboratedConfiguredPackage`. This approach will ensure that when `PATH`
changes, the `ConfiguredProgram`s will also change, properly triggering
reconfiguration. While this solution will cause more recompilations when
`PATH` changes, it guarantees that the correct environment is always used
during builds and REPL sessions.

An alternative approach would be to stop baking the `PATH` variable into
the environment of programs, but this would require more substantial
changes to how Cabal manages environment variables.

Fixes #2015
@mpickering mpickering force-pushed the wip/investigate-recomp branch from faff622 to 9fd36c6 Compare March 19, 2025 16:03
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

cabal repl: Change in PATH environment variable not reflected
1 participant