Skip to content

Commit 72fa299

Browse files
committed
feat(container): add RunDevContainerService for devcontainer.json support #306
- Introduced RunDevContainerService to handle devcontainer.json files. - Updated AutoDevRunAction to support JSON files and integrate with RunDevContainerService. - Removed redundant code from RunDockerfileService.
1 parent 31479d9 commit 72fa299

File tree

4 files changed

+70
-29
lines changed

4 files changed

+70
-29
lines changed

core/src/main/kotlin/cc/unitmesh/devti/gui/snippet/AutoDevRunAction.kt

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,10 @@ package cc.unitmesh.devti.gui.snippet
22

33
import cc.unitmesh.devti.AutoDevBundle
44
import cc.unitmesh.devti.AutoDevNotifications
5+
import cc.unitmesh.devti.gui.snippet.container.AutoDevContainer
56
import cc.unitmesh.devti.provider.RunService
67
import com.intellij.ide.scratch.ScratchRootType
8+
import com.intellij.json.JsonLanguage
79
import com.intellij.openapi.actionSystem.ActionUpdateThread
810
import com.intellij.openapi.actionSystem.AnActionEvent
911
import com.intellij.openapi.actionSystem.PlatformDataKeys
@@ -15,6 +17,7 @@ import com.intellij.openapi.project.guessProjectDir
1517
import com.intellij.openapi.util.NlsSafe
1618
import com.intellij.openapi.vfs.VirtualFile
1719
import com.intellij.psi.PsiManager
20+
import com.intellij.testFramework.LightVirtualFile
1821
import java.io.File
1922
import java.io.IOException
2023

