Skip to content

feat(amazonq): remove option to select multiple diffs #5730

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 5 commits into from
May 19, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
{
"type" : "removal",
"description" : "/transform: remove option to receive multiple diffs"
}
Original file line number Diff line number Diff line change
Expand Up @@ -30,9 +30,7 @@ import software.aws.toolkits.jetbrains.services.amazonq.CODE_TRANSFORM_TROUBLESH
import software.aws.toolkits.jetbrains.services.amazonq.CODE_TRANSFORM_TROUBLESHOOT_DOC_DOWNLOAD_EXPIRED
import software.aws.toolkits.jetbrains.services.codemodernizer.client.GumbyClient
import software.aws.toolkits.jetbrains.services.codemodernizer.commands.CodeTransformMessageListener
import software.aws.toolkits.jetbrains.services.codemodernizer.constants.createViewDiffButton
import software.aws.toolkits.jetbrains.services.codemodernizer.constants.getDownloadedArtifactTextFromType
import software.aws.toolkits.jetbrains.services.codemodernizer.constants.viewSummaryButton
import software.aws.toolkits.jetbrains.services.codemodernizer.controller.CodeTransformChatHelper
import software.aws.toolkits.jetbrains.services.codemodernizer.messages.CodeTransformChatMessageContent
import software.aws.toolkits.jetbrains.services.codemodernizer.messages.CodeTransformChatMessageType
Expand All @@ -43,14 +41,12 @@ import software.aws.toolkits.jetbrains.services.codemodernizer.model.DownloadArt
import software.aws.toolkits.jetbrains.services.codemodernizer.model.DownloadFailureReason
import software.aws.toolkits.jetbrains.services.codemodernizer.model.JobId
import software.aws.toolkits.jetbrains.services.codemodernizer.model.ParseZipFailureReason
import software.aws.toolkits.jetbrains.services.codemodernizer.model.PatchInfo
import software.aws.toolkits.jetbrains.services.codemodernizer.model.UnzipFailureReason
import software.aws.toolkits.jetbrains.services.codemodernizer.state.CodeModernizerSessionState
import software.aws.toolkits.jetbrains.services.codemodernizer.utils.getPathToHilArtifactDir
import software.aws.toolkits.jetbrains.services.codemodernizer.utils.isValidCodeTransformConnection
import software.aws.toolkits.jetbrains.services.codemodernizer.utils.openTroubleshootingGuideNotificationAction
import software.aws.toolkits.jetbrains.services.codemodernizer.utils.zipToPath
import software.aws.toolkits.jetbrains.utils.notifyInfo
import software.aws.toolkits.jetbrains.utils.notifyStickyInfo
import software.aws.toolkits.jetbrains.utils.notifyStickyWarn
import software.aws.toolkits.resources.message
Expand All @@ -63,20 +59,6 @@ import java.util.concurrent.atomic.AtomicBoolean
const val DOWNLOAD_PROXY_WILDCARD_ERROR: String = "Dangling meta character '*' near index 0"
const val DOWNLOAD_SSL_HANDSHAKE_ERROR: String = "Unable to execute HTTP request: javax.net.ssl.SSLHandshakeException"
const val INVALID_ARTIFACT_ERROR: String = "Invalid artifact"
val patchDescriptions = mapOf(
"Prepare minimal upgrade to Java 17" to "This diff patch covers the set of upgrades for Springboot, JUnit, and PowerMockito frameworks in Java 17.",
"Prepare minimal upgrade to Java 21" to "This diff patch covers the set of upgrades for Springboot, JUnit, and PowerMockito frameworks in Java 21.",
"Popular Enterprise Specifications and Application Frameworks upgrade" to "This diff patch covers the set of upgrades for Jakarta EE 10, Hibernate 6.2, " +
"and Micronaut 3.",
"HTTP Client Utilities, Apache Commons Utilities, and Web Frameworks" to "This diff patch covers the set of upgrades for Apache HTTP Client 5, Apache " +
"Commons utilities (Collections, IO, Lang, Math), and Struts 6.0.",
"Testing Tools and Frameworks upgrade" to "This diff patch covers the set of upgrades for ArchUnit, Mockito, TestContainers, and Cucumber, in addition " +
"to the Jenkins plugins and the Maven Wrapper.",
"Miscellaneous Processing Documentation upgrade" to "This diff patch covers a diverse set of upgrades spanning ORMs, XML processing, API documentation, " +
"and more.",
"Deprecated API replacement, dependency upgrades, and formatting" to "This diff patch replaces deprecated APIs, makes additional dependency version " +
"upgrades, and formats code changes."
)

