Skip to content

Commit 4a61ea7

Browse files
dhasani23David Hasani
andauthored
feat(amazonq): warn user if absolute path found in pom.xml (#4762)
* fix(amazonq): prevent empty chat bubble * fix(amazonq): warn user if absolute path found in pom.xml * git issue * show all paths detected * remove unused imports * fix detekt issues * show chat message instead of notif * remove unused imports * fix CI * localize String * fix Lint * assert that messages match * fix lint * update unit test * update text * update text to pass CI * address comment * address nit --------- Co-authored-by: David Hasani <[email protected]>
1 parent 30ac508 commit 4a61ea7

File tree

7 files changed

+67
-2
lines changed

7 files changed

+67
-2
lines changed
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{
2+
"type" : "feature",
3+
"description" : "feat(Amazon Q Code Transformation): warn user if absolute path found in pom.xml"
4+
}

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ import software.aws.toolkits.jetbrains.services.codemodernizer.utils.getSupporte
7070
import software.aws.toolkits.jetbrains.services.codemodernizer.utils.isCodeTransformAvailable
7171
import software.aws.toolkits.jetbrains.services.codemodernizer.utils.isGradleProject
7272
import software.aws.toolkits.jetbrains.services.codemodernizer.utils.openTroubleshootingGuideNotificationAction
73+
import software.aws.toolkits.jetbrains.services.codemodernizer.utils.parseBuildFile
7374
import software.aws.toolkits.jetbrains.services.codemodernizer.utils.parseXmlDependenciesReport
7475
import software.aws.toolkits.jetbrains.services.codemodernizer.utils.setDependencyVersionInPom
7576
import software.aws.toolkits.jetbrains.services.codemodernizer.utils.tryGetJdk
@@ -395,6 +396,8 @@ class CodeModernizerManager(private val project: Project) : PersistentStateCompo
395396
}
396397
}
397398

