4using System.Threading.Tasks;
6using Microsoft.Extensions.Logging;
7using Microsoft.Extensions.Options;
98 ILogger<OpenDreamInstaller> logger,
104 IOptions<GeneralConfiguration> generalConfigurationOptions,
105 IOptions<SessionConfiguration> sessionConfigurationOptions)
106 : base(ioManager, logger)
109 ProcessExecutor = processExecutor ??
throw new ArgumentNullException(nameof(processExecutor));
113 GeneralConfiguration = generalConfigurationOptions?.Value ??
throw new ArgumentNullException(nameof(generalConfigurationOptions));
114 SessionConfiguration = sessionConfigurationOptions?.Value ??
throw new ArgumentNullException(nameof(sessionConfigurationOptions));
118 public override Task
CleanCache(CancellationToken cancellationToken) => Task.CompletedTask;
141 Logger.LogTrace(
"Cloning OD repo...");
143 var progressSection1 = jobProgressReporter?.
CreateSection(
"Updating OpenDream git repository", 0.5f);
158 Logger.LogTrace(
"OD repo seems to already exist, attempting load and fetch...");
161 await repo!.FetchOrigin(
169 var progressSection2 = jobProgressReporter?.
CreateSection(
"Checking out OpenDream version", 0.5f);
171 var committish = version.SourceSHA
172 ?? $
"{GeneralConfiguration.OpenDreamGitTagPrefix}{version.Version!.Semver()}";
174 await repo.CheckoutObject(
182 if (!await repo.CommittishIsParent(
"tgs-min-compat", cancellationToken))
195 public override async ValueTask
Install(
EngineVersion version,
string installPath,
bool deploymentPipelineProcesses, CancellationToken cancellationToken)
198 ArgumentNullException.ThrowIfNull(installPath);
205 Logger.LogDebug(
"Correcting extraction location...");
210 await Task.WhenAll(dirsTask, filesTask, dirCreateTask);
212 var dirsMoveTasks = dirsTask
221 var filesMoveTask = filesTask
231 await Task.WhenAll(dirsMoveTasks.Concat(filesMoveTask));
235 if (dotnetPath ==
null)
238 const string DeployDir =
"tgs_deploy";
239 int? buildExitCode =
null;
241 async shortenedPath =>
247 $
"run -c Release --project OpenDreamPackageTool -- --tgs -o {shortenedDeployPath}",
255 buildProcess.AdjustPriority(
false);
257 using (cancellationToken.Register(() => buildProcess.Terminate()))
258 buildExitCode = await buildProcess.Lifetime;
263 var buildOutputTask = buildProcess.GetCombinedOutput(cancellationToken);
264 if (!buildOutputTask.IsCompleted)
265 Logger.LogTrace(
"OD build complete, waiting for output...");
266 output = await buildOutputTask;
269 output =
"<Build output suppressed by configuration due to not being immediately available>";
272 "OpenDream build exited with code {exitCode}:{newLine}{output}",
280 if (buildExitCode != 0)
284 async ValueTask MoveDirs()
294 cancellationToken)));
297 async ValueTask MoveFiles()
307 cancellationToken)));
310 var dirsMoveTask = MoveDirs();
311 var outputFilesMoveTask = MoveFiles();
320 ArgumentNullException.ThrowIfNull(path);
321 return ValueTask.CompletedTask;
327 ArgumentNullException.ThrowIfNull(engineVersion);
328 ArgumentNullException.ThrowIfNull(fullDmbPath);
330 Logger.LogTrace(
"TrustDmbPath is a no-op: {path}", fullDmbPath);
331 return ValueTask.CompletedTask;
342 Func<string, ValueTask> shortenedPathOperation,
344 CancellationToken cancellationToken)
345 => shortenedPathOperation(originalPath);
353 protected void GetExecutablePaths(
string installationPath, out
string serverExePath, out
string compilerExePath)
355 var exeExtension = platformIdentifier.IsWindows
363 $
"Robust.Server{exeExtension}");
369 $
"DMCompiler{exeExtension}");
Information about an engine installation.
Extension methods for the ValueTask and ValueTask<TResult> classes.
static async ValueTask WhenAll(IEnumerable< ValueTask > tasks)
Fully await a given list of tasks .
void CheckVersionValidity(EngineVersion version)
Check that a given version is of type EngineType.Byond.
IIOManager IOManager
Gets the IIOManager for the EngineInstallerBase.
ILogger< EngineInstallerBase > Logger
Gets the ILogger for the EngineInstallerBase.
Implementation of IEngineInstallation for EngineType.OpenDream.
Implementation of IEngineInstaller for EngineType.OpenDream.
void GetExecutablePaths(string installationPath, out string serverExePath, out string compilerExePath)
Gets the paths to the server and client executables.
readonly IAbstractHttpClientFactory httpClientFactory
The IAbstractHttpClientFactory for the OpenDreamInstaller.
override EngineType TargetEngineType
readonly IPlatformIdentifier platformIdentifier
The IPlatformIdentifier for the OpenDreamInstaller.
readonly IRepositoryManager repositoryManager
The IRepositoryManager for the OpenDream repository.
override async ValueTask Install(EngineVersion version, string installPath, bool deploymentPipelineProcesses, CancellationToken cancellationToken)
Does actions necessary to get an extracted installation working. A ValueTask representing the running...
override async ValueTask< IEngineInstallationData > DownloadVersion(EngineVersion version, JobProgressReporter? jobProgressReporter, CancellationToken cancellationToken)
Download a given engine version . A ValueTask<TResult> resulting in the IEngineInstallationData for t...
override ValueTask TrustDmbPath(EngineVersion engineVersion, string fullDmbPath, CancellationToken cancellationToken)
Add a given fullDmbPath to the trusted DMBs list in BYOND's config. A ValueTask representing the run...
const string ServerDir
The OD server directory name.
override IEngineInstallation CreateInstallation(EngineVersion version, string path, Task installationTask)
Creates an IEngineInstallation for a given version . The IEngineInstallation.
override Task CleanCache(CancellationToken cancellationToken)
Attempts to cleans the engine's cache folder for the system. A Task representing the running operatio...
OpenDreamInstaller(IIOManager ioManager, ILogger< OpenDreamInstaller > logger, IPlatformIdentifier platformIdentifier, IProcessExecutor processExecutor, IRepositoryManager repositoryManager, IAsyncDelayer asyncDelayer, IAbstractHttpClientFactory httpClientFactory, IOptions< GeneralConfiguration > generalConfigurationOptions, IOptions< SessionConfiguration > sessionConfigurationOptions)
Initializes a new instance of the OpenDreamInstaller class.
const string InstallationCompilerDirectory
The name of the subdirectory in an installation's BinDir used to store the compiler binaries.
const string InstallationSourceSubDirectory
The name of the subdirectory used for the RepositoryEngineInstallationData's copy.
override ValueTask UpgradeInstallation(EngineVersion version, string path, CancellationToken cancellationToken)
Does actions necessary to get upgrade a version installed by a previous version of TGS....
readonly IAsyncDelayer asyncDelayer
The IAsyncDelayer for the OpenDreamInstaller.
virtual ValueTask HandleExtremelyLongPathOperation(Func< string, ValueTask > shortenedPathOperation, string originalPath, CancellationToken cancellationToken)
Perform an operation on a very long path.
const string BinDir
The bin directory name.
Implementation of IEngineInstallationData using a IRepository.
General configuration options.
bool OpenDreamSuppressInstallOutput
If the dotnet output of creating an OpenDream installation should be suppressed. Known to cause issue...
Uri OpenDreamGitUrl
Location of a publically accessible OpenDream repository.
Configuration options for the game sessions.
bool LowPriorityDeploymentProcesses
If the deployment DreamMaker and DreamDaemon instances are set to be below normal priority processes.
An IIOManager that resolve relative paths from another IIOManager to a subdirectory of that.
Operation exceptions thrown from the context of a Models.Job.
Progress reporter for a Job.
JobProgressReporter CreateSection(string? newStageName, double percentage)
Create a subsection of the JobProgressReporter with its optional own stage name.
Helper methods for working with the dotnet executable.
static async ValueTask< string?> GetDotnetPath(IPlatformIdentifier platformIdentifier, IIOManager ioManager, CancellationToken cancellationToken)
Locate a dotnet executable to use.
async ValueTask< IProcess > LaunchProcess(string fileName, string workingDirectory, string arguments, CancellationToken cancellationToken, IReadOnlyDictionary< string, string >? environment, string? fileRedirect, bool readStandardHandles, bool noShellExecute)
Launch a IProcess. A ValueTask<TResult> resulting in the new IProcess.
Represents a BYOND installation.
Factory for creating and loading IRepositorys.
ValueTask< IRepository?> CloneRepository(Uri url, string? initialBranch, string? username, string? password, JobProgressReporter? progressReporter, bool recurseSubmodules, CancellationToken cancellationToken)
Clone the repository at url .
ValueTask< IRepository?> LoadRepository(CancellationToken cancellationToken)
Attempt to load the IRepository from the default location.
Interface for using filesystems.
Task< IReadOnlyList< string > > GetFiles(string path, CancellationToken cancellationToken)
Returns full file names in a given path .
string GetFileName(string path)
Gets the file name portion of a path .
string ConcatPath(params string[] paths)
Combines an array of strings into a path.
Task MoveFile(string source, string destination, CancellationToken cancellationToken)
Moves a file at source to destination .
Task< IReadOnlyList< string > > GetDirectories(string path, CancellationToken cancellationToken)
Returns full directory names in a given path .
Task CreateDirectory(string path, CancellationToken cancellationToken)
Create a directory at path .
Task DeleteDirectory(string path, CancellationToken cancellationToken)
Recursively delete a directory, removes and does not enter any symlinks encounterd.
Task MoveDirectory(string source, string destination, CancellationToken cancellationToken)
Moves a directory at source to destination .
Task< bool > DirectoryExists(string path, CancellationToken cancellationToken)
Check that the directory at path exists.
For waiting asynchronously.
ErrorCode
Types of Response.ErrorMessageResponses that the API may return.
EngineType
The type of engine the codebase is using.