ProjectDDD/Packages/com.singularitygroup.hotreload/Editor/CLI/LinuxCliController.cs
2025-07-08 19:46:31 +09:00

74 lines
2.9 KiB
C#

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;
}
}
}