Skip to content

Merge 2026.1#102

Merged
DetachHead merged 61 commits intomasterfrom
merge-2026.1
Mar 25, 2026
Merged

Merge 2026.1#102
DetachHead merged 61 commits intomasterfrom
merge-2026.1

Conversation

@DetachHead
Copy link
Owner

No description provided.

Vitaliy Konovalov and others added 30 commits March 18, 2026 17:05
…erences Microsoft.CodeAnalysis.Analyzers

(cherry picked from commit 198dfd74dc2b052b9e7c69b91216f9a1a5e21a9f)

NET-CR-18206

GitOrigin-RevId: 27093f6dee2d2384199b1e7bfde2eaf788c5e29d
PyDebugProcess implements PyStepIntoSupport (pydevd path unchanged).
PythonDapDebugProcess implements PyStepIntoSupport:
justMyCode=true: "Step Into My Code" enabled, "Step Into" disabled;
justMyCode=false → "Step Into My Code" disabled with a tooltip.
Add PyDapStepIntoAction as a DAP-aware replacement for the platform "Step Into" action in the debug toolbar.

Merge-request: IJ-MR-193319
Merged-by: Egor Eliseev <Egor.Eliseev@jetbrains.com>

(cherry picked from commit 6ee6b7afda307e11e4d477bfa9c05a2f80734b6e)

GitOrigin-RevId: a0a41d0e9decfcb9e9872114cbfb231cc2c3a0bc
Add a segmented button to Settings | Python | Debugger
Add ComboBoxAction in the Debug tool window toolbar (Python.DebuggerBackendSwitcher)
Show a one-time GotIt tooltip on the first debug session
Show a confirmation dialog when switching backend during an active session

Merge-request: IJ-MR-194172
Merged-by: Egor Eliseev <Egor.Eliseev@jetbrains.com>
(cherry picked from commit 965677f0668b3493290f9f3bb59ed6e7da2f2f38)

GitOrigin-RevId: 33211f8da8e83835f74ad9bb7de7cd2eea5dc407
Simply modify the configuration in the background and always restart the session.
If the session has already ended, hide the quick fix.

Merge-request: IJ-MR-194323
Merged-by: Egor Eliseev <Egor.Eliseev@jetbrains.com>

(cherry picked from commit fd6c55fda3950e756d62bf508b4e274f069282c0)

GitOrigin-RevId: b669a3abec5ba870965b9e0bef4a91e0aafdefcf
…gpy switcher UI

JupyterDebugBackendSwitchHandler — new handler for backend switching: restarts the Jupyter kernel for a clean state.
PyDebuggerBackendSwitcherAction — Beta instead of New for debugpy;
"Report Issue" now pre-fills the description with system information

Merge-request: IJ-MR-195507
Merged-by: Egor Eliseev <Egor.Eliseev@jetbrains.com>
(cherry picked from commit ba620baef07b931fe85f62e582dd075fdc2517c1)

GitOrigin-RevId: 6184721927109c492f5dabf8085f371a0905ae42
Merge-request: IJ-MR-195844
Merged-by: Egor Eliseev <Egor.Eliseev@jetbrains.com>
(cherry picked from commit 86f50c02787eb9af41e20d7014b9c8a2d6122910)

GitOrigin-RevId: 8724774a2e6f4e9140fb9701aa23ec526a77eb51
(cherry picked from commit 983304fb955d228d946ff75b0c3f20aa35a5d0f1)

IJ-CR-192634

GitOrigin-RevId: ced4dc6ce1313719fab195cf20954b393de2ba89
This will ensure that any new plugins appear in UI

GitOrigin-RevId: 35d21e259009c9ca26f7fb7ea9102275677b9567
…s, but only one is python module.

We only autoconfigure SDK when there is one module. But there might be other (non-python) modules. We must ignore them.


(cherry picked from commit 6c45d3678aa16f54ba6967b24a8dd8afdb7fa2f6)

IJ-CR-196680

GitOrigin-RevId: c97e21f04870df605f8bcfdf4e563009ff5c8654
…g DnD from project view

Use our startup performance events for that.
Not the best way, but the easiest one.
It would be nice to have this information in `local.exec` event, but it is very hard to propagate this information there.

(cherry picked from commit 6653119cd76874497d5be56b8d33e638b1a165b5)

IJ-CR-194740

GitOrigin-RevId: 038c151c047093ba5cf3390a0c6505efc4c4423d
Previously, we tracked subcommands for every terminal command. And reported subcommand only if it was specified for the particular command.
Actually, it doesn't matter whether some subcommand specified for any command in our allowlist or not. We just need to detect user patterns.
Also, it removes a lot of duplication from `subCommand` FUS field.

