Open akthe-at opened 2 months ago
@snowsignal I have more information, I think this revelation might make you want to close this issue?
I had a hunch and moved the simple .py featured above from the location of "~"
or C:/Users/FooBar/
to a much more nested directory like ~/config/test/
and this problem no longer persisted.
It appears the issue is that formatting with ruff times out when the file is in the ~/ directory because it is busy parsing all of the sub-directories?
I've ran into this as well, it's very confusing. The ruff Lsp would be delayed on startup if a modified python file is in a top level folder without a config file (i.e. outside of project directory). I noticed in Lsp logs that ruff is walking all subdirectories looking for a config file.
I don't understand why ruff should be looking for a config file in subdirectories? Shouldn't it be the other way around i.e it should walk the parent directories to look for the config. This seems like a bug to me.
Cc @dhruvmanila
I think it has to scan sub folders in case you have a configuration e.g. only in the src
directory. We then want to apply that configuration to src
only, but fall back to the default configuration for everything else.
I wonder if we ignore directories like .git
etc when walking. If not, then that could add a significant overhead.
@MichaReiser - We ignore them now. We didn't in the initial beta release.
I think it has to scan sub folders in case you have a configuration e.g. only in the
src
directory. We then want to apply that configuration tosrc
only, but fall back to the default configuration for everything else.I wonder if we ignore directories like
.git
etc when walking. If not, then that could add a significant overhead.
I am confused. Surely if I am editing a file from outside the src/ directory, then even if you find a config there it shouldn't apply to the file I am editing, right?
Right now if I am editing a python file in me $HOME, it seems to walk the entirety of my HOME which seems suboptimal:-)
I'm looking into this. The ruff check t.py
command where t.py
file is in the home directory is instantaneous. So, I'm guessing we're doing extra work in the server compared to what's being done on the command-line.
Looking at the following logs, it does seem like we're traversing the entire home directory to build up the index which I think was intentional in https://github.com/astral-sh/ruff/pull/10950.
[START][2024-07-02 11:17:44] LSP logging initiated
[ERROR][2024-07-02 11:17:44] .../vim/lsp/rpc.lua:770 "rpc" "/Users/dhruv/.local/bin/ruff" "stderr" "warning: The top-level linter settings are deprecated in favour of their counterparts in the `lint` section. Please update the following options in `projects/algorithms_keeper/pyproject.toml`:\n - 'ignore' -> 'lint.ignore'\n - 'select' -> 'lint.select'\n - 'mccabe' -> 'lint.mccabe'\n - 'pylint' -> 'lint.pylint'\n - 'per-file-ignores' -> 'lint.per-file-ignores'\n"
[ERROR][2024-07-02 11:18:10] .../vim/lsp/rpc.lua:770 "rpc" "/Users/dhruv/.local/bin/ruff" "stderr" "warning: The top-level linter settings are deprecated in favour of their counterparts in the `lint` section. Please update the following options in `Library/Caches/uv/archive-v0/iWen-UJ1Onc60Mw9JA5ey/pandas/pyproject.toml`:\n - 'ignore' -> 'lint.ignore'\n - 'select' -> 'lint.select'\n - 'typing-modules' -> 'lint.typing-modules'\n - 'unfixable' -> 'lint.unfixable'\n - 'per-file-ignores' -> 'lint.per-file-ignores'\n"
[ERROR][2024-07-02 11:18:11] .../vim/lsp/rpc.lua:770 "rpc" "/Users/dhruv/.local/bin/ruff" "stderr" "warning: The top-level linter settings are deprecated in favour of their counterparts in the `lint` section. Please update the following options in `.cargo/registry/src/index.crates.io-6f17d22bba15001f/pep440_rs-0.3.12/pyproject.toml`:\n - 'per-file-ignores' -> 'lint.per-file-ignores'\n"
[ERROR][2024-07-02 11:18:17] .../vim/lsp/rpc.lua:770 "rpc" "/Users/dhruv/.local/bin/ruff" "stderr" "warning: The top-level linter settings are deprecated in favour of their counterparts in the `lint` section. Please update the following options in `work/astral/parser-checkouts/openai-python/pyproject.toml`:\n - 'ignore' -> 'lint.ignore'\n - 'ignore-init-module-imports' -> 'lint.ignore-init-module-imports'\n - 'select' -> 'lint.select'\n - 'unfixable' -> 'lint.unfixable'\n - 'per-file-ignores' -> 'lint.per-file-ignores'\n"
[ERROR][2024-07-02 11:18:17] .../vim/lsp/rpc.lua:770 "rpc" "/Users/dhruv/.local/bin/ruff" "stderr" "warning: The top-level linter settings are deprecated in favour of their counterparts in the `lint` section. Please update the following options in `work/astral/parser-checkouts/matplotlib/pyproject.toml`:\n - 'external' -> 'lint.external'\n - 'ignore' -> 'lint.ignore'\n - 'select' -> 'lint.select'\n - 'pydocstyle' -> 'lint.pydocstyle'\n - 'per-file-ignores' -> 'lint.per-file-ignores'\n"
...
We ignore them now. We didn't in the initial beta release.
I don't think we're ignoring them. I just logged the directories that we're visiting and it is visiting the .git
directory:
[..]
47.573640042s INFO main ruff_server::session::index::ruff_settings: Visiting "/Users/dhruv/git/pyright/.git"
47.966425417s INFO main ruff_server::session::index::ruff_settings: Visiting "/Users/dhruv/git/vscode/.git"
48.093653667s INFO main ruff_server::session::index::ruff_settings: Visiting "/Users/dhruv/git/black/.git"
48.093867208s INFO main ruff_server::session::index::ruff_settings: Visiting "/Users/dhruv/git/black/.git/objects"
48.093895917s INFO main ruff_server::session::index::ruff_settings: Visiting "/Users/dhruv/git/black/.git/objects/pack"
48.093932625s INFO main ruff_server::session::index::ruff_settings: Visiting "/Users/dhruv/git/black/.git/objects/info"
[..]
Ok, we are ignoring the .git
directory but not all of them:
0.155401750s INFO main ruff_server::session::index::ruff_settings: Visiting "/Users/dhruv/work/astral/parser-checkouts/home-assistant-core/.git"
0.155417292s DEBUG main ruff_server::session::index::ruff_settings: Ignored path via `exclude`: /Users/dhruv/work/astral/parser-checkouts/home-assistant-core/.git
And via a Python file in home directory:
51.116335792s INFO main ruff_server::session::index::ruff_settings: Visiting "/Users/dhruv/git/oxc/.git"
51.116371750s INFO main ruff_server::session::index::ruff_settings: Visiting "/Users/dhruv/git/oxc/.git/objects"
51.116647917s INFO main ruff_server::session::index::ruff_settings: Visiting "/Users/dhruv/git/oxc/.git/objects/pack"
[..]
51.168634667s INFO main ruff_server::session::index::ruff_settings: Visiting "/Users/dhruv/git/kitty/.git"
51.168642167s DEBUG main ruff_server::session::index::ruff_settings: Ignored path via `exclude`: /Users/dhruv/git/kitty/.git
I think what is happening is that the exclusion is using the existing index which is currently being built: https://github.com/astral-sh/ruff/blob/25080acb7ad899f1e0ed933582662d9699ef5424/crates/ruff_server/src/session/index/ruff_settings.rs#L145-L147
But, it doesn't contain the resolved settings until it encounters a configuration file and only then it'll start excluding any relevant directories for the matching paths. I think this is an expected behavior.
There are two more options that could be implemented here:
I initially posted this in #11258 as an issue I noticed but I figured it was going to be fixed with the associated PR(#11266). However with ruff 0.4.4 I noticed that the problem described below still persists. I am going to attach the LSP error from neovim, it appears to have a lot of repeating messages so I apologize.
I am also going to copy and paste the lsp log from ~2 minutes later when I tried again in the same file (without closing it, just waiting ~ 2 minutes, and it successfully formatted.