@@ -3,22 +3,25 @@ package cc.unitmesh.container.provider
3
3
import cc.unitmesh.devti.provider.context.ChatContextItem
4
4
import cc.unitmesh.devti.provider.context.ChatContextProvider
5
5
import cc.unitmesh.devti.provider.context.ChatCreationContext
6
+ import cc.unitmesh.devti.sketch.ui.patch.readText
6
7
import com.intellij.docker.DockerFileSearch
7
8
import com.intellij.docker.dockerFile.parser.psi.DockerFileFromCommand
9
+ import com.intellij.openapi.application.runReadAction
8
10
import com.intellij.openapi.diagnostic.logger
9
11
import com.intellij.openapi.project.Project
10
12
import com.intellij.psi.PsiManager
11
13
import com.intellij.psi.util.PsiTreeUtil
12
14
13
15
class DockerContextProvider : ChatContextProvider {
16
+ private val fromRegex = Regex (" FROM\\ s(.*)" )
17
+
14
18
override fun isApplicable (project : Project , creationContext : ChatCreationContext ): Boolean =
15
19
DockerFileSearch .getInstance().getDockerFiles(project).isNotEmpty()
16
20
17
21
override suspend fun collect (
18
22
project : Project ,
19
23
creationContext : ChatCreationContext
20
24
): List <ChatContextItem > {
21
-
22
25
val dockerFiles = DockerFileSearch .getInstance().getDockerFiles(project).mapNotNull {
23
26
PsiManager .getInstance(project).findFile(it)
24
27
}
@@ -27,25 +30,33 @@ class DockerContextProvider : ChatContextProvider {
27
30
28
31
var context = " This project use Docker."
29
32
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} "
33
37
38
+ var additionalCtx = " "
39
+ try {
34
40
val fromCommands = dockerFiles.mapNotNull {
35
41
PsiTreeUtil .getChildrenOfType(it, DockerFileFromCommand ::class .java)?.toList()
36
42
}.flatten()
37
43
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 }
46
46
} catch (e: Exception ) {
47
47
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
+ }
49
57
}
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))
50
61
}
51
62
}
0 commit comments