399+
fun parseBuildFile(): String? = parseBuildFile(codeTransformationSession?.sessionContext?.configurationFile)
400+
398401
internal suspend fun initModernizationJob(session: CodeModernizerSession, copyResult: MavenCopyCommandsResult): CodeModernizerJobCompletedResult =
399402
when (val result = session.createModernizationJob(copyResult)) {
400403
is CodeModernizerStartJobResult.ZipCreationFailed -> {

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -290,9 +290,9 @@ fun buildZipUploadFailedChatMessage(failureReason: UploadFailureReason): String
290290
return resultMessage
291291
}
292292

293-
fun buildAuthRestoredMessage() = CodeTransformChatMessageContent(
293+
fun buildAbsolutePathWarning(warning: String) = CodeTransformChatMessageContent(
294294
type = CodeTransformChatMessageType.FinalizedAnswer,
295-
message = message("codemodernizer.chat.message.reauth_success"),
295+
message = warning,
296296
)
297297

298298
fun buildCompileLocalSuccessChatContent() = CodeTransformChatMessageContent(

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

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import software.aws.toolkits.jetbrains.services.codemodernizer.client.GumbyClien
2626
import software.aws.toolkits.jetbrains.services.codemodernizer.commands.CodeTransformActionMessage
2727
import software.aws.toolkits.jetbrains.services.codemodernizer.commands.CodeTransformCommand
2828
import software.aws.toolkits.jetbrains.services.codemodernizer.constants.FEATURE_NAME
29+
import software.aws.toolkits.jetbrains.services.codemodernizer.constants.buildAbsolutePathWarning
2930
import software.aws.toolkits.jetbrains.services.codemodernizer.constants.buildCheckingValidProjectChatContent
3031
import software.aws.toolkits.jetbrains.services.codemodernizer.constants.buildCompileHilAlternativeVersionContent
3132
import software.aws.toolkits.jetbrains.services.codemodernizer.constants.buildCompileLocalFailedChatContent
@@ -246,6 +247,16 @@ class CodeTransformChatController(
246247
updateLastPendingMessage(buildCompileLocalSuccessChatContent())
247248
}
248249

250+
// show user a non-blocking warning if their build file contains an absolute path
251+
try {
252+
val warningMessage = codeModernizerManager.parseBuildFile()
253+
if (warningMessage != null) {
254+
handleAbsolutePathDetected(warningMessage)
255+
}
256+
} catch (e: Exception) {
257+
// swallow error and move on
258+
}
259+
249260
runInEdt {
250261
codeModernizerManager.runModernize(mavenBuildResult)
251262
}
@@ -443,6 +454,9 @@ class CodeTransformChatController(
443454
BrowserUtil.browse(message.link)
444455
}
445456

457+
private suspend fun handleAbsolutePathDetected(warning: String) =
458+
codeTransformChatHelper.addNewMessage(buildAbsolutePathWarning(warning))
459+
446460
private suspend fun handleCodeTransformUploadCompleted() {
447461
codeTransformChatHelper.addNewMessage(buildTransformBeginChatContent())
448462
codeTransformChatHelper.addNewMessage(buildTransformInProgressChatContent())

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

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ import com.intellij.openapi.util.io.FileUtil
1010
import com.intellij.openapi.vfs.VirtualFile
1111
import software.aws.toolkits.core.utils.createParentDirectories
1212
import software.aws.toolkits.core.utils.exists
13+
import software.aws.toolkits.core.utils.info
14+
import software.aws.toolkits.jetbrains.services.codemodernizer.CodeModernizerManager.Companion.LOG
1315
import software.aws.toolkits.jetbrains.services.codemodernizer.constants.HIL_ARTIFACT_DIR_NAME
1416
import software.aws.toolkits.jetbrains.services.codemodernizer.constants.HIL_ARTIFACT_POMFOLDER_DIR_NAME
1517
import software.aws.toolkits.jetbrains.services.codemodernizer.constants.HIL_DEPENDENCY_REPORT_DIR_NAME
@@ -20,6 +22,8 @@ import software.aws.toolkits.jetbrains.services.codemodernizer.constants.HIL_POM
2022
import software.aws.toolkits.jetbrains.services.codemodernizer.constants.HIL_UPLOAD_ZIP_NAME
2123
import software.aws.toolkits.jetbrains.services.codemodernizer.model.DependencyUpdatesReport
2224
import software.aws.toolkits.jetbrains.services.codemodernizer.model.MAVEN_CONFIGURATION_FILE_NAME
25+
import software.aws.toolkits.jetbrains.services.codewhisperer.util.content
26+
import software.aws.toolkits.resources.message
2327
import java.io.File
2428
import java.io.FileOutputStream
2529
import java.nio.file.Path
@@ -70,6 +74,33 @@ fun findBuildFiles(sourceFolder: File, supportedBuildFileNames: List<String>): L
7074
return buildFiles
7175
}
7276

77+
fun parseBuildFile(buildFile: VirtualFile?): String? {
78+
val absolutePaths = mutableListOf("users/", "system/", "volumes/", "c:\\", "d:\\")
79+
val alias = System.getProperty("user.home").substringAfterLast(File.separator)
80+
absolutePaths.add(alias)
81+
if (buildFile != null && buildFile.exists()) {
82+
val buildFileContents = buildFile.content().lowercase()
83+
val detectedPaths: MutableList<String> = mutableListOf()
84+
for (path in absolutePaths) {
85+
if (buildFileContents.contains(path)) {
86+
detectedPaths.add(path)
87+
}
88+
}
89+
if (detectedPaths.size > 0) {
90+
val warningMessage =
91+
message(
92+
"codemodernizer.chat.message.absolute_path_detected",
93+
detectedPaths.size,
94+
buildFile.name,
95+
detectedPaths.joinToString(", "),
96+
)
97+
LOG.info { "CodeTransformation: absolute path potentially in build file" }
98+
return warningMessage
99+
}
100+
}
101+
return null
102+
}
103+
73104
/**
74105
* Unzips a zip into a dir. Returns the true when successfully unzips the file pointed to by [zipFilePath] to [destDir]
75106
*/

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

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,10 @@ import software.amazon.awssdk.services.codewhispererruntime.model.Transformation
2121
import software.amazon.awssdk.services.ssooidc.model.InvalidGrantException
2222
import software.aws.toolkits.jetbrains.services.codemodernizer.utils.getBillingText
2323
import software.aws.toolkits.jetbrains.services.codemodernizer.utils.getTableMapping
24+
import software.aws.toolkits.jetbrains.services.codemodernizer.utils.parseBuildFile
2425
import software.aws.toolkits.jetbrains.services.codemodernizer.utils.pollTransformationStatusAndPlan
2526
import software.aws.toolkits.jetbrains.services.codemodernizer.utils.refreshToken
27+
import software.aws.toolkits.jetbrains.utils.rules.addFileToModule
2628
import java.util.concurrent.atomic.AtomicBoolean
2729

2830
class CodeWhispererCodeModernizerUtilsTest : CodeWhispererCodeModernizerTestBase() {
@@ -206,6 +208,16 @@ class CodeWhispererCodeModernizerUtilsTest : CodeWhispererCodeModernizerTestBase
206208
assertThat(expected).isEqualTo(actual)
207209
}
208210

211+
@Test
212+
fun `parseBuildFile can detect absolute paths in build file`() {
213+
val module = projectRule.module
214+
val fileText = "<project><properties><path>system/name/here</path></properties></project>"
215+
val file = projectRule.fixture.addFileToModule(module, "pom.xml", fileText)
216+
val expectedWarning = "I detected 1 potential absolute file path(s) in your pom.xml file: **system/**. " +
217+
"Absolute file paths might cause issues when I build your code. Any errors will show up in the build log."
218+
assertThat(parseBuildFile(file.virtualFile)).isEqualTo(expectedWarning)
219+
}
220+
209221
@Test
210222
fun `getBillingText on small project returns correct String`() {
211223
val expected = "<html><body style=\"line-height:2; font-family: Arial, sans-serif; font-size: 14;\"><br>" +

plugins/core/resources/resources/software/aws/toolkits/resources/MessagesBundle.properties

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -565,6 +565,7 @@ codemodernizer.builderrordialog.description.title=Error occurred when building y
565565
codemodernizer.chat.form.user_selection.item.choose_module=Choose a module to transform
566566
codemodernizer.chat.form.user_selection.item.choose_target_version=Choose the target code version
567567
codemodernizer.chat.form.user_selection.title=Q - Code transformation
568+
codemodernizer.chat.message.absolute_path_detected=I detected {0} potential absolute file path(s) in your {1} file: **{2}**. Absolute file paths might cause issues when I build your code. Any errors will show up in the build log.
568569
codemodernizer.chat.message.auth_prompt=Follow instructions to re-authenticate ...
569570
codemodernizer.chat.message.button.cancel=Cancel
570571
codemodernizer.chat.message.button.confirm=Confirm

0 commit comments

Comments
 (0)