(cherry picked from commit bc2fcdef771656a98ab2a685e64e42e5cfede56d)

IJ-CR-194740

GitOrigin-RevId: d00483245dac3e19ad983dd44d758dfc81264b26
…and subcommands

This way we can distinguish "unknown subcommand" and "no subcommand" cases.

(cherry picked from commit 3e5ae06c0a11dd3511ff3c86f4fa3df20c48b8f2)

IJ-CR-194740

GitOrigin-RevId: d26ee14d78e533338799d7309ad157c76d90b8f7
We will report the longest known subcommand that matches the user command.
For example, if user command is `uv pip install foo`, and known subcommands set contains `pip install`, then we will report `CommandData("uv", "pip install")`.

(cherry picked from commit 094b7340eeb880d149cab1c257f41d3386eb03fe)

IJ-CR-194740

GitOrigin-RevId: 443672c2a7083540dcee0207ffbe207c7f88a589
(cherry picked from commit 0fef48f5920372cc5ce12505c5a395c04b848b88)

IJ-CR-194740

GitOrigin-RevId: 8a78538234129d827781965aba8986cfd395b455
…e path>'

It was reported as third.party before.

(cherry picked from commit 28e779faa393d2e84def6c1979ba2c60670d23d5)

IJ-CR-194740

GitOrigin-RevId: f12db3e045230f1b0ab28571b73475fa735c4c97
`FileComparisonFailedError` allows seeing diff of what is wrong. So, the expected value can be just copy-pasted to the `known-commands.txt`.

(cherry picked from commit 58135c1aa1027526515de3d6b2b70f94abb0d2e5)

IJ-CR-194740

GitOrigin-RevId: 6919895e00dd8cf654595624da25ba47188ef596
(cherry picked from commit f678767ba51dd1b7ec457c226eff5d17c0b67004)

IJ-CR-194740

GitOrigin-RevId: 145af606cc77f1428b8bba63d34757fb994471c3
…name

It is important for PowerShell cmdlets. Most of them can contain upper-case letters but actually can be invoked in any case. So, let's match the executable name case-insensitively.
Because of that, we have to store and report all command names in lower case for consistency.

(cherry picked from commit 6e4bb8d60a808f5fc36f4fdac01db211cbba1b30)

IJ-CR-194740

GitOrigin-RevId: b8333eece5c7c85e27430969a0ca84068b396303
Gradle case is handled separately. And subcommands were accidentally skipped for it.

(cherry picked from commit 517f534887996ab8e519c7f44d9476e65f65fc2b)

IJ-CR-194740

GitOrigin-RevId: d44b0299e8b94d038cc07b9314ceaddd5de11371
…mand fields are used

(cherry picked from commit 6ab7905a3ea05a6b98ff995306372141167f3d9c)

IJ-CR-194740

GitOrigin-RevId: f304909cd16f8c8516ab9b473a0adff3e37abb96
(cherry picked from commit 00fd75dae01bfab8e53f65d6b60bfb5265d5e7da)

GitOrigin-RevId: 1cdd91554e1fd479821f25d18f17450334ddc532
… suspended SDK resolution

- Convert PyModuleService (abstract class) to Kotlin interface
- Convert PyModuleServiceImpl to Kotlin with project-level scope
- Change from application-level to project-level service
- Add findPythonSdkWaitingForProjectModel suspend method that awaits
  JPS project model loading before resolving the SDK
- Mark old findPythonSdk as @ApiStatus.Obsolete
- Update all call sites to use getInstance(project)

(cherry picked from commit 4dc39a57dbc6063d37522fac8befe01329c10cde)
(cherry picked from commit 529405c76d8e2fa503ccc40e15dd0834dd59f469)

GitOrigin-RevId: c15be35cb8c16da918c3b15da9768f5538f6c5ef
…lows

- Add PythonSdkConfigurationMutex with StateFlow-based lock observation
  and tryWithLock that throws SdkConfigurationAlreadyInProgressException
- Add suspended Module.findPythonSdk() extension that waits for project
  model to load before resolving
- Wrap setupSdk in the global mutex with progress text reporting
- Wire mutex into InterpreterFixExecutor, PythonLanguageRuntimeUI
- Simplify PyAsyncFileInspectionRunner to use the shared mutex state

(cherry picked from commit ace82cf69f1ce88b7a851d063af553f5b6f665d4)
(cherry picked from commit 02f58779d332886406393410c582d94458c1db65)

