Skip to content

Commit a151216

Browse files
Improve Handling of Daemon Process
- Use build in ConsoleView to have a read-only output view - Restart flawlessly - Make peer argument optionally to start a first peer
1 parent d0ea3a2 commit a151216

File tree

3 files changed

+64
-25
lines changed

3 files changed

+64
-25
lines changed

src/main/kotlin/io/github/ethersync/EthersyncServiceImpl.kt

Lines changed: 38 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,11 @@
11
package io.github.ethersync
22

3-
import com.intellij.execution.ExecutionListener
4-
import com.intellij.execution.ExecutionManager
53
import com.intellij.execution.configurations.GeneralCommandLine
6-
import com.intellij.execution.process.ProcessAdapter
4+
import com.intellij.execution.process.ColoredProcessHandler
75
import com.intellij.execution.process.ProcessEvent
86
import com.intellij.execution.process.ProcessHandler
9-
import com.intellij.execution.process.ProcessHandlerFactory
10-
import com.intellij.execution.runners.ExecutionEnvironment
11-
import com.intellij.openapi.application.EDT
7+
import com.intellij.execution.process.ProcessListener
8+
import com.intellij.execution.ui.ConsoleView
129
import com.intellij.openapi.components.Service
1310
import com.intellij.openapi.diagnostic.logger
1411
import com.intellij.openapi.editor.EditorFactory
@@ -22,11 +19,10 @@ import com.intellij.openapi.project.ProjectManagerListener
2219
import com.intellij.openapi.rd.util.withUiContext
2320
import com.intellij.openapi.util.Key
2421
import com.intellij.openapi.vfs.VirtualFile
22+
import com.intellij.openapi.wm.ToolWindowManager
2523
import com.intellij.util.io.await
2624
import com.intellij.util.io.awaitExit
2725
import com.intellij.util.io.readLineAsync
28-
import com.jediterm.terminal.TtyConnector
29-
import com.jediterm.terminal.model.TerminalModelListener
3026
import io.github.ethersync.protocol.*
3127
import io.github.ethersync.settings.AppSettings
3228
import io.github.ethersync.sync.Changetracker
@@ -35,13 +31,10 @@ import kotlinx.coroutines.CoroutineScope
3531
import kotlinx.coroutines.launch
3632
import org.eclipse.lsp4j.jsonrpc.Launcher
3733
import org.eclipse.lsp4j.jsonrpc.ResponseErrorException
38-
import org.jetbrains.plugins.terminal.ProxyTtyConnector
39-
import org.jetbrains.plugins.terminal.TerminalToolWindowManager
4034
import java.io.BufferedReader
4135
import java.io.File
4236
import java.io.InputStreamReader
4337
import java.util.concurrent.Executors
44-
import java.util.function.Consumer
4538

4639
private val LOG = logger<EthersyncServiceImpl>()
4740

@@ -52,6 +45,7 @@ class EthersyncServiceImpl(
5245
) : EthersyncService {
5346

5447
private var launcher: Launcher<RemoteEthersyncClientProtocol>? = null
48+
private var daemonProcess: ProcessHandler? = null
5549
private var clientProcess: Process? = null
5650

5751
private val changetracker: Changetracker = Changetracker(project, cs)
@@ -103,6 +97,11 @@ class EthersyncServiceImpl(
10397
it.awaitExit()
10498
clientProcess = null
10599
}
100+
daemonProcess?.let {
101+
it.detachProcess()
102+
it.destroyProcess()
103+
daemonProcess = null
104+
}
106105
changetracker.clear()
107106
cursortracker.clear()
108107
}
@@ -118,32 +117,47 @@ class EthersyncServiceImpl(
118117
}
119118

120119
val cmd = GeneralCommandLine(AppSettings.getInstance().state.ethersyncBinaryPath)
120+
cmd.workDirectory = projectDirectory
121121
cmd.addParameter("daemon")
122-
cmd.addParameter("--peer")
123-
cmd.addParameter(peer)
122+
if (peer.isNotBlank()) {
123+
cmd.addParameter("--peer")
124+
cmd.addParameter(peer)
125+
}
124126
cmd.addParameter("--socket-name")
125127
cmd.addParameter(socket)
126128

127129
cs.launch {
128130
shutdown()
129131

130132
withUiContext {
131-
// TODO: how to detect errors in the daemon process?
132-
// TODO: how to reuse the terminal?
133-
// TODO: how to make readonly?
134-
// TODO: how to close after exit?
135-
val terminalWidget = TerminalToolWindowManager.getInstance(project)
136-
.createLocalShellWidget(project.basePath, "Ethersync Daemon")
137-
138-
terminalWidget.executeCommand(cmd.commandLineString)
139-
terminalWidget.terminalTextBuffer.addModelListener(object : TerminalModelListener {
140-
override fun modelChanged() {
141-
if (terminalWidget.terminalTextBuffer.screenLines.contains("Others can connect with")) {
133+
daemonProcess = ColoredProcessHandler(cmd)
134+
135+
daemonProcess!!.addProcessListener(object : ProcessListener {
136+
override fun onTextAvailable(event: ProcessEvent, outputType: Key<*>) {
137+
if (event.text.contains("Others can connect with")) {
142138
launchEthersyncClient(socket, projectDirectory)
143139
}
144140
}
141+
142+
override fun processTerminated(event: ProcessEvent) {
143+
cs.launch {
144+
shutdown()
145+
}
146+
}
145147
})
148+
149+
150+
val tw = ToolWindowManager.getInstance(project).getToolWindow("ethersync")!!
151+
val console = tw.contentManager.findContent("Daemon")!!.component
152+
if (console is ConsoleView) {
153+
console.attachToProcess(daemonProcess!!)
154+
}
155+
156+
tw.show()
157+
158+
daemonProcess!!.startNotify()
146159
}
160+
147161
}
148162
}
149163

@@ -207,7 +221,6 @@ class EthersyncServiceImpl(
207221
while (true) {
208222
val line = stderr.readLineAsync() ?: break;
209223
LOG.trace(line)
210-
System.out.println(line)
211224
}
212225
}
213226
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package io.github.ethersync
2+
3+
import com.intellij.execution.filters.TextConsoleBuilderFactory
4+
import com.intellij.openapi.project.Project
5+
import com.intellij.openapi.wm.ToolWindow
6+
import com.intellij.openapi.wm.ToolWindowFactory
7+
import com.intellij.ui.content.ContentFactory
8+
9+
class EthersyncToolWindowFactory : ToolWindowFactory {
10+
11+
override fun createToolWindowContent(project: Project, toolWindow: ToolWindow) {
12+
val console = TextConsoleBuilderFactory.getInstance()
13+
.createBuilder(project)
14+
.console
15+
16+
val content = ContentFactory.getInstance()
17+
.createContent(console.component, "Daemon", true)
18+
19+
toolWindow.contentManager.addContent(content)
20+
}
21+
}

src/main/resources/META-INF/plugin.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,11 @@
2323
<projectService
2424
serviceInterface="io.github.ethersync.EthersyncService"
2525
serviceImplementation="io.github.ethersync.EthersyncServiceImpl"/>
26+
27+
<toolWindow
28+
id="ethersync"
29+
icon="io.github.ethersync.Icons.PluginIcon"
30+
factoryClass="io.github.ethersync.EthersyncToolWindowFactory"/>
2631
</extensions>
2732

2833
<actions>

0 commit comments

Comments
 (0)