diff --git a/python/pluginResources/intellij.python.community.impl.xml b/python/pluginResources/intellij.python.community.impl.xml
index d1b3c9e56146..81ac244c237e 100644
--- a/python/pluginResources/intellij.python.community.impl.xml
+++ b/python/pluginResources/intellij.python.community.impl.xml
@@ -1141,6 +1141,7 @@
icon="com.intellij.icons.AllIcons.Actions.Install"/>
+
diff --git a/python/src/com/jetbrains/python/packaging/management/PythonPackageManagerAction.kt b/python/src/com/jetbrains/python/packaging/management/PythonPackageManagerAction.kt
index 3a90d05eb071..fe89debe5360 100644
--- a/python/src/com/jetbrains/python/packaging/management/PythonPackageManagerAction.kt
+++ b/python/src/com/jetbrains/python/packaging/management/PythonPackageManagerAction.kt
@@ -11,6 +11,7 @@ import com.intellij.openapi.application.edtWriteAction
import com.intellij.openapi.fileEditor.FileDocumentManager
import com.intellij.openapi.module.ModuleUtil
import com.intellij.openapi.project.DumbAwareAction
+import com.intellij.openapi.util.NlsContexts
import com.intellij.openapi.vfs.VirtualFile
import com.intellij.python.pyproject.PY_PROJECT_TOML
import com.jetbrains.python.errorProcessing.ErrorSink
@@ -106,3 +107,9 @@ internal fun PythonPackageManager.isRunLocked(): Boolean {
return CancellableJobSerialRunner.isRunLocked(this.sdk)
}
+internal suspend fun PythonPackageManager.runSynchronized(
+ title: @NlsContexts.ProgressTitle String,
+ runnable: suspend () -> PyResult,
+): PyResult {
+ return CancellableJobSerialRunner.run(this.project, this.sdk, title, runnable)
+}
\ No newline at end of file
diff --git a/python/src/com/jetbrains/python/packaging/management/ui/PythonPackageManagerUI.kt b/python/src/com/jetbrains/python/packaging/management/ui/PythonPackageManagerUI.kt
index 1fdb98a450e3..25e3ead9e2cc 100644
--- a/python/src/com/jetbrains/python/packaging/management/ui/PythonPackageManagerUI.kt
+++ b/python/src/com/jetbrains/python/packaging/management/ui/PythonPackageManagerUI.kt
@@ -142,8 +142,8 @@ class PythonPackageManagerUI(val manager: PythonPackageManager, val sink: ErrorS
@ApiStatus.Internal
suspend fun executeCommand(
progressTitle: @Nls String,
- operation: suspend (() -> PyResult?),
- ): T? = PythonPackageManagerUIHelpers.runPackagingOperationMaybeBackground(manager.project, sink, progressTitle) {
+ operation: suspend (() -> PyResult),
+ ): T? = PythonPackageManagerUIHelpers.runPackagingOperationMaybeBackground(manager, sink, progressTitle) {
operation()
}
diff --git a/python/src/com/jetbrains/python/packaging/management/ui/PythonPackageManagerUIHelpers.kt b/python/src/com/jetbrains/python/packaging/management/ui/PythonPackageManagerUIHelpers.kt
index 436d6665fb2d..314bda313e2f 100644
--- a/python/src/com/jetbrains/python/packaging/management/ui/PythonPackageManagerUIHelpers.kt
+++ b/python/src/com/jetbrains/python/packaging/management/ui/PythonPackageManagerUIHelpers.kt
@@ -2,11 +2,9 @@
package com.jetbrains.python.packaging.management.ui
import com.intellij.openapi.application.EDT
-import com.intellij.openapi.project.Project
import com.intellij.openapi.ui.popup.Balloon
import com.intellij.openapi.ui.popup.JBPopupFactory
import com.intellij.openapi.util.NlsContexts
-import com.intellij.platform.ide.progress.withBackgroundProgress
import com.intellij.ui.awt.RelativePoint
import com.intellij.util.ui.JBUI
import com.jetbrains.python.errorProcessing.ErrorSink
@@ -14,6 +12,8 @@ import com.jetbrains.python.errorProcessing.PyResult
import com.jetbrains.python.errorProcessing.emit
import com.jetbrains.python.getOrNull
import com.jetbrains.python.onFailure
+import com.jetbrains.python.packaging.management.PythonPackageManager
+import com.jetbrains.python.packaging.management.runSynchronized
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext
import javax.swing.JLabel
@@ -21,26 +21,14 @@ import javax.swing.UIManager
internal object PythonPackageManagerUIHelpers {
suspend fun runPackagingOperationMaybeBackground(
- project: Project,
+ manager: PythonPackageManager,
errorSink: ErrorSink?,
@NlsContexts.ProgressTitle title: String,
- operation: suspend (() -> PyResult?),
- ): T? = withBackgroundProgress(project = project, title, cancellable = true) {
- runPackagingOperationMaybeShowErrorDialog(errorSink, project) {
- withContext(Dispatchers.Default) {
- operation()
- }
- }
- }
-
- private suspend fun runPackagingOperationMaybeShowErrorDialog(
- errorSink: ErrorSink?,
- project: Project,
- operation: suspend (() -> PyResult?),
+ operation: suspend (() -> PyResult),
): T? {
- val pyResult = operation() ?: return null
+ val pyResult = manager.runSynchronized(title, operation)
return pyResult.onFailure {
- errorSink?.emit(it, project)
+ errorSink?.emit(it, manager.project)
}.getOrNull()
}