[eel] move process utils in to the eel-provider module

GitOrigin-RevId: 8beffa883a1de89e7d487ada51df190d5347cbee
This commit is contained in:
Andrii Zinchenko
2025-01-29 19:14:48 +01:00
committed by intellij-monorepo-bot
parent c686e1f364
commit da7deee35d
7 changed files with 31 additions and 31 deletions

View File

@@ -1,5 +0,0 @@
// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
@ApiStatus.Internal
package com.intellij.platform.eel.impl.utils;
import org.jetbrains.annotations.ApiStatus;

View File

@@ -1,28 +1,29 @@
// Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.intellij.platform.eel.impl.utils
package com.intellij.platform.eel.provider.utils
import com.intellij.execution.process.ProcessOutput
import com.intellij.openapi.progress.runBlockingMaybeCancellable
import com.intellij.platform.eel.*
import com.intellij.platform.eel.path.EelPath
import com.intellij.platform.eel.provider.ResultErrImpl
import com.intellij.platform.eel.provider.ResultOkImpl
import com.intellij.platform.eel.provider.getEelDescriptor
import com.intellij.platform.eel.provider.utils.asEelChannel
import com.intellij.platform.eel.provider.utils.copy
import com.intellij.util.io.computeDetached
import kotlinx.coroutines.DelicateCoroutinesApi
import kotlinx.coroutines.coroutineScope
import kotlinx.coroutines.launch
import kotlinx.coroutines.withTimeoutOrNull
import org.jetbrains.annotations.ApiStatus
import org.jetbrains.annotations.ApiStatus.Internal
import java.io.ByteArrayOutputStream
import java.nio.file.Path
import kotlin.io.path.pathString
import kotlin.time.Duration
import kotlin.time.Duration.Companion.days
val EelProcessExecutionResult.stdoutString: String get() = String(stdout)
val EelProcessExecutionResult.stderrString: String get() = String(stderr)
class EelProcessExecutionResult(val exitCode: Int, val stdout: ByteArray, val stderr: ByteArray)
/**
* Function that awaits the completion of an [EelProcess] and retrieves its execution result,
* including the exit code, standard output, and standard error streams.
@@ -32,15 +33,14 @@ import kotlin.time.Duration.Companion.days
* val process = eelApi.exec.executeProcess("ls", "-la").getOrThrow()
* val result = process.awaitProcessResult()
* println("Exit code: ${result.exitCode}")
* println("Standard Output: ${result.stdout}")
* println("Standard Error: ${result.stderr}")
* println("Standard Output: ${String(result.stdout)}")
* println("Standard Error: ${String(result.stderr)}")
* ```
*
* @see EelProcess
* @see ProcessOutput
*/
@OptIn(DelicateCoroutinesApi::class)
suspend fun EelProcess.awaitProcessResult(): ProcessOutput {
suspend fun EelProcess.awaitProcessResult(): EelProcessExecutionResult {
return computeDetached {
ByteArrayOutputStream().use { out ->
ByteArrayOutputStream().use { err ->
@@ -54,14 +54,14 @@ suspend fun EelProcess.awaitProcessResult(): ProcessOutput {
}
}
ProcessOutput(String(out.toByteArray()), String(err.toByteArray()), exitCode.await(), false, false)
EelProcessExecutionResult(exitCode.await(), out.toByteArray(), err.toByteArray())
}
}
}
}
fun EelApi.whereBlocking(exe: String): EelPath? {
return runBlockingMaybeCancellable { where(exe) }
return runBlockingMaybeCancellable { exec.where(exe) }
}
/**
@@ -85,7 +85,7 @@ fun EelApi.whereBlocking(exe: String): EelPath? {
* }
* ```
*/
suspend fun EelApi.where(exe: String): EelPath? {
suspend fun EelExecApi.where(exe: String): EelPath? {
val tool = when (this) {
is EelPosixApi -> "which"
is EelWindowsApi -> "where.exe"
@@ -99,7 +99,7 @@ suspend fun EelApi.where(exe: String): EelPath? {
return null
}
else {
return EelPath.parse(result.stdout.trim(), descriptor)
return EelPath.parse(result.stdoutString.trim(), descriptor)
}
}
@@ -111,9 +111,9 @@ suspend fun EelApi.where(exe: String): EelPath? {
* withTimeout(10.seconds) {python.exec("-v")}.getOr{return it}
* ```
*/
@Internal
@ApiStatus.Internal
@ApiStatus.Experimental
suspend fun Path.exec(vararg args: String, timeout: Duration = Int.MAX_VALUE.days): EelResult<ProcessOutput, EelExecApi.ExecuteProcessError?> {
suspend fun Path.exec(vararg args: String, timeout: Duration = Int.MAX_VALUE.days): EelResult<EelProcessExecutionResult, EelExecApi.ExecuteProcessError?> {
val process = getEelDescriptor().upgrade().exec.executeProcess(pathString, *args).getOr { return it }
val output = withTimeoutOrNull(timeout) {

View File

@@ -9,9 +9,10 @@ import com.intellij.openapi.progress.runBlockingMaybeCancellable
import com.intellij.platform.eel.*
import com.intellij.platform.eel.fs.*
import com.intellij.platform.eel.path.EelPath
import com.intellij.platform.eel.impl.utils.awaitProcessResult
import com.intellij.platform.eel.provider.asNioPath
import com.intellij.platform.eel.provider.upgradeBlocking
import com.intellij.platform.eel.provider.utils.awaitProcessResult
import com.intellij.platform.eel.provider.utils.stdoutString
import com.intellij.util.suspendingLazy
import kotlinx.coroutines.CoroutineScope
import java.nio.file.Path
@@ -96,7 +97,7 @@ internal fun javaHomeFinderEel(descriptor: EelDescriptor): JavaHomeFinderBasic {
if (result.exitCode != 0) {
return@runBlockingMaybeCancellable ""
}
result.stdout
result.stdoutString
}
}
)

View File

@@ -26,12 +26,14 @@ import com.intellij.openapi.util.SystemInfo
import com.intellij.openapi.util.io.FileUtil
import com.intellij.openapi.util.registry.Registry
import com.intellij.platform.eel.*
import com.intellij.platform.eel.impl.utils.awaitProcessResult
import com.intellij.platform.eel.path.EelPath
import com.intellij.platform.eel.provider.asEelPath
import com.intellij.platform.eel.provider.asNioPath
import com.intellij.platform.eel.provider.getEelDescriptor
import com.intellij.platform.eel.provider.upgradeBlocking
import com.intellij.platform.eel.provider.utils.awaitProcessResult
import com.intellij.platform.eel.provider.utils.stderrString
import com.intellij.platform.eel.provider.utils.stdoutString
import com.intellij.util.Urls
import com.intellij.util.io.HttpRequests
import com.intellij.util.io.delete
@@ -139,7 +141,7 @@ class JdkInstaller : JdkInstallerBase() {
val process = eel.exec.execute(builder).getOrThrow()
try {
withTimeout(timeout.milliseconds) {
process.awaitProcessResult()
process.awaitProcessResult().let { ProcessOutput(it.stdoutString, it.stderrString, it.exitCode, false, false) }
}
}
catch (_: TimeoutCancellationException) {

View File

@@ -29,11 +29,11 @@ import com.intellij.openapi.util.registry.Registry
import com.intellij.platform.eel.EelApi
import com.intellij.platform.eel.LocalEelApi
import com.intellij.platform.eel.fs.getPath
import com.intellij.platform.eel.impl.utils.where
import com.intellij.platform.eel.provider.asNioPath
import com.intellij.platform.eel.provider.asNioPathOrNull
import com.intellij.platform.eel.provider.getEelDescriptor
import com.intellij.platform.eel.provider.utils.fetchLoginShellEnvVariablesBlocking
import com.intellij.platform.eel.provider.utils.where
import com.intellij.platform.ide.progress.runWithModalProgressBlocking
import com.intellij.platform.ide.progress.withBackgroundProgress
import com.intellij.platform.util.progress.withProgressText
@@ -141,7 +141,7 @@ object MavenEelUtil {
result.add(MavenInSpecificPath(home))
}
val path = runBlockingMaybeCancellable { where("mvn") }?.asNioPathOrNull()?.parent?.parent
val path = runBlockingMaybeCancellable { exec.where("mvn") }?.asNioPathOrNull()?.parent?.parent
if (path != null && isValidMavenHome(path)) {
result.add(MavenInSpecificPath(path))
}

View File

@@ -12,11 +12,11 @@ import com.intellij.openapi.util.NlsSafe
import com.intellij.openapi.util.text.HtmlChunk
import com.intellij.openapi.util.text.StringUtil
import com.intellij.platform.eel.EelDescriptor
import com.intellij.platform.eel.impl.utils.where
import com.intellij.platform.eel.path.EelPath.Companion.parse
import com.intellij.platform.eel.path.pathSeparator
import com.intellij.platform.eel.provider.asNioPath
import com.intellij.platform.eel.provider.getEelDescriptor
import com.intellij.platform.eel.provider.utils.where
import com.intellij.psi.PsiElement
import com.intellij.psi.PsiFile
import com.intellij.psi.impl.source.tree.LeafPsiElement
@@ -110,7 +110,7 @@ internal class ShDocumentationProvider(private val scope: CoroutineScope) : Docu
}
}
eel.where("man")?.toString()
eel.exec.where("man")?.toString()
}
}

View File

@@ -2,7 +2,9 @@ package com.jetbrains.python
import com.intellij.openapi.util.NlsSafe
import com.intellij.platform.eel.getOr
import com.intellij.platform.eel.impl.utils.exec
import com.intellij.platform.eel.provider.utils.exec
import com.intellij.platform.eel.provider.utils.stderrString
import com.intellij.platform.eel.provider.utils.stdoutString
import com.jetbrains.python.PySdkBundle.message
import com.jetbrains.python.Result.Companion.failure
import com.jetbrains.python.psi.LanguageLevel
@@ -47,9 +49,9 @@ suspend fun PythonBinary.executeWithResult(vararg args: String): Result<@NlsSafe
return failure(text)
}
return if (output.exitCode != 0) {
failure(message("python.get.version.error", pathString, "code ${output.exitCode}, {output.stderr}"))
failure(message("python.get.version.error", pathString, "code ${output.exitCode}, ${output.stderrString}"))
}
else {
Result.success(output.stdout)
Result.success(output.stdoutString)
}
}