1
1
package cc.unitmesh.container
2
2
3
3
import cc.unitmesh.devti.provider.RunService
4
+ import com.intellij.clouds.docker.gateway.DockerDevcontainerDeployContext
5
+ import com.intellij.clouds.docker.gateway.ui.DockerDeployView
6
+ import com.intellij.docker.DockerCloudConfiguration
7
+ import com.intellij.docker.agent.devcontainers.DevcontainerPaths
8
+ import com.intellij.docker.agent.devcontainers.buildStrategy.DevcontainerBuildStrategy.LocalBuildData
4
9
import com.intellij.docker.agent.util.nullize
5
10
import com.intellij.docker.connection.sshId
6
11
import com.intellij.docker.utils.createDefaultDockerServer
7
12
import com.intellij.docker.utils.getDockerServers
8
13
import com.intellij.execution.configurations.RunProfile
9
14
import com.intellij.openapi.actionSystem.AnAction
10
15
import com.intellij.openapi.project.Project
16
+ import com.intellij.openapi.project.guessProjectDir
17
+ import com.intellij.openapi.ui.DialogWrapper
11
18
import com.intellij.openapi.vfs.VirtualFile
12
19
import com.intellij.psi.PsiElement
13
20
import com.intellij.remoteServer.configuration.RemoteServer
21
+ import com.intellij.util.ui.JBUI
22
+ import com.intellij.util.ui.components.BorderLayoutPanel
23
+ import com.jetbrains.rd.util.lifetime.Lifetime
24
+ import java.io.File
25
+ import javax.swing.JComponent
14
26
15
27
class RunDevContainerService : RunService {
16
28
override fun isApplicable (project : Project , file : VirtualFile ): Boolean = file.name == " devcontainer.json"
@@ -28,19 +40,62 @@ class RunDevContainerService : RunService {
28
40
return null
29
41
}
30
42
43
+ val server = dockerServers().firstOrNull() ? : return null
44
+ val projectDir = project.guessProjectDir()!! .toNioPath().toFile()
45
+ // / write virtualFile to projectDir/devcontainer.json
46
+ val devcontainerFile = File (projectDir, " devcontainer.json" )
47
+ devcontainerFile.writeText(virtualFile.contentsToByteArray().toString(Charsets .UTF_8 ))
48
+
49
+ val content = createContext(devcontainerFile, projectDir, server)
50
+ val wrapper = object : DialogWrapper (project) {
51
+ override fun createCenterPanel (): JComponent ? {
52
+ val lifetime = Lifetime .Companion .Eternal
53
+ val component = DockerDeployView (project, lifetime, content).component
54
+
55
+ val contentPlanel = BorderLayoutPanel ()
56
+ component.setBorder(JBUI .Borders .empty())
57
+ contentPlanel.add(component)
58
+ contentPlanel.revalidate()
59
+ contentPlanel.repaint()
60
+ return contentPlanel
61
+ }
62
+ }
63
+
64
+ wrapper.show()
31
65
return createActions.first().templatePresentation.text
32
66
}
33
67
34
68
fun createActions (project : Project ): List <AnAction > {
69
+ val filteredServers =
70
+ dockerServers()
71
+
72
+ return filteredServers.map {
73
+ createDevcontainerCreateWithMountedSources(it)
74
+ }
75
+ }
76
+
77
+ private fun dockerServers (): List <RemoteServer <DockerCloudConfiguration >> {
35
78
val filteredServers =
36
79
getDockerServers().filter {
37
80
it.sshId == null
38
81
}.nullize()
39
82
? : listOf (createDefaultDockerServer(" Local" ))
83
+ return filteredServers
84
+ }
40
85
41
- return filteredServers.map {
42
- createDevcontainerCreateWithMountedSources(it)
43
- }
86
+ fun createContext (
87
+ modelFile : File ,
88
+ workingDir : File ,
89
+ dockerServer : RemoteServer <DockerCloudConfiguration >
90
+ ): DockerDevcontainerDeployContext {
91
+ val path = modelFile.toPath()
92
+ val computeSourcesMountPath = DevcontainerPaths .computeSourcesMountPath(path)
93
+ val sources = (computeSourcesMountPath?.toFile())
94
+
95
+ val deployContext = DockerDevcontainerDeployContext ()
96
+ deployContext.config = dockerServer
97
+ deployContext.buildFromLocalSources = LocalBuildData (workingDir, modelFile, sources, true )
98
+ return deployContext
44
99
}
45
100
46
101
fun createDevcontainerCreateWithMountedSources (server : RemoteServer <* >): AnAction {
0 commit comments