Skip to content

Commit b74ba31

Browse files
authored
feat(amazonq): generate scanName from workspace config (#5409)
* feat(amazonq): generate scanName from workspace config * multi-module support * add changelog
1 parent c851437 commit b74ba31

File tree

3 files changed

+35
-2
lines changed

3 files changed

+35
-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" : "/review: Code reviews are now created with additional workspace context to enable grouping of related scans in the backend"
4+
}

plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/codescan/CodeWhispererCodeScanSession.kt

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,21 @@ import com.fasterxml.jackson.databind.DeserializationFeature
77
import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper
88
import com.fasterxml.jackson.module.kotlin.readValue
99
import com.intellij.openapi.application.ApplicationInfo
10+
import com.intellij.openapi.application.ApplicationManager
1011
import com.intellij.openapi.application.runInEdt
1112
import com.intellij.openapi.application.runReadAction
1213
import com.intellij.openapi.fileEditor.FileDocumentManager
1314
import com.intellij.openapi.project.Project
15+
import com.intellij.openapi.project.modules
16+
import com.intellij.openapi.roots.ModuleRootManager
1417
import com.intellij.openapi.vfs.LocalFileSystem
1518
import kotlinx.coroutines.delay
1619
import kotlinx.coroutines.ensureActive
1720
import kotlinx.coroutines.isActive
1821
import kotlinx.coroutines.time.withTimeout
1922
import kotlinx.coroutines.withContext
23+
import migration.software.aws.toolkits.jetbrains.settings.AwsSettings
24+
import org.apache.commons.codec.digest.DigestUtils
2025
import software.amazon.awssdk.services.codewhisperer.model.ArtifactType
2126
import software.amazon.awssdk.services.codewhisperer.model.CodeScanFindingsSchema
2227
import software.amazon.awssdk.services.codewhisperer.model.CodeScanStatus
@@ -33,12 +38,14 @@ import software.aws.toolkits.core.utils.Waiters.waitUntil
3338
import software.aws.toolkits.core.utils.debug
3439
import software.aws.toolkits.core.utils.getLogger
3540
import software.aws.toolkits.core.utils.info
41+
import software.aws.toolkits.core.utils.toHexString
3642
import software.aws.toolkits.jetbrains.services.codewhisperer.codescan.sessionconfig.CodeScanSessionConfig
3743
import software.aws.toolkits.jetbrains.services.codewhisperer.codescan.sessionconfig.PayloadContext
3844
import software.aws.toolkits.jetbrains.services.codewhisperer.credentials.CodeWhispererClientAdaptor
3945
import software.aws.toolkits.jetbrains.services.codewhisperer.explorer.CodeWhispererExplorerActionManager
4046
import software.aws.toolkits.jetbrains.services.codewhisperer.model.CodeScanResponseContext
4147
import software.aws.toolkits.jetbrains.services.codewhisperer.model.CreateUploadUrlServiceInvocationContext
48+
import software.aws.toolkits.jetbrains.services.codewhisperer.telemetry.CodeWhispererTelemetryService
4249
import software.aws.toolkits.jetbrains.services.codewhisperer.util.CodeWhispererConstants
4350
import software.aws.toolkits.jetbrains.services.codewhisperer.util.CodeWhispererConstants.CODE_SCAN_POLLING_INTERVAL_IN_SECONDS
4451
import software.aws.toolkits.jetbrains.services.codewhisperer.util.CodeWhispererConstants.FILE_SCANS_THROTTLING_MESSAGE
@@ -52,12 +59,14 @@ import software.aws.toolkits.jetbrains.services.codewhisperer.util.CodeWhisperer
5259
import software.aws.toolkits.jetbrains.services.codewhisperer.util.getTelemetryErrorMessage
5360
import software.aws.toolkits.jetbrains.utils.assertIsNonDispatchThread
5461
import software.aws.toolkits.resources.message
62+
import software.aws.toolkits.telemetry.CodewhispererCodeScanScope
5563
import software.aws.toolkits.telemetry.CodewhispererLanguage
5664
import java.nio.file.Path
5765
import java.time.Duration
5866
import java.time.Instant
5967
import java.util.UUID
6068
import kotlin.coroutines.coroutineContext
69+
import kotlin.io.path.pathString
6170

6271
class CodeWhispererCodeScanSession(val sessionContext: CodeScanSessionContext) {
6372
private val clientToken: UUID = UUID.randomUUID()
@@ -103,7 +112,7 @@ class CodeWhispererCodeScanSession(val sessionContext: CodeScanSessionContext) {
103112
// 2 & 3. CreateUploadURL and upload the context.
104113
currentCoroutineContext.ensureActive()
105114
val artifactsUploadStartTime = now()
106-
val codeScanName = UUID.randomUUID().toString()
115+
val codeScanName = generateScanName()
107116

108117
val taskType = if (sessionContext.codeAnalysisScope == CodeWhispererConstants.CodeAnalysisScope.PROJECT) {
109118
CodeWhispererConstants.UploadTaskType.SCAN_PROJECT
@@ -366,6 +375,26 @@ class CodeWhispererCodeScanSession(val sessionContext: CodeScanSessionContext) {
366375
private fun isAutoScan(): Boolean =
367376
sessionContext.codeAnalysisScope == CodeWhispererConstants.CodeAnalysisScope.FILE && !sessionContext.sessionConfig.isInitiatedByChat()
368377

378+
private fun generateScanName(): String {
379+
val clientId = AwsSettings.getInstance().clientId
380+
val filePath = sessionContext.sessionConfig.getSelectedFile()?.toNioPath()?.pathString
381+
val scope = CodeWhispererTelemetryService.getInstance().mapToTelemetryScope(
382+
sessionContext.codeAnalysisScope,
383+
sessionContext.sessionConfig.isInitiatedByChat()
384+
)
385+
val projectId = if (scope != CodewhispererCodeScanScope.PROJECT && filePath != null) {
386+
filePath
387+
} else {
388+
ApplicationManager.getApplication().runReadAction<String> {
389+
sessionContext.project.modules.map { module ->
390+
ModuleRootManager.getInstance(module).contentRoots.firstOrNull()?.path
391+
}.joinToString(",")
392+
}
393+
}
394+
395+
return DigestUtils.sha256("$clientId::$projectId::$scope").toHexString()
396+
}
397+
369398
companion object {
370399
private val LOG = getLogger<CodeWhispererCodeScanSession>()
371400
private val MAPPER = jacksonObjectMapper()

plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/telemetry/CodeWhispererTelemetryService.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -285,7 +285,7 @@ class CodeWhispererTelemetryService {
285285
)
286286
}
287287

288-
private fun mapToTelemetryScope(codeAnalysisScope: CodeWhispererConstants.CodeAnalysisScope, initiatedByChat: Boolean): CodewhispererCodeScanScope =
288+
fun mapToTelemetryScope(codeAnalysisScope: CodeWhispererConstants.CodeAnalysisScope, initiatedByChat: Boolean): CodewhispererCodeScanScope =
289289
when (codeAnalysisScope) {
290290
CodeWhispererConstants.CodeAnalysisScope.FILE -> {
291291
if (initiatedByChat) {

0 commit comments

Comments
 (0)