Skip to content

Use LOCALAPPDATA for config/cache directories on Windows#30975

Open
VedantMadane wants to merge 2 commits intomatplotlib:mainfrom
VedantMadane:fix-windows-config-directory
Open

Use LOCALAPPDATA for config/cache directories on Windows#30975
VedantMadane wants to merge 2 commits intomatplotlib:mainfrom
VedantMadane:fix-windows-config-directory

Conversation

@VedantMadane
Copy link

Summary

On Windows, the default configuration and cache directories now use %LOCALAPPDATA%\matplotlib instead of %USERPROFILE%\.matplotlib, following Windows application data storage conventions.

This addresses the issue where matplotlib was placing its config folder directly in the user's home directory (%USERPROFILE%), which is not the recommended location on Windows.

Changes

  • Modified _get_config_or_cache_dir() to check for Windows (sys.platform == 'win32') and use %LOCALAPPDATA% when available
  • Falls back to %USERPROFILE%\.matplotlib if LOCALAPPDATA is not set
  • Updated docstrings for get_configdir() and get_cachedir() to document the Windows behavior
  • Added a test for the Windows-specific behavior
  • Added behavior change documentation

References

Closes #20779

Copy link
Member

@timhoffm timhoffm left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for the contribution.

Please also check whether there are other parts of the documentation that may need an update: https://matplotlib.org/stable/search.html?q=MPLCONFIGDIR

@VedantMadane
Copy link
Author

Thanks for the review @timhoffm! I've addressed both suggestions: switched to pathlib for mkdir and added an explicit assertion for the expected configdir path.

Comment on lines 102 to 104
# Clear cached values
matplotlib.get_configdir.cache_clear()
matplotlib.get_cachedir.cache_clear()
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This does not work. But why do you need it? You run get_configdir() in a separate subprocess.

@tacaswell
Copy link
Member

What is the path for back compatibility?

We do not want to break users that have config they are relying on reading without warning and allow users to switch version of mpl without having to duplicate their config.

@VedantMadane
Copy link
Author

VedantMadane commented Jan 16, 2026

Thanks @timhoffm and @tacaswell for the feedback.

Changes made:
Removed unnecessary cache_clear() calls (subprocess starts fresh)
Added backwards compatibility:
Checks if %USERPROFILE%.matplotlib exists first
If exists, then use it (preserves existing user config)
If not, then use %LOCALAPPDATA%\matplotlib (new installs)
Updated test to set USERPROFILE to a temp dir to verify fresh install behavior

  • Existing Windows users: no change, their config stays where it is
  • New Windows users: get the proper %LOCALAPPDATA%\ location
  • Users can still override with \MPLCONFIGDIR\ if they want to migrate manually

@timhoffm
Copy link
Member

This compatibility looks reasonable to me. We can later decide whether we want to actively push towards the new location.

@melissawm melissawm added OS: Microsoft PR: bugfix Pull requests that fix identified bugs labels Jan 21, 2026
@scottshambaugh
Copy link
Contributor

scottshambaugh commented Feb 4, 2026

The fallback logic all looks correct to me, but could you please add a test for the case where %USERPROFILE%.matplotlib already exists? That wouldn't otherwise be exercised in CI, and I don't think too many of us on the dev team are on windows to verify that the migration is working.

Copy link
Contributor

@scottshambaugh scottshambaugh left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks like you need to rebase to main, but otherwise this looks good to me. Thanks for putting it together!

@scottshambaugh
Copy link
Contributor

Actually it looks like CI was unhappy for some other reason. Please rebase or re-push to kick off the tests again, and I'll merge after they pass.

@VedantMadane VedantMadane force-pushed the fix-windows-config-directory branch from dde2cbb to e610dcc Compare February 10, 2026 10:09
- Moves Windows config/cache to %LOCALAPPDATA%\matplotlib
- Maintains backwards compatibility with %USERPROFILE%\.matplotlib
- Fixes LCOV reporting on ARM runners
- Fixes Ruff linting in tests
- Corrects API change documentation filename
@VedantMadane VedantMadane force-pushed the fix-windows-config-directory branch from e610dcc to 2a0795f Compare February 10, 2026 10:14
@timhoffm
Copy link
Member

There's a script issue in the step "Filter C coverage".

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why is this file changed? It doesn't apply to Windows.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That file was changed because it contained a fatal YAML syntax error (a duplicated else block) within the "Filter C coverage" step.

Even though that specific workflow currently only runs on Linux and macOS runners, a syntax error in any workflow file can cause GitHub Actions to fail to parse the repository's CI configuration correctly leading to all checks failing.

Tim mentioned the script issue in the step Filter C coverage which is defined in that file.
Fixing this syntax error was required to resolve the "12 checks failing" allowing the CI pipeline to actually execute and report results for my changes.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@QuLogic you good with this? Your request changes is blocking at the moment

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No, this explanation does not make any sense. There is no duplicated else block being removed in this PR, because this PR introduced it in the first commit. There is no explanation why things are now being quoted, and if it is necessary, it's still unrelated to this PR.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

OS: Microsoft PR: bugfix Pull requests that fix identified bugs

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[ENH]: move .matplotlib folder from %USERPROFILE% on Windows

6 participants