GitOrigin-RevId: 823b393069ca4e0862b85560ceca472ef4f6ff2e
…guration

- Add autoConfigureSdkIfNeeded to sdkSuggestionTools that waits for
  project model and uses the global mutex
- Add early return in getModuleInfo when SDK is already configured
- Simplify ModulesSdkConfigurator to use autoConfigureSdkIfNeeded
- Simplify InterpreterSettingsQuickFix to use autoConfigureSdkIfNeeded
- Remove SDK-configured notification from PyProjectSdkConfiguration

(cherry picked from commit f1423427eeb433d379519e3b9d1af00b46fc869d)
(cherry picked from commit b81353d3af62f2d1f694d8c0d470d4495a01c989)

GitOrigin-RevId: 1b075eba8569d3eeb10e5ad6eed1730d4147e32e
…ts handling

- Add PySdkTransferredRootsListener that handles root transfer and
  virtualenv exclusion reactively on PySdkListener.TOPIC
- Remove switchToSdk function from AddInterpreterActions
- Register listener in intellij.python.community.impl.xml
- Update PySdkPopupFactory, advancedActions, PySdkFromEnvironmentVariable
  to set module.pythonSdk directly

(cherry picked from commit 989a0d0d0be5722a92be8709868b97343e4889ae)
(cherry picked from commit b5d01f47409b127020a3021b1f3dc7ff8147ce9c)

GitOrigin-RevId: b582a6ce8ba87a3189654658528d8a553e64f80c
…project.toml listener

- Simplify PyConfigurableInterpreterList: fix comparator transitivity
  violation, remove unused sorting logic
- Simplify PyVenvSdkConfiguration to use PathHolder.Eel-based createSdk
- Remove unused PyDetectedSdk.setupSdk from PySdkExt
- Simplify pyproject.toml notification listener to use flow.first
  instead of collect+cancel pattern

(cherry picked from commit 35db9db995d4847fd2155b76b78552dd03d8cb7f)
(cherry picked from commit 0419a4761996cc2592fb0df560846170cbe4434d)

GitOrigin-RevId: 712eb1ac1514c9d51c75504fae8d82d79282427d
Previously the fixture created the venv directly as the module content
root. Since inner virtualenvs are excluded from the module source roots,
this caused the entire content root to be excluded. Create the venv in
a .venv subdirectory instead, matching real-world project layout.

(cherry picked from commit 492e2cfa9cdc01af91610f8579d771dd3a8eaa2d)
(cherry picked from commit 6a5f5491e46b39c28089e73bd15f5e6f8af2d192)

GitOrigin-RevId: 74a329f9fc8e8426f117ecd6e4b67d40d7b1b49b
Wait for indexes to be ready in setUp to prevent a race condition
where the previous test's tearDown modifies source roots, triggering
async reindexing that may not complete before checkHighlighting runs.

(cherry picked from commit 3f5aabba7480ee3f19d70b56a50977952a43a43e)
(cherry picked from commit 4dd46e1936ef3fcee055de7631436a25473b0af6)

GitOrigin-RevId: 0f8347ce79fd50c89ad47d698276dcc7b6e9261f
…tory

The test was looking for the Python binary directly in the temp
directory instead of the `.venv` subdirectory where the virtual
environment is actually created. Also sort imports alphabetically.

(cherry picked from commit 4fba4755f3ee51e866da299e538a53a87c6a68d5)

IJ-MR-196794

(cherry picked from commit 8f32934772fbf81952e16234354b1f34dd06c9e6)

GitOrigin-RevId: 49890a3c0302cbfc5e6dd6211da2b30a9fcb2304
…callers

setupSdk held pythonSdkConfigurationMutex internally, but callers also
acquired the same non-reentrant mutex, causing a deadlock (coroutine
suspended forever waiting for itself).

Fix: remove the lock from setupSdk and add it to all SDK creation entry
points instead:

- PythonAddLocalInterpreterPresenter.okClicked
- NewProjectWizardPythonData.setupProject
- PyV3BaseProjectSettings.generateAndGetSdk
- PySdkFromEnvironmentVariableConfigurator (converted from runInEdt
  to coroutine with mutex + EDT context)
- createVenvAndSdk callers: lib.kt (misc project), welcome screen,
  features trainer (lock added at call site since auto-configurators
  already hold the lock when calling createVenvAndSdk)

GitOrigin-RevId: f1d8b2e1c4a839b36cfed3a8fe3078df911fd523
nskvortsov and others added 28 commits March 19, 2026 17:24
(cherry picked from commit d0f85dca12162f9694829fee95f15a52791922ea)

IJ-MR-196869

