Skip to content

Commit 65f6f68

Browse files
committed
Addressing code review comments
1 parent 60c4b1c commit 65f6f68

File tree

3 files changed

+49
-18
lines changed

3 files changed

+49
-18
lines changed

plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/artifacts/ArtifactHelper.kt

Lines changed: 37 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,10 @@
33

44
package software.aws.toolkits.jetbrains.services.amazonq.lsp.artifacts
55

6+
import com.intellij.openapi.actionSystem.AnAction
7+
import com.intellij.openapi.actionSystem.AnActionEvent
68
import com.intellij.util.io.createDirectories
9+
import com.intellij.util.text.SemVer
710
import software.aws.toolkits.core.utils.deleteIfExists
811
import software.aws.toolkits.core.utils.error
912
import software.aws.toolkits.core.utils.exists
@@ -21,14 +24,14 @@ class ArtifactHelper(private val lspArtifactsPath: Path = DEFAULT_ARTIFACT_PATH)
2124
private val DEFAULT_ARTIFACT_PATH = getToolkitsCommonCacheRoot().resolve("aws").resolve("toolkits").resolve("language-servers")
2225
private val logger = getLogger<ArtifactHelper>()
2326
private const val MAX_DOWNLOAD_ATTEMPTS = 3
24-
private val currentAttempt = AtomicInteger(0)
2527
}
28+
private val currentAttempt = AtomicInteger(0)
2629

27-
fun removeDeListedVersions(deListedVersions: List<ManifestManager.Version>) {
28-
val localFolders: List<Path> = getSubFolders(lspArtifactsPath)
30+
fun removeDelistedVersions(delistedVersions: List<ManifestManager.Version>) {
31+
val localFolders = getSubFolders(lspArtifactsPath)
2932

30-
deListedVersions.forEach { deListedVersion ->
31-
val versionToDelete = deListedVersion.serverVersion ?: return@forEach
33+
delistedVersions.forEach { delistedVersion ->
34+
val versionToDelete = delistedVersion.serverVersion ?: return@forEach
3235

3336
localFolders
3437
.filter { folder -> folder.fileName.toString() == versionToDelete }
@@ -43,7 +46,31 @@ class ArtifactHelper(private val lspArtifactsPath: Path = DEFAULT_ARTIFACT_PATH)
4346
}
4447
}
4548

46-
fun getExistingLSPArtifacts(versions: List<ManifestManager.Version>, target: ManifestManager.VersionTarget?): Boolean {
49+
fun deleteOlderLspArtifacts(manifestVersionRanges: ArtifactManager.SupportedManifestVersionRange) {
50+
val localFolders = getSubFolders(lspArtifactsPath)
51+
52+
val validVersions = localFolders
53+
.mapNotNull { localFolder ->
54+
SemVer.parseFromText(localFolder.fileName.toString())?.let { semVer ->
55+
if (semVer in manifestVersionRanges.startVersion..manifestVersionRanges.endVersion) {
56+
localFolder to semVer
57+
} else null
58+
}
59+
}
60+
.sortedByDescending { (_, semVer) -> semVer }
61+
62+
// Keep the latest 2 versions, delete others
63+
validVersions.drop(2).forEach { (folder, _) ->
64+
try {
65+
folder.toFile().deleteRecursively()
66+
logger.info { "Deleted older LSP artifact: ${folder.fileName}" }
67+
} catch (e: Exception) {
68+
logger.error(e) { "Failed to delete older LSP artifact: ${folder.fileName}" }
69+
}
70+
}
71+
}
72+
73+
fun getExistingLspArtifacts(versions: List<ManifestManager.Version>, target: ManifestManager.VersionTarget?): Boolean {
4774
if (versions.isEmpty() || target?.contents == null) return false
4875

4976
val localLSPPath = lspArtifactsPath.resolve(versions.first().serverVersion.toString())
@@ -52,7 +79,7 @@ class ArtifactHelper(private val lspArtifactsPath: Path = DEFAULT_ARTIFACT_PATH)
5279
val hasInvalidFiles = target.contents.any { content ->
5380
content.filename?.let { filename ->
5481
val filePath = localLSPPath.resolve(filename)
55-
!filePath.exists() || generateMD5Hash(filePath) != content.hashes?.firstOrNull()
82+
!filePath.exists() || !validateFileHash(filePath, content.hashes?.firstOrNull())
5683
} ?: false
5784
}
5885

@@ -64,7 +91,7 @@ class ArtifactHelper(private val lspArtifactsPath: Path = DEFAULT_ARTIFACT_PATH)
6491
logger.error(e) { "Failed to delete mismatched LSP artifacts at: $localLSPPath" }
6592
}
6693
}
67-
return hasInvalidFiles
94+
return !hasInvalidFiles
6895
}
6996

7097
fun tryDownloadLspArtifacts(versions: List<ManifestManager.Version>, target: ManifestManager.VersionTarget?) {
@@ -139,7 +166,8 @@ class ArtifactHelper(private val lspArtifactsPath: Path = DEFAULT_ARTIFACT_PATH)
139166
}
140167
}
141168