@@ -29,6 +32,14 @@ class AutoDevRunAction : DumbAwareAction(AutoDevBundle.message("autodev.run.acti
2932
val file = FileDocumentManager.getInstance().getFile(document)
3033

3134
if (file != null) {
35+
val lightFile = file as? LightVirtualFile
36+
if (lightFile?.language == JsonLanguage.INSTANCE) {
37+
val virtualFile = AutoDevContainer.updateForDevContainer(project, file, document.text)
38+
?: lightFile
39+
e.presentation.isEnabled = RunService.provider(project, virtualFile) != null
40+
return
41+
}
42+
3243
e.presentation.isEnabled = RunService.provider(project, file) != null
3344
return
3445
}
@@ -50,6 +61,8 @@ class AutoDevRunAction : DumbAwareAction(AutoDevBundle.message("autodev.run.acti
5061

5162
if (scratchFile?.extension == "Dockerfile") {
5263
scratchFile = createDockerFile(project, document.text) ?: scratchFile
64+
} else if (scratchFile?.extension?.lowercase() == "json") {
65+
scratchFile = AutoDevContainer.updateForDevContainer(project, file as LightVirtualFile, document.text) ?: scratchFile
5366
}
5467

5568
if (scratchFile == null) {
@@ -65,7 +78,7 @@ class AutoDevRunAction : DumbAwareAction(AutoDevBundle.message("autodev.run.acti
6578
?: return
6679

6780
try {
68-
RunService.provider(project, file)
81+
RunService.provider(project, scratchFile)
6982
?.runFile(project, scratchFile, psiFile, isFromToolAction = true)
7083
?: RunService.runInCli(project, psiFile)
7184
?: AutoDevNotifications.notify(project, "No run service found for ${file.name}")
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
package cc.unitmesh.container
2+
3+
import cc.unitmesh.devti.provider.RunService
4+
import com.intellij.docker.agent.util.nullize
5+
import com.intellij.docker.connection.sshId
6+
import com.intellij.docker.utils.createDefaultDockerServer
7+
import com.intellij.docker.utils.getDockerServers
8+
import com.intellij.execution.configurations.RunProfile
9+
import com.intellij.openapi.actionSystem.AnAction
10+
import com.intellij.openapi.project.Project
11+
import com.intellij.openapi.vfs.VirtualFile
12+
import com.intellij.psi.PsiElement
13+
import com.intellij.remoteServer.configuration.RemoteServer
14+
15+
class RunDevContainerService : RunService {
16+
override fun isApplicable(project: Project, file: VirtualFile): Boolean = file.name == "devcontainer.json"
17+
18+
override fun runConfigurationClass(project: Project): Class<out RunProfile>? = null
19+
20+
override fun runFile(
21+
project: Project,
22+
virtualFile: VirtualFile,
23+
psiElement: PsiElement?,
24+
isFromToolAction: Boolean
25+
): String? {
26+
val createActions = createActions(project)
27+
if (createActions.isEmpty()) {
28+
return null
29+
}
30+
31+
return createActions.first().templatePresentation.text
32+
}
33+
34+
fun createActions(project: Project): List<AnAction> {
35+
val filteredServers =
36+
getDockerServers().filter {
37+
it.sshId == null
38+
}.nullize()
39+
?: listOf(createDefaultDockerServer("Local"))
40+
41+
return filteredServers.map {
42+
createDevcontainerCreateWithMountedSources(it)
43+
}
44+
}
45+
46+
fun createDevcontainerCreateWithMountedSources(server: RemoteServer<*>): AnAction {
47+
val clazz = Class.forName("com.intellij.clouds.docker.gateway.actions.DevcontainerCreateWithMountedSources")
48+
val constructor = clazz.declaredConstructors.firstOrNull {
49+
it.parameterCount == 1 && it.parameterTypes[0] == RemoteServer::class.java
50+
} ?: throw IllegalStateException("Constructor not found")
51+
52+
constructor.isAccessible = true
53+
return constructor.newInstance(server) as AnAction
54+
}
55+
}

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

Lines changed: 0 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,10 @@ import com.intellij.docker.DockerCloudConfiguration
55
import com.intellij.docker.DockerCloudType
66
import com.intellij.docker.DockerRunConfigurationCreator
77
import com.intellij.docker.DockerServerRuntimesManager
8-
import com.intellij.docker.agent.util.nullize
9-
import com.intellij.docker.connection.sshId
108
import com.intellij.docker.deploymentSource.DockerImageDeploymentSourceType
119
import com.intellij.docker.runtimes.DockerServerRuntime
12-
import com.intellij.docker.utils.createDefaultDockerServer
13-
import com.intellij.docker.utils.getDockerServers
1410
import com.intellij.execution.configurations.RunConfiguration
1511
import com.intellij.execution.configurations.RunProfile
16-
import com.intellij.openapi.actionSystem.AnAction
1712
import com.intellij.openapi.application.runReadAction
1813
import com.intellij.openapi.project.Project
1914
import com.intellij.openapi.vfs.VirtualFile
@@ -74,27 +69,4 @@ class RunDockerfileService : RunService {
7469

7570
return runtime
7671
}
77-
78-
79-
fun createActions(project: Project): List<AnAction> {
80-
val filteredServers =
81-
getDockerServers().filter {
82-
it.sshId == null
83-
}.nullize()
84-
?: listOf(createDefaultDockerServer("Local"))
85-
86-
return filteredServers.map {
87-
createDevcontainerCreateWithMountedSources(it)
88-
}
89-
}
90-
91-
fun createDevcontainerCreateWithMountedSources(server: RemoteServer<*>): AnAction {
92-
val clazz = Class.forName("com.intellij.clouds.docker.gateway.actions.DevcontainerCreateWithMountedSources")
93-
val constructor = clazz.declaredConstructors.firstOrNull {
94-
it.parameterCount == 1 && it.parameterTypes[0] == RemoteServer::class.java
95-
} ?: throw IllegalStateException("Constructor not found")
96-
97-
constructor.isAccessible = true
98-
return constructor.newInstance(server) as AnAction
99-
}
10072
}

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,5 +8,6 @@
88
<!-- Since limit of Docker, we move implementation to docker-contrib.xml -->
99
<extensions defaultExtensionNs="cc.unitmesh">
1010
<runService implementation="cc.unitmesh.container.RunDockerfileService"/>
11+
<runService implementation="cc.unitmesh.container.RunDevContainerService"/>
1112
</extensions>
1213
</idea-plugin>

0 commit comments

Comments
 (0)