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() }