GitOrigin-RevId: 278f8952dfc7a73032da41d08250560dce604680
Use the login shell (with /bin/sh fallback) to run `test -f` instead
of directly invoking `/usr/bin/test`, which may not exist on minimal
remote systems or Docker containers.

Also simplify `executeCommand` to return `PyResult<String>` and
`getShell` to return `String` with a `/bin/sh` fallback, removing
unnecessary error wrapping.


(cherry picked from commit a03e1156dd81bf4398c763dfd009bd23061973be)

IJ-MR-196962

GitOrigin-RevId: 3c03760b5e358e6e77d53da79b63d55a8724115a
(cherry picked from commit 094ce8db0084f9cb588d538a640f9c7951440771)

IJ-MR-192981

(cherry picked from commit cae1acc0c274165038b09395475b9ad311a5acee)

GitOrigin-RevId: 137bfc717fd1a87ed485dc97402d23436d283e0e
…ons. Toolwindow was updating with a noticeable delay because packagesChanged event was fired after slow async tasks and SDK changes relied on indirect rootsChanged. Now events fire immediately and SDK switches are handled directly via PySdkListener.

(cherry picked from commit 99e4cf56cc3ef937e8c8f6a7e448d44d53f0df00)

IJ-MR-196949

GitOrigin-RevId: 10a87fe7eecffed6f1175e644cdd1c3e7d87fdf4
…de (IJPL-236292)(IJ-MR-196758)

(cherry picked from commit 20c567aecca47d06d4b52897d7969ce5c19428bd)


(cherry picked from commit 2cdb95054498382859bd028eacb91446af6b060e)

IJ-CR-197089

GitOrigin-RevId: a32d2cdefd11ea349be63d1af2364bf5ef51ccc5
…viceImpl

If the jpsProjectLoaded callback is never invoked (e.g. due to a platform
bug), findPythonSdkWaitingForProjectModel hangs forever. Add a 10-second
safety-net coroutine that auto-completes the deferred and logs an error.
The timeout accounts for the 5-second delay in JpsGlobalModelSynchronizerImpl
and the 1-second delay in ModuleManagerComponentBridgeInitializer.


(cherry picked from commit 93f08a979d8dc4ddf578eab618191275d14f82c7)

IJ-MR-197117

GitOrigin-RevId: ccb5b6d391b8f577f910dd61111357ef98a54546
…UI fixes

- Fix detectEnvironments crash on non-local filesystems (Docker, SSH, WSL)
- Move UV-specific detection logic from FileSystem to UvPathOperations
- Add EEL API check before scanning directories
- Check pyvenv.cfg for "uv = " to distinguish UV vs regular venvs
- Fix interpreterPath not set on PyTargetAwareAdditionalData for Docker
- Fix browsed environment not appearing in combo box dropdown
- Fix validation race when tool validation completes after detection
- Add FileSystem.resolvePythonHome() as counterpart to resolvePythonBinary()
- Remove redundant venvPath parameter (derive from pythonBinary)
- Clean up remote SDK names: remove "Remote" prefix, redundant version,
  and unreadable Docker SHA hashes


(cherry picked from commit fa5b11e22e29c189cf3ff7bc58a080b329596224)

IJ-MR-197162

GitOrigin-RevId: 80f311deff7ba3ca2a48b91c68ee81e36e0cfc2a
… resolve package names from pyproject.toml

- Skip [project.optional-dependencies] and [dependency-groups] in NotInstalledRequirementInspection (previously only [build-system] was excluded)
- Filter DeclaredButNotInstalledPackagesChecker to only report packages from [project].dependencies, not from optional/dev groups
- Resolve workspace member package name from pyproject.toml instead of using module name in uv tree --package
- Parse dependency group/extra annotations from uv tree output
- Strip extras from package names (e.g. uvicorn[standard] -> uvicorn)

(cherry picked from commit 958696becd90026016c1367128f48e4861f5c5ac)

IJ-MR-196282

GitOrigin-RevId: dbf32ba9cf98d39efd25ab5244548412f075eb3f
…kage

Right-clicking a package while another package's context menu was open showed stale actions because the popup handler did not update the description controller. The TreeSelectionListener skips the update when the tree lacks focus (e.g. a previous popup stole it), so the SELECTED_PACKAGE_DATA_CONTEXT remained stale. Now the popup handler calls handlePackageSelection directly before showing the menu.

(cherry picked from commit 81c0f361e1e9ea9d45ba74e83933e91e1f216125)

IJ-MR-197068

