12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273 |
- using System;
- using System.Diagnostics;
- using System.IO;
- using System.Threading.Tasks;
- using Debug = UnityEngine.Debug;
- namespace SingularityGroup.HotReload.Editor.Cli {
- class LinuxCliController : ICliController {
- Process process;
- public string BinaryFileName => "CodePatcherCLI";
- public string PlatformName => "linux-x64";
- public bool CanOpenInBackground => true;
- public Task Start(StartArgs args) {
- var startScript = Path.Combine(args.executableSourceDir, "hotreload-start-script.sh");
- if (!File.Exists(startScript)) {
- throw new FileNotFoundException(startScript);
- }
- File.WriteAllText(startScript, File.ReadAllText(startScript).Replace("\r\n", "\n"));
- CliUtils.Chmod(startScript);
- var title = CodePatcher.TAG + "Server " + new DirectoryInfo(args.unityProjDir).Name;
- title = title.Replace(" ", "-");
- title = title.Replace("'", "");
- var cliargsfile = Path.GetTempFileName();
- File.WriteAllText(cliargsfile,args.cliArguments);
- var codePatcherProc = Process.Start(new ProcessStartInfo {
- FileName = startScript,
- Arguments =
- $"--title \"{title}\""
- + $" --executables-source-dir \"{args.executableSourceDir}\" "
- + $" --executable-taget-dir \"{args.executableTargetDir}\""
- + $" --pidfile \"{CliUtils.GetPidFilePath(args.hotreloadTempDir)}\""
- + $" --cli-arguments-file \"{cliargsfile}\""
- + $" --method-patch-dir \"{args.cliTempDir}\""
- + $" --create-no-window \"{args.createNoWindow}\"",
- UseShellExecute = false,
- RedirectStandardOutput = true,
- RedirectStandardError = true
- });
- if (codePatcherProc == null) {
- if (File.Exists(cliargsfile)) {
- File.Delete(cliargsfile);
- }
- throw new Exception("Could not start code patcher process.");
- }
- codePatcherProc.BeginErrorReadLine();
- codePatcherProc.BeginOutputReadLine();
- codePatcherProc.OutputDataReceived += (_, a) => {
- };
- // error data can also mean we kill the proc beningly
- codePatcherProc.ErrorDataReceived += (_, a) => {
- };
- process = codePatcherProc;
- return Task.CompletedTask;
- }
- public async Task Stop() {
- await RequestHelper.KillServer();
- try {
- // process.CloseMainWindow throws if proc already exited.
- // also we just rely on the pid file it is fine
- CliUtils.KillLastKnownHotReloadProcess();
- } catch {
- //ignored
- }
- process = null;
- }
- }
- }
|