class ArtifactHandler(
private val project: Project,
Expand All @@ -88,21 +70,13 @@ class ArtifactHandler(
private val downloadedSummaries = mutableMapOf<JobId, TransformationSummary>()
private val downloadedBuildLogPath = mutableMapOf<JobId, Path>()
private var isCurrentlyDownloading = AtomicBoolean(false)
private var totalPatchFiles: Int = 0
private var sharedPatchIndex: Int = 0

internal suspend fun displayDiff(job: JobId) {
if (isCurrentlyDownloading.get()) return
when (val result = downloadArtifact(job, TransformationDownloadArtifactType.CLIENT_INSTRUCTIONS)) {
is DownloadArtifactResult.Success -> {
if (result.artifact !is CodeModernizerArtifact) return notifyUnableToApplyPatch("")
totalPatchFiles = result.artifact.patches.size
if (result.artifact.description == null) {
displayDiffUsingPatch(result.artifact.patches.first(), totalPatchFiles, null, job)
} else {
val diffDescription = result.artifact.description[getCurrentPatchIndex()]
displayDiffUsingPatch(result.artifact.patches[getCurrentPatchIndex()], totalPatchFiles, diffDescription, job)
}
displayDiffUsingPatch(result.artifact.patch, job)
}
is DownloadArtifactResult.ParseZipFailure -> notifyUnableToApplyPatch(result.failureReason.errorMessage)
is DownloadArtifactResult.UnzipFailure -> notifyUnableToApplyPatch(result.failureReason.errorMessage)
Expand Down Expand Up @@ -260,8 +234,6 @@ class ArtifactHandler(
*/
internal suspend fun displayDiffUsingPatch(
patchFile: VirtualFile,
totalPatchFiles: Int,
diffDescription: PatchInfo?,
jobId: JobId,
) {
withContext(EDT) {
Expand All @@ -274,11 +246,7 @@ class ArtifactHandler(
null,
ChangeListManager.getInstance(project)
.addChangeList(
if (diffDescription != null) {
"${diffDescription.name} (${if (diffDescription.isSuccessful) "Success" else "Failure"})"
} else {
patchFile.name
},
patchFile.name,
""
),
null,
Expand All @@ -289,42 +257,12 @@ class ArtifactHandler(
dialog.isModal = true

if (dialog.showAndGet()) {
telemetry.submitSelection("Submit-${diffDescription?.name}", jobId.toString())
if (diffDescription == null) {
val resultContent = CodeTransformChatMessageContent(
type = CodeTransformChatMessageType.PendingAnswer,
message = message("codemodernizer.chat.message.changes_applied"),
)
codeTransformChatHelper?.updateLastPendingMessage(resultContent)
} else {
if (getCurrentPatchIndex() < totalPatchFiles) {
val message = "I applied the changes in diff patch ${getCurrentPatchIndex() + 1} of $totalPatchFiles. " +
"${patchDescriptions[diffDescription.name]}"
val notificationMessage = "Amazon Q applied the changes in diff patch ${getCurrentPatchIndex() + 1} of $totalPatchFiles " +
"to your project."
val notificationTitle = "Diff patch ${getCurrentPatchIndex() + 1} of $totalPatchFiles applied"
setCurrentPatchIndex(getCurrentPatchIndex() + 1)
notifyInfo(notificationTitle, notificationMessage, project)
if (getCurrentPatchIndex() == totalPatchFiles) {
codeTransformChatHelper?.updateLastPendingMessage(
CodeTransformChatMessageContent(type = CodeTransformChatMessageType.PendingAnswer, message = message)
)
} else {
codeTransformChatHelper?.updateLastPendingMessage(
CodeTransformChatMessageContent(
type = CodeTransformChatMessageType.PendingAnswer,
message = message,
buttons = listOf(
createViewDiffButton("View diff ${getCurrentPatchIndex() + 1}/$totalPatchFiles"),
viewSummaryButton
)
)
)
}
} else {
// no-op; start a new transformation button already visible at this point
}
}
telemetry.submitSelection("Submit", jobId.toString())
val resultContent = CodeTransformChatMessageContent(
type = CodeTransformChatMessageType.PendingAnswer,
message = message("codemodernizer.chat.message.changes_applied"),
)
codeTransformChatHelper?.updateLastPendingMessage(resultContent)
} else {
telemetry.submitSelection("Cancel", jobId.toString())
}
Expand Down Expand Up @@ -411,7 +349,7 @@ class ArtifactHandler(
),
)

fun notifyUnableToShowSummary() {
private fun notifyUnableToShowSummary() {
LOG.error { "Unable to display summary" }
notifyStickyWarn(
message("codemodernizer.notification.warn.view_summary_failed.title"),
Expand All @@ -425,7 +363,7 @@ class ArtifactHandler(
)
}

fun notifyUnableToShowBuildLog() {
private fun notifyUnableToShowBuildLog() {
LOG.error { "Unable to display build log" }
notifyStickyWarn(
message("codemodernizer.notification.warn.view_build_log_failed.title"),
Expand All @@ -447,12 +385,6 @@ class ArtifactHandler(

fun getSummary(job: JobId) = downloadedSummaries[job]

private fun getCurrentPatchIndex() = sharedPatchIndex

private fun setCurrentPatchIndex(index: Int) {
sharedPatchIndex = index
}

private fun showSummaryFromFile(summaryFile: File) {
val summaryMarkdownVirtualFile = LocalFileSystem.getInstance().refreshAndFindFileByIoFile(summaryFile)
if (summaryMarkdownVirtualFile != null) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,6 @@ import javax.net.ssl.SSLHandshakeException

const val MAX_ZIP_SIZE = 2000000000 // 2GB
const val EXPLAINABILITY_V1 = "EXPLAINABILITY_V1"
const val SELECTIVE_TRANSFORMATION_V1 = "SELECTIVE_TRANSFORMATION_V1"

// constants for handling SDKClientException
const val CONNECTION_REFUSED_ERROR: String = "Connection refused"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,6 @@ private enum class CodeTransformMessageTypes(val type: String) {
CodeTransformCancel("codetransform-cancel"),
CodeTransformContinue("codetransform-continue"),
CodeTransformConfirmSkipTests("codetransform-confirm-skip-tests"),
CodeTransformConfirmOneOrMultipleDiffs("codetransform-confirm-one-or-multiple-diffs"),
CodeTransformNew("codetransform-new"),
CodeTransformOpenTransformHub("codetransform-open-transform-hub"),
CodeTransformOpenMvnBuild("codetransform-open-mvn-build"),
Expand Down Expand Up @@ -84,7 +83,6 @@ class CodeTransformChatApp : AmazonQApp {
CodeTransformMessageTypes.CodeTransformContinue.type to IncomingCodeTransformMessage.CodeTransformContinue::class,
CodeTransformMessageTypes.ChatPrompt.type to IncomingCodeTransformMessage.ChatPrompt::class,
CodeTransformMessageTypes.CodeTransformConfirmSkipTests.type to IncomingCodeTransformMessage.CodeTransformConfirmSkipTests::class,
CodeTransformMessageTypes.CodeTransformConfirmOneOrMultipleDiffs.type to IncomingCodeTransformMessage.CodeTransformConfirmOneOrMultipleDiffs::class,
CodeTransformMessageTypes.CodeTransformNew.type to IncomingCodeTransformMessage.CodeTransformNew::class,
CodeTransformMessageTypes.CodeTransformOpenTransformHub.type to IncomingCodeTransformMessage.CodeTransformOpenTransformHub::class,
CodeTransformMessageTypes.CodeTransformOpenMvnBuild.type to IncomingCodeTransformMessage.CodeTransformOpenMvnBuild::class,
Expand Down Expand Up @@ -193,7 +191,6 @@ class CodeTransformChatApp : AmazonQApp {
is IncomingCodeTransformMessage.CodeTransformStop -> inboundAppMessagesHandler.processCodeTransformStopAction(message.tabId)
is IncomingCodeTransformMessage.ChatPrompt -> inboundAppMessagesHandler.processChatPromptMessage(message)
is IncomingCodeTransformMessage.CodeTransformConfirmSkipTests -> inboundAppMessagesHandler.processCodeTransformConfirmSkipTests(message)
is IncomingCodeTransformMessage.CodeTransformConfirmOneOrMultipleDiffs -> inboundAppMessagesHandler.processCodeTransformOneOrMultipleDiffs(message)
is IncomingCodeTransformMessage.CodeTransformContinue -> inboundAppMessagesHandler.processCodeTransformContinueAction(message)
is IncomingCodeTransformMessage.CodeTransformNew -> inboundAppMessagesHandler.processCodeTransformNewAction(message)
is IncomingCodeTransformMessage.CodeTransformOpenTransformHub -> inboundAppMessagesHandler.processCodeTransformOpenTransformHub(message)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,6 @@ interface InboundAppMessagesHandler {

suspend fun processCodeTransformConfirmSkipTests(message: IncomingCodeTransformMessage.CodeTransformConfirmSkipTests)

suspend fun processCodeTransformOneOrMultipleDiffs(message: IncomingCodeTransformMessage.CodeTransformConfirmOneOrMultipleDiffs)

suspend fun processCodeTransformOpenTransformHub(message: IncomingCodeTransformMessage.CodeTransformOpenTransformHub)

suspend fun processCodeTransformOpenMvnBuild(message: IncomingCodeTransformMessage.CodeTransformOpenMvnBuild)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -80,13 +80,6 @@ private val confirmSkipTestsSelectionButton = Button(
id = CodeTransformButtonId.ConfirmSkipTests.id,
)

private val confirmOneOrMultipleDiffsSelectionButton = Button(
keepCardAfterClick = false,
waitMandatoryFormItems = true,
text = message("codemodernizer.chat.message.button.confirm"),
id = CodeTransformButtonId.ConfirmOneOrMultipleDiffs.id,
)

private val confirmCustomDependencyVersionsButton = Button(
keepCardAfterClick = true,
waitMandatoryFormItems = true,
Expand Down Expand Up @@ -230,22 +223,6 @@ private val selectSkipTestsFlagFormItem = FormItem(
)
)

private val selectOneOrMultipleDiffsFlagFormItem = FormItem(
id = CodeTransformFormItemId.SelectOneOrMultipleDiffsFlag.id,
title = message("codemodernizer.chat.form.user_selection.item.choose_one_or_multiple_diffs_option"),
mandatory = true,
options = listOf(
FormItemOption(
label = message("codemodernizer.chat.message.one_or_multiple_diffs_form.one_diff"),
value = message("codemodernizer.chat.message.one_or_multiple_diffs_form.one_diff"),
),
FormItemOption(
label = message("codemodernizer.chat.message.one_or_multiple_diffs_form.multiple_diffs"),
value = message("codemodernizer.chat.message.one_or_multiple_diffs_form.multiple_diffs"),
)
)
)

private fun getUserLanguageUpgradeSelectionFormattedMarkdown(moduleName: String, targetJdkVersion: String): String = """
### ${message("codemodernizer.chat.prompt.title.details")}
-------------
Expand Down Expand Up @@ -338,32 +315,12 @@ fun buildUserInputSkipTestsFlagChatContent(): CodeTransformChatMessageContent =
formItems = listOf(selectSkipTestsFlagFormItem),
type = CodeTransformChatMessageType.FinalizedAnswer,
)
fun buildUserInputOneOrMultipleDiffsChatIntroContent(version: String): CodeTransformChatMessageContent =
CodeTransformChatMessageContent(
message = message("codemodernizer.chat.message.one_or_multiple_diffs", version.substring(4)), // extract "17" / "21" from "JDK_17" / "JDK_21"
type = CodeTransformChatMessageType.FinalizedAnswer,
)
fun buildUserInputOneOrMultipleDiffsFlagChatContent(): CodeTransformChatMessageContent =
CodeTransformChatMessageContent(
message = message("codemodernizer.chat.form.user_selection.title"),
buttons = listOf(
confirmOneOrMultipleDiffsSelectionButton,
cancelUserSelectionButton,
),
formItems = listOf(selectOneOrMultipleDiffsFlagFormItem),
type = CodeTransformChatMessageType.FinalizedAnswer,
)

fun buildUserSkipTestsFlagSelectionChatContent(skipTestsSelection: String) = CodeTransformChatMessageContent(
type = CodeTransformChatMessageType.FinalizedAnswer,
message = message("codemodernizer.chat.message.skip_tests_form.response", skipTestsSelection.lowercase())
)

fun buildUserOneOrMultipleDiffsSelectionChatContent(oneOrMultipleDiffsSelection: String) = CodeTransformChatMessageContent(
type = CodeTransformChatMessageType.FinalizedAnswer,
message = message("codemodernizer.chat.message.one_or_multiple_diffs_form.response", oneOrMultipleDiffsSelection.lowercase())
)

fun buildUserInputLanguageUpgradeChatContent(project: Project, validationResult: ValidationResult): CodeTransformChatMessageContent {
val moduleBuildFiles = validationResult.validatedBuildFiles

Expand Down Expand Up @@ -597,7 +554,7 @@ fun buildTransformResumingChatContent() = CodeTransformChatMessageContent(
type = CodeTransformChatMessageType.PendingAnswer,
)

fun buildTransformResultChatContent(result: CodeModernizerJobCompletedResult, totalPatchFiles: Int? = null): CodeTransformChatMessageContent {
fun buildTransformResultChatContent(result: CodeModernizerJobCompletedResult): CodeTransformChatMessageContent {
val resultMessage = when (result) {
is CodeModernizerJobCompletedResult.JobAbortedZipTooLarge -> {
"${message(
Expand All @@ -611,18 +568,10 @@ fun buildTransformResultChatContent(result: CodeModernizerJobCompletedResult, to
buildZipUploadFailedChatMessage(result.failureReason)
}
is CodeModernizerJobCompletedResult.JobCompletedSuccessfully -> {
if (totalPatchFiles == 1) {
message("codemodernizer.chat.message.result.success")
} else {
message("codemodernizer.chat.message.result.success.multiple_diffs")
}
message("codemodernizer.chat.message.result.success")
}
is CodeModernizerJobCompletedResult.JobPartiallySucceeded -> {
if (totalPatchFiles == 1) {
message("codemodernizer.chat.message.result.partially_success")
} else {
message("codemodernizer.chat.message.result.partially_success.multiple_diffs")
}
message("codemodernizer.chat.message.result.partially_success")
}
is CodeModernizerJobCompletedResult.JobFailed -> {
message("codemodernizer.chat.message.result.fail_with_known_reason", result.failureReason)
Expand All @@ -649,7 +598,7 @@ fun buildTransformResultChatContent(result: CodeModernizerJobCompletedResult, to
type = CodeTransformChatMessageType.FinalizedAnswer,
message = resultMessage,
buttons = if (result is CodeModernizerJobCompletedResult.JobPartiallySucceeded || result is CodeModernizerJobCompletedResult.JobCompletedSuccessfully) {
listOf(createViewDiffButton(if (totalPatchFiles == 1) "View diff" else "View diff 1/$totalPatchFiles"), viewSummaryButton)
listOf(createViewDiffButton("View diff"), viewSummaryButton)
} else if (result is CodeModernizerJobCompletedResult.JobFailedInitialBuild && result.hasBuildLog) {
listOf(viewBuildLog)
} else {
Expand Down
Loading
Loading