Skip to content

Commit 2649ffd

Browse files
committed
feat(docker): enhance DockerContextProvider with regex and runReadAction #306
- Add fromRegex to extract 'FROM' commands from Docker files. - Use runReadAction to safely access Docker file content. - Update context generation logic to handle errors gracefully and improve output.
1 parent aee75a5 commit 2649ffd

File tree

2 files changed

+26
-13
lines changed

2 files changed

+26
-13
lines changed

exts/ext-container/src/233/main/kotlin/cc/unitmesh/container/provider/DockerContextProvider.kt

Lines changed: 24 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -3,22 +3,25 @@ package cc.unitmesh.container.provider
33
import cc.unitmesh.devti.provider.context.ChatContextItem
44
import cc.unitmesh.devti.provider.context.ChatContextProvider
55
import cc.unitmesh.devti.provider.context.ChatCreationContext
6+
import cc.unitmesh.devti.sketch.ui.patch.readText
67
import com.intellij.docker.DockerFileSearch
78
import com.intellij.docker.dockerFile.parser.psi.DockerFileFromCommand
9+
import com.intellij.openapi.application.runReadAction
810
import com.intellij.openapi.diagnostic.logger
911
import com.intellij.openapi.project.Project
1012
import com.intellij.psi.PsiManager
1113
import com.intellij.psi.util.PsiTreeUtil
1214

1315
class DockerContextProvider : ChatContextProvider {
16+
private val fromRegex = Regex("FROM\\s(.*)")
17+
1418
override fun isApplicable(project: Project, creationContext: ChatCreationContext): Boolean =
1519
DockerFileSearch.getInstance().getDockerFiles(project).isNotEmpty()
1620

1721
override suspend fun collect(
1822
project: Project,
1923
creationContext: ChatCreationContext
2024
): List<ChatContextItem> {
21-
2225
val dockerFiles = DockerFileSearch.getInstance().getDockerFiles(project).mapNotNull {
2326
PsiManager.getInstance(project).findFile(it)
2427
}
@@ -27,25 +30,33 @@ class DockerContextProvider : ChatContextProvider {
2730

2831
var context = "This project use Docker."
2932

30-
try {
31-
val virtualFile = dockerFiles.firstOrNull()?.virtualFile
32-
context = "This project use Docker, path: ${virtualFile?.path}"
33+
val virtualFile = dockerFiles.firstOrNull()?.virtualFile
34+
?: return listOf(ChatContextItem(DockerContextProvider::class, context))
35+
36+
context = "This project use Docker, path: ${virtualFile.path}"
3337

38+
var additionalCtx = ""
39+
try {
3440
val fromCommands = dockerFiles.mapNotNull {
3541
PsiTreeUtil.getChildrenOfType(it, DockerFileFromCommand::class.java)?.toList()
3642
}.flatten()
3743

38-
if (fromCommands.isEmpty()) {
39-
return listOf(ChatContextItem(DockerContextProvider::class, context))
40-
}
41-
42-
val text = "This project use Docker to run in server. Here is related info:\n" +
43-
fromCommands.joinToString("\n") { it.text }
44-
45-
return listOf(ChatContextItem(DockerContextProvider::class, text))
44+
if (fromCommands.isEmpty()) return listOf(ChatContextItem(DockerContextProvider::class, context))
45+
additionalCtx = fromCommands.joinToString("\n") { it.text }
4646
} catch (e: Exception) {
4747
logger<DockerContextProvider>().warn("Failed to collect Docker context", e)
48-
return listOf(ChatContextItem(DockerContextProvider::class, context))
48+
val fromMatch = fromRegex.find(virtualFile.readText() ?: "")
49+
50+
if (fromMatch != null) {
51+
additionalCtx = fromMatch.groupValues[1]
52+
}
53+
54+
if (additionalCtx.isEmpty()) {
55+
return listOf(ChatContextItem(DockerContextProvider::class, context))
56+
}
4957
}
58+
59+
val text = "This project use Docker to run in server. Here is related info:\n$additionalCtx"
60+
return listOf(ChatContextItem(DockerContextProvider::class, text))
5061
}
5162
}

exts/ext-dependencies/src/233/main/resources/cc.unitmesh.dependencies.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@
1717
<!-- <dependencyModel implementation="cc.unitmesh.dependencies.AutoDevProjectDependenciesModel"/>-->
1818
<!-- </extensions>-->
1919

20+
<!-- a posiable refs : https://github.com/redhat-developer/intellij-dependency-analytics -->
21+
2022
<extensions defaultExtensionNs="cc.unitmesh">
2123
<toolchainFunctionProvider implementation="cc.unitmesh.dependencies.DependenciesFunctionProvider"/>
2224
</extensions>

0 commit comments

Comments
 (0)