74 lines
2.9 KiB
C#
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;
|
|
}
|
|
}
|
|
}
|