Skip to content

Commit 2b4f9b5

Browse files
author
David Hasani
committed
fix(amazonq): show build logs when pre-build fails
1 parent f39209c commit 2b4f9b5

File tree

12 files changed

+122
-34
lines changed

12 files changed

+122
-34
lines changed
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{
2+
"type" : "bugfix",
3+
"description" : "Amazon Q Code Transformation: show build logs when server-side build fails"
4+
}

plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/CodeModernizerManager.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -630,7 +630,7 @@ class CodeModernizerManager(private val project: Project) : PersistentStateCompo
630630
is CodeModernizerJobCompletedResult.JobPartiallySucceeded -> {
631631
notifyStickyInfo(
632632
message("codemodernizer.notification.info.modernize_partial_complete.title"),
633-
message("codemodernizer.notification.info.modernize_partial_complete.content", result.targetJavaVersion.description),
633+
message("codemodernizer.notification.info.modernize_partial_complete.content"),
634634
project,
635635
listOf(displaySummaryNotificationAction(result.jobId), displayFeedbackNotificationAction()),
636636
)

plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/CodeModernizerSession.kt

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -493,10 +493,7 @@ class CodeModernizerSession(
493493
message("codemodernizer.notification.warn.unknown_status_response")
494494
)
495495

496-
result.state == TransformationStatus.PARTIALLY_COMPLETED -> CodeModernizerJobCompletedResult.JobPartiallySucceeded(
497-
jobId,
498-
sessionContext.targetJavaVersion
499-
)
496+
result.state == TransformationStatus.PARTIALLY_COMPLETED -> CodeModernizerJobCompletedResult.JobPartiallySucceeded(jobId)
500497

501498
result.state == TransformationStatus.FAILED -> {
502499
if (!passedStart) {

plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/constants/CodeTransformChatItems.kt

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -431,6 +431,11 @@ fun buildTransformStoppedChatContent() = CodeTransformChatMessageContent(
431431
type = CodeTransformChatMessageType.FinalizedAnswer,
432432
)
433433

434+
fun buildTransformFailedChatContent(failureReason: String) = CodeTransformChatMessageContent(
435+
message = message("codemodernizer.chat.message.transform_failed", failureReason),
436+
type = CodeTransformChatMessageType.FinalizedAnswer,
437+
)
438+
434439
fun buildUserSQLConversionSelectionSummaryChatContent(moduleName: String, schema: String) = CodeTransformChatMessageContent(
435440
type = CodeTransformChatMessageType.Prompt,
436441
message = getUserSQLConversionSelectionFormattedMarkdown(moduleName, schema)
@@ -537,7 +542,7 @@ fun buildTransformResumingChatContent() = CodeTransformChatMessageContent(
537542
type = CodeTransformChatMessageType.PendingAnswer,
538543
)
539544

540-
fun buildTransformResultChatContent(result: CodeModernizerJobCompletedResult, totalPatchFiles: Int): CodeTransformChatMessageContent {
545+
fun buildTransformResultChatContent(result: CodeModernizerJobCompletedResult, totalPatchFiles: Int? = null): CodeTransformChatMessageContent {
541546
val resultMessage = when (result) {
542547
is CodeModernizerJobCompletedResult.JobAbortedZipTooLarge -> {
543548
"${message(

plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/controller/CodeTransformChatController.kt

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ import software.aws.toolkits.jetbrains.services.codemodernizer.constants.buildSt
6161
import software.aws.toolkits.jetbrains.services.codemodernizer.constants.buildTransformAwaitUserInputChatContent
6262
import software.aws.toolkits.jetbrains.services.codemodernizer.constants.buildTransformBeginChatContent
6363
import software.aws.toolkits.jetbrains.services.codemodernizer.constants.buildTransformDependencyErrorChatContent
64+
import software.aws.toolkits.jetbrains.services.codemodernizer.constants.buildTransformFailedChatContent
6465
import software.aws.toolkits.jetbrains.services.codemodernizer.constants.buildTransformFindingLocalAlternativeDependencyChatContent
6566
import software.aws.toolkits.jetbrains.services.codemodernizer.constants.buildTransformInProgressChatContent
6667
import software.aws.toolkits.jetbrains.services.codemodernizer.constants.buildTransformResultChatContent
@@ -183,7 +184,7 @@ class CodeTransformChatController(
183184
private suspend fun getUserObjective(tabId: String) {
184185
codeTransformChatHelper.addNewMessage(buildChooseTransformationObjectiveChatContent())
185186
codeTransformChatHelper.sendChatInputEnabledMessage(tabId, true)
186-
codeTransformChatHelper.sendUpdatePlaceholderMessage(tabId, message("codemodernizer.chat.message.choose_objective"))
187+
codeTransformChatHelper.sendUpdatePlaceholderMessage(tabId, message("codemodernizer.chat.message.choose_objective_placeholder"))
187188
}
188189

189190
private suspend fun validateAndReplyOnError(transformationType: CodeTransformType): ValidationResult? {
@@ -665,9 +666,21 @@ class CodeTransformChatController(
665666
codeTransformChatHelper.addNewMessage(buildStartNewTransformFollowup())
666667
}
667668

669+
private suspend fun handleCodeTransformJobFailed(failureReason: String) {
670+
codeTransformChatHelper.updateLastPendingMessage(buildTransformFailedChatContent(failureReason))
671+
codeTransformChatHelper.addNewMessage(buildStartNewTransformFollowup())
672+
}
673+
674+
private suspend fun handleCodeTransformJobFailedPreBuild(result: CodeModernizerJobCompletedResult.JobFailedInitialBuild) =
675+
codeTransformChatHelper.addNewMessage(
676+
buildTransformResultChatContent(result)
677+
)
678+
668679
private suspend fun handleCodeTransformResult(result: CodeModernizerJobCompletedResult) {
669680
when (result) {
670681
is CodeModernizerJobCompletedResult.Stopped, CodeModernizerJobCompletedResult.JobAbortedBeforeStarting -> handleCodeTransformStoppedByUser()
682+
is CodeModernizerJobCompletedResult.JobFailed -> handleCodeTransformJobFailed(result.failureReason)
683+
is CodeModernizerJobCompletedResult.JobFailedInitialBuild -> handleCodeTransformJobFailedPreBuild(result)
671684
else -> {
672685
if (result is CodeModernizerJobCompletedResult.ZipUploadFailed && result.failureReason is UploadFailureReason.CREDENTIALS_EXPIRED) {
673686
return

plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/model/CodeModernizerJobCompletedResult.kt

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,13 @@
33

44
package software.aws.toolkits.jetbrains.services.codemodernizer.model
55

6-
import com.intellij.openapi.projectRoots.JavaSdkVersion
7-
86
sealed class CodeModernizerJobCompletedResult {
97
data class RetryableFailure(val jobId: JobId, val failureReason: String) : CodeModernizerJobCompletedResult()
108
data class UnableToCreateJob(val failureReason: String, val retryable: Boolean = false) : CodeModernizerJobCompletedResult()
119
data class JobFailed(val jobId: JobId, val failureReason: String) : CodeModernizerJobCompletedResult()
1210
data class ZipUploadFailed(val failureReason: UploadFailureReason) : CodeModernizerJobCompletedResult()
1311
data class JobCompletedSuccessfully(val jobId: JobId) : CodeModernizerJobCompletedResult()
14-
data class JobPartiallySucceeded(val jobId: JobId, val targetJavaVersion: JavaSdkVersion) : CodeModernizerJobCompletedResult()
12+
data class JobPartiallySucceeded(val jobId: JobId) : CodeModernizerJobCompletedResult()
1513

1614
data class JobPaused(val jobId: JobId, val downloadArtifactId: String) : CodeModernizerJobCompletedResult()
1715

plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/panels/CodeModernizerBanner.kt

Lines changed: 19 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ package software.aws.toolkits.jetbrains.services.codemodernizer.panels
55

66
import com.intellij.icons.AllIcons
77
import com.intellij.openapi.project.Project
8-
import com.intellij.serviceContainer.AlreadyDisposedException
98
import com.intellij.ui.JBColor
109
import com.intellij.ui.border.CustomLineBorder
1110
import com.intellij.ui.components.ActionLink
@@ -14,8 +13,8 @@ import com.intellij.util.ui.JBInsets
1413
import com.intellij.util.ui.JBUI
1514
import icons.AwsIcons
1615
import software.aws.toolkits.core.utils.getLogger
17-
import software.aws.toolkits.core.utils.warn
1816
import software.aws.toolkits.jetbrains.services.codemodernizer.CodeModernizerManager
17+
import software.aws.toolkits.jetbrains.services.codemodernizer.model.JobId
1918
import software.aws.toolkits.jetbrains.services.codewhisperer.layout.CodeWhispererLayoutConfig
2019
import software.aws.toolkits.jetbrains.services.codewhisperer.layout.CodeWhispererLayoutConfig.addHorizontalGlue
2120
import software.aws.toolkits.jetbrains.ui.feedback.CodeTransformFeedbackDialog
@@ -42,11 +41,13 @@ class CodeModernizerBanner(val project: Project) : JPanel(BorderLayout()) {
4241
border = BorderFactory.createEmptyBorder(0, 5, 0, 0)
4342
}
4443

44+
private val infoLabelJobId = JBLabel().apply {
45+
foreground = JBColor.GRAY
46+
border = BorderFactory.createEmptyBorder(0, 5, 0, 0)
47+
}
48+
4549
private val infoPanel = JPanel(GridBagLayout())
4650

47-
val showDiffAction = ActionLink(message("codemodernizer.toolwindow.banner.action.diff")) {
48-
CodeModernizerManager.getInstance(project).showDiff()
49-
}
5051
val showPlanAction = ActionLink(message("codemodernizer.toolwindow.banner.action.plan")) {
5152
CodeModernizerManager.getInstance(project).showTransformationPlan()
5253
}
@@ -84,6 +85,7 @@ class CodeModernizerBanner(val project: Project) : JPanel(BorderLayout()) {
8485
)
8586
}
8687
add(infoLabelRunningTime, CodeWhispererLayoutConfig.kebabMenuConstraints)
88+
add(infoLabelJobId, CodeWhispererLayoutConfig.kebabMenuConstraints)
8789
}
8890
infoPanel.revalidate()
8991
infoPanel.repaint()
@@ -114,19 +116,18 @@ class CodeModernizerBanner(val project: Project) : JPanel(BorderLayout()) {
114116
}
115117

116118
fun updateRunningTime(runTime: Duration?) {
117-
try {
118-
if (runTime == null) {
119-
infoLabelRunningTime.text = ""
120-
} else {
121-
val timeTaken = runTime.toKotlinDuration().inWholeSeconds.seconds.toString()
122-
infoLabelRunningTime.text = message(
123-
"codemodernizer.toolwindow.transformation.progress.running_time",
124-
timeTaken
125-
)
126-
}
127-
} catch (exception: AlreadyDisposedException) {
128-
LOG.warn { "Disposed when about to create the loading panel" }
129-
return
119+
infoLabelRunningTime.text = if (runTime != null) {
120+
message("codemodernizer.toolwindow.transformation.progress.running_time", runTime.toKotlinDuration().inWholeSeconds.seconds.toString())
121+
} else {
122+
""
123+
}
124+
}
125+
126+
fun updateJobId(jobId: JobId?) {
127+
infoLabelJobId.text = if (jobId != null) {
128+
message("codemodernizer.toolwindow.transformation.progress.job_id", jobId.id)
129+
} else {
130+
""
130131
}
131132
}
132133

plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/panels/managers/CodeModernizerBottomWindowPanelManager.kt

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,16 @@ class CodeModernizerBottomWindowPanelManager(private val project: Project) : JPa
8888
}
8989
}
9090

91+
private fun updateJobId() {
92+
try {
93+
val jobId = CodeModernizerSessionState.getInstance(project).currentJobId
94+
banner.updateJobId(jobId)
95+
} catch (e: AlreadyDisposedException) {
96+
LOG.warn { "Disposed when about to update the jobId" }
97+
return
98+
}
99+
}
100+
91101
fun setJobStartingUI() = setUI {
92102
add(BorderLayout.CENTER, fullSizeLoadingPanel)
93103
banner.clearActions()
@@ -123,6 +133,7 @@ class CodeModernizerBottomWindowPanelManager(private val project: Project) : JPa
123133
fun setJobRunningUI() = setUI {
124134
add(BorderLayout.CENTER, buildProgressSplitterPanelManager)
125135
banner.updateContent(message("codemodernizer.toolwindow.banner.job_is_running"), AllIcons.General.BalloonInformation)
136+
updateJobId()
126137
buildProgressSplitterPanelManager.apply {
127138
reset()
128139
statusTreePanel.setDefaultUI()
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved.
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
package software.aws.toolkits.jetbrains.services.codemodernizer
5+
6+
import org.junit.Assert.assertNotNull
7+
import org.junit.Assert.assertNull
8+
import org.junit.Test
9+
import software.aws.toolkits.jetbrains.services.codemodernizer.constants.buildTransformResultChatContent
10+
import software.aws.toolkits.jetbrains.services.codemodernizer.messages.CodeTransformButtonId
11+
import software.aws.toolkits.jetbrains.services.codemodernizer.model.CodeModernizerJobCompletedResult
12+
import software.aws.toolkits.jetbrains.services.codemodernizer.model.JobId
13+
import software.aws.toolkits.resources.message
14+
import kotlin.test.assertEquals
15+
16+
class CodeTransformChatTest {
17+
18+
@Test
19+
fun `test that transform result chat item includes view build log button and message when pre-build fails`() {
20+
val result = CodeModernizerJobCompletedResult.JobFailedInitialBuild(JobId("dummy-job-id-123"), "Build failed in Java 8 sandbox", true)
21+
val chatItem = buildTransformResultChatContent(result)
22+
assertEquals(chatItem.message, message("codemodernizer.chat.message.result.fail_initial_build"))
23+
assertNotNull(chatItem.buttons)
24+
assertEquals(chatItem.buttons!!.size, 1)
25+
assertEquals(chatItem.buttons!![0].id, CodeTransformButtonId.ViewBuildLog.id)
26+
}
27+
28+
@Test
29+
fun `test that transform result chat item includes view summary button and view diff button with correct label when job fully succeeded with 5 patch files`() {
30+
val result = CodeModernizerJobCompletedResult.JobCompletedSuccessfully(JobId("dummy-job-id-123"))
31+
val chatItem = buildTransformResultChatContent(result, 5)
32+
assertEquals(chatItem.message, message("codemodernizer.chat.message.result.success.multiple_diffs"))
33+
assertNotNull(chatItem.buttons)
34+
assertEquals(chatItem.buttons!!.size, 2)
35+
assertEquals(chatItem.buttons!![0].id, CodeTransformButtonId.ViewDiff.id)
36+
assertEquals(chatItem.buttons!![0].text, "View diff 1/5")
37+
assertEquals(chatItem.buttons!![1].id, CodeTransformButtonId.ViewSummary.id)
38+
}
39+
40+
@Test
41+
fun `test that transform result chat item includes view summary button and view diff button with correct label when job partially succeeded with 1 patch file`() {
42+
val result = CodeModernizerJobCompletedResult.JobPartiallySucceeded(JobId("dummy-job-id-123"))
43+
val chatItem = buildTransformResultChatContent(result, 1)
44+
assertEquals(chatItem.message, message("codemodernizer.chat.message.result.partially_success"))
45+
assertNotNull(chatItem.buttons)
46+
assertEquals(chatItem.buttons!!.size, 2)
47+
assertEquals(chatItem.buttons!![0].id, CodeTransformButtonId.ViewDiff.id)
48+
assertEquals(chatItem.buttons!![0].text, "View diff")
49+
assertEquals(chatItem.buttons!![1].id, CodeTransformButtonId.ViewSummary.id)
50+
}
51+
52+
@Test
53+
fun `test that transform result chat item does not include any buttons when job failed with known reason`() {
54+
val result = CodeModernizerJobCompletedResult.JobFailed(JobId("dummy-job-id-123"), message("codemodernizer.file.invalid_pom_version"))
55+
val chatItem = buildTransformResultChatContent(result)
56+
assertEquals(chatItem.message, message("codemodernizer.chat.message.result.fail_with_known_reason", result.failureReason))
57+
assertNull(chatItem.buttons)
58+
}
59+
}

plugins/amazonq/codetransform/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/codemodernizer/CodeWhispererCodeModernizerSessionTest.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -532,7 +532,7 @@ class CodeWhispererCodeModernizerSessionTest : CodeWhispererCodeModernizerTestBa
532532

533533
doNothing().whenever(testSessionStateSpy).updateJobHistory(any(), any(), any())
534534
val result = testSessionSpy.pollUntilJobCompletion(CodeTransformType.LANGUAGE_UPGRADE, jobId) { _, _ -> }
535-
assertEquals(CodeModernizerJobCompletedResult.JobPartiallySucceeded(jobId, testSessionContextSpy.targetJavaVersion), result)
535+
assertEquals(CodeModernizerJobCompletedResult.JobPartiallySucceeded(jobId), result)
536536
verify(clientAdaptorSpy, times(4)).getCodeModernizationJob(any())
537537
verify(clientAdaptorSpy, atLeastOnce()).getCodeModernizationPlan(any())
538538
}

0 commit comments

Comments
 (0)