142-
private fun validateFileHash(filePath: Path, expectedHash: String): Boolean {
169+
private fun validateFileHash(filePath: Path, expectedHash: String?): Boolean {
170+
if(expectedHash == null) return false
143171
val contentHash = generateSHA384Hash(filePath)
144172
return "sha384:$contentHash" == expectedHash
145173
}

plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/artifacts/ArtifactManager.kt

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@ package software.aws.toolkits.jetbrains.services.amazonq.lsp.artifacts
55

66
import com.intellij.util.text.SemVer
77
import org.assertj.core.util.VisibleForTesting
8+
import software.aws.toolkits.core.utils.error
89
import software.aws.toolkits.core.utils.getLogger
9-
import software.aws.toolkits.core.utils.info
1010
import software.aws.toolkits.jetbrains.services.amazonq.project.manifest.ManifestManager
1111

1212
class ArtifactManager {
@@ -53,7 +53,7 @@ class ArtifactManager {
5353
)
5454
val lspVersions = getLSPVersionsFromManifestWithSpecifiedRange(manifest)
5555

56-
this.artifactHelper.removeDeListedVersions(lspVersions.deListedVersions)
56+
this.artifactHelper.removeDelistedVersions(lspVersions.deListedVersions)
5757

5858
if (lspVersions.inRangeVersions.isEmpty()) {
5959
// No versions are found which are in the given range.
@@ -64,12 +64,11 @@ class ArtifactManager {
6464
val target = getTargetFromLspManifest(lspVersions.inRangeVersions)
6565

6666
// Get Local LSP files and check if we can re-use existing LSP Artifacts
67-
if (this.artifactHelper.getExistingLSPArtifacts(lspVersions.inRangeVersions, target)) {
68-
return
67+
if (!this.artifactHelper.getExistingLspArtifacts(lspVersions.inRangeVersions, target)) {
68+
this.artifactHelper.tryDownloadLspArtifacts(lspVersions.inRangeVersions, target)
6969
}
7070

71-
this.artifactHelper.tryDownloadLspArtifacts(lspVersions.inRangeVersions, target)
72-
logger.info { "Success" }
71+
this.artifactHelper.deleteOlderLspArtifacts(manifestVersionRanges)
7372
}
7473

7574
@VisibleForTesting
@@ -102,8 +101,11 @@ class ArtifactManager {
102101
target.platform == currentOS && target.arch == currentArchitecture
103102
}
104103
if (currentTarget == null) {
104+
logger.error {"Failed to obtain target for $currentOS and $currentArchitecture" }
105105
throw LspException("Target not found in the current Version: ${versions.first().serverVersion}", LspException.ErrorCode.TARGET_NOT_FOUND)
106106
}
107+
logger.info("Target found in the current Version: ${versions.first().serverVersion}")
107108
return currentTarget
108109
}
110+
109111
}

plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/artifacts/LspUtils.kt

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,9 +33,10 @@ fun getCurrentOS(): String = when {
3333
else -> "linux"
3434
}
3535

36-
fun getCurrentArchitecture() = when {
37-
CpuArch.CURRENT == CpuArch.X86_64 -> "x64"
38-
else -> "arm64"
36+
fun getCurrentArchitecture() = when(CpuArch.CURRENT) {
37+
CpuArch.X86_64 -> "x64"
38+
CpuArch.ARM64 -> "arm64"
39+
else -> "unknown"
3940
}
4041

4142
fun generateMD5Hash(filePath: Path): String {

0 commit comments

Comments
 (0)