33
44package software.aws.toolkits.jetbrains.services.amazonq.lsp.artifacts
55
6+ import com.intellij.openapi.actionSystem.AnAction
7+ import com.intellij.openapi.actionSystem.AnActionEvent
68import com.intellij.util.io.createDirectories
9+ import com.intellij.util.text.SemVer
710import software.aws.toolkits.core.utils.deleteIfExists
811import software.aws.toolkits.core.utils.error
912import 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 }
0 commit comments