Skip to content

Commit 08dedea

Browse files
Merge pull request #188 from Project-Env/feature/tool-excluder-embedded-mode
Fix tool binary root exclusion in case using embedded CLI
2 parents cd8d11c + 4e38666 commit 08dedea

File tree

5 files changed

+76
-33
lines changed

5 files changed

+76
-33
lines changed

src/main/kotlin/io/projectenv/intellijplugin/listeners/ProjectEnvToolsRootExcluder.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ class ProjectEnvToolsRootExcluder(val project: Project) : ProjectEnvToolsListene
4545
val roots = HashSet<VirtualFile>()
4646
for (infos in toolInfos.allToolInfos.values) {
4747
for (info in infos) {
48-
if (info.toolBinariesRoot == null) {
48+
if (info.toolBinariesRoot == null || info.toolBinariesRoot.isEmpty) {
4949
continue
5050
}
5151

src/main/kotlin/io/projectenv/intellijplugin/services/impl/ProjectEnvServiceImpl.kt

+9-16
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package io.projectenv.intellijplugin.services.impl
22

3-
import com.intellij.notification.NotificationType
43
import com.intellij.openapi.components.service
54
import com.intellij.openapi.progress.ProgressIndicator
65
import com.intellij.openapi.progress.ProgressManager
@@ -19,14 +18,13 @@ import io.projectenv.core.toolsupport.spi.ToolInfo
1918
import io.projectenv.core.toolsupport.spi.ToolSupport
2019
import io.projectenv.core.toolsupport.spi.ToolSupportContext
2120
import io.projectenv.intellijplugin.listeners.ProjectEnvTopics
22-
import io.projectenv.intellijplugin.notifications.ProjectEnvNotificationGroup
2321
import io.projectenv.intellijplugin.services.ProjectEnvCliResolverService
2422
import io.projectenv.intellijplugin.services.ProjectEnvConfigFileResolverService
2523
import io.projectenv.intellijplugin.services.ProjectEnvService
2624
import io.projectenv.intellijplugin.toolinfo.ToolInfoParser
2725
import io.projectenv.intellijplugin.toolinfo.ToolInfos
2826
import java.io.File
29-
import java.util.ServiceLoader
27+
import java.util.*
3028

3129
class ProjectEnvServiceImpl(val project: Project) : ProjectEnvService {
3230

@@ -36,20 +34,15 @@ class ProjectEnvServiceImpl(val project: Project) : ProjectEnvService {
3634
val configurationFile = project.service<ProjectEnvConfigFileResolverService>().resolveConfig() ?: return
3735

3836
runProcess("Installing Project-Env", sync) {
39-
try {
40-
val projectEnvCliExecutable = project.service<ProjectEnvCliResolverService>().resolveCli()
37+
val projectEnvCliExecutable = project.service<ProjectEnvCliResolverService>().resolveCli()
4138

42-
val toolInfos = if (projectEnvCliExecutable != null) {
43-
executeProjectEnvCliExecutable(projectEnvCliExecutable, configurationFile)
44-
} else {
45-
executeEmbeddedProjectEnvCli(configurationFile)
46-
}
47-
48-
project.messageBus.syncPublisher(ProjectEnvTopics.TOOLS_TOPIC).toolsUpdated(toolInfos)
49-
} catch (e: Exception) {
50-
ProjectEnvNotificationGroup.createNotification(e.message.orEmpty(), NotificationType.WARNING)
51-
.notify(project)
39+
val toolInfos = if (projectEnvCliExecutable != null) {
40+
executeProjectEnvCliExecutable(projectEnvCliExecutable, configurationFile)
41+
} else {
42+
executeEmbeddedProjectEnvCli(configurationFile)
5243
}
44+
45+
project.messageBus.syncPublisher(ProjectEnvTopics.TOOLS_TOPIC).toolsUpdated(toolInfos)
5346
}
5447
}
5548

@@ -83,7 +76,7 @@ class ProjectEnvServiceImpl(val project: Project) : ProjectEnvService {
8376
if (isSuccessfulCliExecution(result)) {
8477
return ToolInfoParser.fromJson(result.stdOutput.get())
8578
} else {
86-
throw Exception("Failed to execute Project-Env CLI. See process output for more details:\n${result.errOutput.get()}")
79+
throw RuntimeException("Failed to execute Project-Env CLI. See process output for more details:\n${result.errOutput.get()}")
8780
}
8881
}
8982

src/main/kotlin/io/projectenv/intellijplugin/services/impl/SentryErrorReportSubmitter.kt

+28-10
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package io.projectenv.intellijplugin.services.impl
22

3+
import com.intellij.diagnostic.LogMessage
34
import com.intellij.openapi.diagnostic.ErrorReportSubmitter
45
import com.intellij.openapi.diagnostic.IdeaLoggingEvent
56
import com.intellij.openapi.diagnostic.SubmittedReportInfo
@@ -36,7 +37,7 @@ class SentryErrorReportSubmitter : ErrorReportSubmitter() {
3637
): Boolean {
3738
ProgressManager.getInstance().run {
3839
val sentryEvent = createSentryEventFromError(getMainError(events))
39-
setReleaseVersionOnSentryEvent(sentryEvent, pluginDescriptor?.version)
40+
setReleaseVersionOnSentryEvent(sentryEvent)
4041

4142
val sentryEventId = Sentry.captureEvent(sentryEvent)
4243
if (successfullySent(sentryEventId)) {
@@ -56,20 +57,37 @@ class SentryErrorReportSubmitter : ErrorReportSubmitter() {
5657
}
5758

5859
private fun createSentryEventFromError(event: IdeaLoggingEvent): SentryEvent {
59-
val sentryEvent = SentryEvent()
60+
return if (event.data is LogMessage) {
61+
val logMessage = (event.data as LogMessage)
62+
val sentryEvent = SentryEvent(logMessage.throwable)
63+
if (logMessage.message.isNotBlank()) {
64+
val sentryMessage = Message()
65+
sentryMessage.formatted = logMessage.message
66+
sentryEvent.message = sentryMessage
67+
}
6068

61-
val sentryMessage = Message()
62-
sentryMessage.formatted = event.throwableText.split('\n').getOrNull(0)
63-
sentryEvent.message = sentryMessage
69+
return sentryEvent
70+
} else {
71+
val sentryEvent = SentryEvent()
72+
if (event.message != null) {
73+
val sentryMessage = Message()
74+
sentryMessage.formatted = event.message
75+
sentryEvent.message = sentryMessage
76+
} else {
77+
val sentryMessage = Message()
78+
sentryMessage.formatted = event.throwableText.split('\n').getOrNull(0)
79+
sentryEvent.message = sentryMessage
80+
}
6481

65-
sentryEvent.level = SentryLevel.ERROR
66-
sentryEvent.contexts["Stacktrace"] = mapOf("Value" to event.throwableText)
82+
sentryEvent.level = SentryLevel.ERROR
83+
sentryEvent.contexts["Stacktrace"] = mapOf("Value" to event.throwableText)
6784

68-
return sentryEvent
85+
return sentryEvent
86+
}
6987
}
7088

71-
private fun setReleaseVersionOnSentryEvent(sentryEvent: SentryEvent, releaseVersion: String?) {
72-
sentryEvent.release = releaseVersion
89+
private fun setReleaseVersionOnSentryEvent(sentryEvent: SentryEvent) {
90+
sentryEvent.release = pluginDescriptor?.version
7391
}
7492

7593
private fun successfullySent(sentryEventId: SentryId): Boolean {

src/test/kotlin/io/projectenv/intellijplugin/services/impl/ProjectEnvServiceImplTest.kt

+2-3
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ package io.projectenv.intellijplugin.services.impl
33
import com.github.stefanbirkner.systemlambda.SystemLambda.withEnvironmentVariable
44
import com.intellij.javascript.nodejs.interpreter.NodeJsInterpreterManager
55
import com.intellij.javascript.nodejs.interpreter.local.NodeJsLocalInterpreter
6-
import com.intellij.notification.NotificationType
76
import com.intellij.openapi.components.service
87
import com.intellij.openapi.externalSystem.service.execution.ExternalSystemJdkUtil
98
import com.intellij.openapi.projectRoots.impl.ProjectJdkImpl
@@ -17,6 +16,7 @@ import io.projectenv.intellijplugin.ProjectEnvCliHelper
1716
import io.projectenv.intellijplugin.services.ProjectEnvCliResolverService
1817
import io.projectenv.intellijplugin.services.ProjectEnvService
1918
import org.assertj.core.api.Assertions.assertThat
19+
import org.assertj.core.api.Assertions.assertThatThrownBy
2020
import org.jetbrains.idea.maven.execution.MavenRunnerSettings
2121
import org.jetbrains.idea.maven.project.MavenProjectsManager
2222
import org.jetbrains.plugins.gradle.service.project.open.linkAndRefreshGradleProject
@@ -52,9 +52,8 @@ class ProjectEnvServiceImplTest : AbstractProjectEnvTest() {
5252
val pathElement = ProjectEnvCliHelper.setupProjectEnvCli("3.8.0", tempDir.createDir().toFile())
5353
withEnvironmentVariable(getPathVariableName(), createExtendedPathValue(pathElement)).execute {
5454
val service = project.service<ProjectEnvService>()
55-
service.refreshProjectEnv(true)
5655

57-
assertNotificationFired("Failed to execute Project-Env CLI", NotificationType.WARNING)
56+
assertThatThrownBy { service.refreshProjectEnv(true) }.hasMessageStartingWith("Failed to execute Project-Env CLI")
5857
}
5958
}
6059

src/test/kotlin/io/projectenv/intellijplugin/services/impl/SentryErrorReportSubmitterIT.kt

+36-3
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package io.projectenv.intellijplugin.services.impl
22

3+
import com.intellij.diagnostic.LogMessage
34
import com.intellij.openapi.diagnostic.IdeaLoggingEvent
45
import com.intellij.openapi.diagnostic.SubmittedReportInfo
56
import com.intellij.testFramework.fixtures.BasePlatformTestCase
@@ -14,7 +15,7 @@ import org.mockito.Mockito.mock
1415
import org.mockito.Mockito.mockStatic
1516
import org.mockito.kotlin.any
1617
import java.awt.Component
17-
import java.util.UUID
18+
import java.util.*
1819

1920
class SentryErrorReportSubmitterIT : BasePlatformTestCase() {
2021

@@ -39,7 +40,7 @@ class SentryErrorReportSubmitterIT : BasePlatformTestCase() {
3940
}
4041
sentry.`when`<SentryId> { Sentry.captureEvent(any()) }.then {
4142
val event = it.getArgument<SentryEvent>(0)
42-
assertThat(event.message?.formatted).isEqualTo("java.lang.Throwable: test error")
43+
assertThat(event.message?.formatted).isEqualTo("test message")
4344

4445
SentryId(UUID.randomUUID())
4546
}
@@ -73,7 +74,7 @@ class SentryErrorReportSubmitterIT : BasePlatformTestCase() {
7374
}
7475
sentry.`when`<SentryId> { Sentry.captureEvent(any()) }.then {
7576
val event = it.getArgument<SentryEvent>(0)
76-
assertThat(event.message?.formatted).isEqualTo("java.lang.Throwable: test error")
77+
assertThat(event.message?.formatted).isEqualTo("test message")
7778

7879
SentryId.EMPTY_ID
7980
}
@@ -86,4 +87,36 @@ class SentryErrorReportSubmitterIT : BasePlatformTestCase() {
8687
}
8788
}
8889
}
90+
91+
@Test
92+
fun testSubmitErrorsWithLogMessage() {
93+
executeSubmitErrorsLogMessageTest()
94+
}
95+
96+
private fun executeSubmitErrorsLogMessageTest() {
97+
mockStatic(Sentry::class.java).use { sentry ->
98+
val throwable = Throwable("test error")
99+
val message = "test message"
100+
101+
sentry.`when`<Void> { Sentry.init(any<Sentry.OptionsConfiguration<SentryOptions>>()) }.then {
102+
// noop
103+
}
104+
sentry.`when`<SentryId> { Sentry.captureEvent(any()) }.then {
105+
val event = it.getArgument<SentryEvent>(0)
106+
assertThat(event.message?.formatted).isEqualTo(message)
107+
assertThat(event.throwable).isEqualTo(throwable)
108+
109+
SentryId(UUID.randomUUID())
110+
}
111+
sentry.`when`<Void> { Sentry.captureUserFeedback(any()) }.then {
112+
val userFeedback = it.getArgument<UserFeedback>(0)
113+
assertThat(userFeedback.comments).isEqualTo("test comment")
114+
}
115+
116+
val component = mock(Component::class.java)
117+
SentryErrorReportSubmitter().submit(arrayOf(LogMessage.createEvent(throwable, message)), "test comment", component) {
118+
assertThat(it.status).isEqualTo(SubmittedReportInfo.SubmissionStatus.NEW_ISSUE)
119+
}
120+
}
121+
}
89122
}

0 commit comments

Comments
 (0)