GitOrigin-RevId: 82dc54ef29b901429407803e7b1b98d1fa7d9320
These changes provide correct handling of protocol methods defined in metaclasses.
Such methods have the highest priority when operating on class objects, even if the class inherits a direct implementation of the protocol, e.g., Iterable

(cherry picked from commit 1556c15d2b78dfe8f02797862d75e24462b637de)


(cherry picked from commit 89676de48b29d89219898b3d99f08f3e4f27863d)

IJ-CR-196674

GitOrigin-RevId: d62e8592a6808001910ba433fae83f8ed3cff392
The issue was highlighted by the following semantics:
`Enum`'s metaclass is `EnumMeta` and implements iterable protocol as
```
def __iter__(self: type[_EnumMemberT]) -> Iterator[_EnumMemberT]: ...
```
Thus, we need to correctly bind the actual type of `Enum` implementation we're working with (say, `MyEnum`) to `_EnumMemberT` to be able to infer `Iterator[MyEnum]` and then get the correct type of e.g., `set(MyEnum)`

(cherry picked from commit 53b26f963bdf8746c1f8fde5ee41aa37c415d920)


(cherry picked from commit b0ce2298ae6a3e4706b55a56a6ba357ae9f6470d)

IJ-CR-196674

GitOrigin-RevId: 20106ebfa230695d8000f81c5f3f56011b9b4570
(cherry picked from commit 0054a59cef0e90504b73f39df63b742e065e5a73)

IJ-MR-197159

GitOrigin-RevId: 5b869b46c78a4874be0c78b3789d4154308aa13f
GitOrigin-RevId: d7fc9f09743527a790ae4ab8836c55e7ea0e7297
(cherry picked from commit 1da884badf9455b9763b71c818dc5861a247e8a8)

IJ-CR-197366

GitOrigin-RevId: 65de79e0466517af5ef57863f0fe7b3178c1b096
…s-project notifications

The mutex was a global singleton whose isLocked StateFlow was observed by
every project's InterpreterFixExecutor. A lock state change from any
project fanned out updateAllNotifications() to all projects, triggering
stale cache refreshes with visible "Checking existing environments"
progress bars in idle projects.

Replace the global val with a per-project service so each project
observes only its own mutex state.


(cherry picked from commit cc14dce7d07231f6d7d4c3f654cdd8d3a2099ffc)

IJ-MR-197413

GitOrigin-RevId: 9d39149a66c57bb9b0a1de88c2c74524ec089519
…ter SDK initialization

showNoSdkMessage() switches content panel to noSdkPanel, but resetSearch/showSearchResult never switched it back to scrollingPackageListComponent, so the message persisted even after packages were loaded.


Merge-request: IJ-MR-197397
Merged-by: Timur Malanin <timur.malanin@jetbrains.com>

(cherry picked from commit 388c3fd09a46d8f66d9198c63a41615043eebb81)

IJ-MR-197397

GitOrigin-RevId: 8e41421d01eeaa2aee6ac09f0a012792ca37fd43
  Add `allDeclaredPackages()` to `PythonPackageManager`, implemented
  for UV (`uv tree --frozen`) and Poetry (`poetry show --tree`).
  Fixes all packages appearing grey in non-workspace UV projects
  where `extractDependencies` fails due to missing `--package` flag.

(cherry picked from commit 0fbccda1831170f4fe4a49873556344d7e81d3e7)

IJ-MR-197461

GitOrigin-RevId: 43dd6528b9f793a110fb13fd5c7cb02db11869b9
(cherry picked from commit a9f9cf79eb27ff9d0d475ba8daec0bfaaa09d982)

IJ-MR-197500

GitOrigin-RevId: d1c000e07d5533abac894a0220b385916e5600dc
…ntext instead of RemDevContext in case of rem dev

(cherry picked from commit 2eac4b82c824de3664ac7554006a15f01e7504f4)


(cherry picked from commit 87af03428ebe72a85a271fc6517c69d8dfb49eb7)

IJ-CR-197507

GitOrigin-RevId: 1d97b945b05684a26888fbd56b3c6c0f63fc5eea
Current reports do not include class name due to overriden #toString


(cherry picked from commit ce8a9120f53ff758039d562cccfbb9843a259749)

IJ-CR-197496

GitOrigin-RevId: 3ec2e62542857923b5a2676ee47a680c79c4ca77
# Conflicts:
#	community-resources/resources/idea/IdeaApplicationInfo.xml
@DetachHead DetachHead merged commit f2b43c0 into master Mar 25, 2026
8 of 9 checks passed
@DetachHead DetachHead deleted the merge-2026.1 branch March 25, 2026 13:52
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.