5using System.Threading.Tasks;
7using Microsoft.Extensions.Logging;
8using Microsoft.Extensions.Options;
98 ILogger<OpenDreamInstaller> logger,
104 IOptionsMonitor<GeneralConfiguration> generalConfigurationOptions,
105 IOptionsMonitor<SessionConfiguration> sessionConfigurationOptions)
106 : base(ioManager, logger)
109 ProcessExecutor = processExecutor ??
throw new ArgumentNullException(nameof(processExecutor));
118 public sealed override Task
CleanCache(CancellationToken cancellationToken) => Task.CompletedTask;
121 public sealed override async ValueTask<IEngineInstallation>
GetInstallation(
EngineVersion version,
string path, Task installationTask, CancellationToken cancellationToken)
127 ??
throw new JobException(
"Failed to find dotnet path!");
143 ArgumentNullException.ThrowIfNull(jobProgressReporter);
146 Logger.LogTrace(
"Cloning OD repo...");
148 var progressSection1 = jobProgressReporter.
CreateSection(
"Updating OpenDream git repository", 0.5f);
154 generalConfig.OpenDreamGitUrl,
164 progressSection1.Dispose();
172 Logger.LogTrace(
"OD repo seems to already exist, attempting load and fetch...");
175 throw new JobException(
"Can't load OpenDream repository! Please delete cache from disk!");
185 progressSection1.Dispose();
186 progressSection1 =
null;
188 using (var progressSection2 = jobProgressReporter.
CreateSection(
"Checking out OpenDream version", 0.5f))
190 var committish = version.SourceSHA
191 ?? $
"{generalConfig.OpenDreamGitTagPrefix}{version.Version!.Semver()}";
215 progressSection1?.Dispose();
223 ArgumentNullException.ThrowIfNull(path);
224 return ValueTask.CompletedTask;
230 ArgumentNullException.ThrowIfNull(engineVersion);
231 ArgumentNullException.ThrowIfNull(fullDmbPath);
233 Logger.LogTrace(
"TrustDmbPath is a no-op: {path}", fullDmbPath);
234 return ValueTask.CompletedTask;
238 protected override async ValueTask
InstallImpl(
EngineVersion version,
string installPath,
bool deploymentPipelineProcesses, CancellationToken cancellationToken)
246 Logger.LogDebug(
"Correcting extraction location...");
251 await Task.WhenAll(dirsTask, filesTask, dirCreateTask);
253 var dirsMoveTasks = dirsTask
262 var filesMoveTask = filesTask
272 await Task.WhenAll(dirsMoveTasks.Concat(filesMoveTask));
277 const string DeployDir =
"tgs_deploy";
278 int? buildExitCode =
null;
280 async shortenedPath =>
287 $
"run -c Release --project OpenDreamPackageTool -- --tgs -o {shortenedDeployPath}",
291 !generalConfig.OpenDreamSuppressInstallOutput,
292 !generalConfig.OpenDreamSuppressInstallOutput);
295 buildProcess.AdjustPriority(
false);
297 using (cancellationToken.Register(() => buildProcess.Terminate()))
298 buildExitCode = await buildProcess.Lifetime;
303 var buildOutputTask = buildProcess.GetCombinedOutput(cancellationToken);
304 if (!buildOutputTask.IsCompleted)
305 Logger.LogTrace(
"OD build complete, waiting for output...");
306 output = await buildOutputTask;
309 output =
"<Build output suppressed by configuration due to not being immediately available>";
312 "OpenDream build exited with code {exitCode}:{newLine}{output}",
320 if (buildExitCode != 0)
324 async ValueTask MoveDirs()
334 cancellationToken)));
337 async ValueTask MoveFiles()
347 cancellationToken)));
350 var dirsMoveTask = MoveDirs();
351 var outputFilesMoveTask = MoveFiles();
364 Func<string, ValueTask> shortenedPathOperation,
366 CancellationToken cancellationToken)
367 => shortenedPathOperation(originalPath);
375 protected void GetExecutablePaths(
string installationPath, out
string serverExePath, out
string compilerExePath)
377 const string DllExtension =
".dll";
383 $
"Robust.Server{DllExtension}");
389 $
"DMCompiler{DllExtension}");
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.
IOptionsMonitor< SessionConfiguration > SessionConfigurationOptions
The Configuration.SessionConfiguration for the OpenDreamInstaller.
override EngineType TargetEngineType
OpenDreamInstaller(IIOManager ioManager, ILogger< OpenDreamInstaller > logger, IPlatformIdentifier platformIdentifier, IProcessExecutor processExecutor, IRepositoryManager repositoryManager, IAsyncDelayer asyncDelayer, IHttpClientFactory httpClientFactory, IOptionsMonitor< GeneralConfiguration > generalConfigurationOptions, IOptionsMonitor< SessionConfiguration > sessionConfigurationOptions)
Initializes a new instance of the OpenDreamInstaller class.
readonly IPlatformIdentifier platformIdentifier
The IPlatformIdentifier for the OpenDreamInstaller.
readonly IRepositoryManager repositoryManager
The IRepositoryManager for the OpenDream repository.
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 runn...
const string ServerDir
The OD server directory name.
override async ValueTask InstallImpl(EngineVersion version, string installPath, bool deploymentPipelineProcesses, CancellationToken cancellationToken)
override async ValueTask< IEngineInstallation > GetInstallation(EngineVersion version, string path, Task installationTask, CancellationToken cancellationToken)
Creates an IEngineInstallation for a given version .A ValueTask<TResult> resulting in a new IEngineIn...
override async ValueTask< IEngineInstallationData > DownloadVersion(EngineVersion version, JobProgressReporter jobProgressReporter, CancellationToken cancellationToken)
Download a given engine version .A ValueTask<TResult> resulting in the IEngineInstallationData for th...
override Task CleanCache(CancellationToken cancellationToken)
Attempts to cleans the engine's cache folder for the system.A Task representing the running operation...
const string InstallationCompilerDirectory
The name of the subdirectory in an installation's BinDir used to store the compiler binaries.
readonly IHttpClientFactory httpClientFactory
The IHttpClientFactory for the OpenDreamInstaller.
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.
IOptionsMonitor< GeneralConfiguration > GeneralConfigurationOptions
The GeneralConfigurationOptions for the OpenDreamInstaller.
Implementation of IEngineInstallationData using a IRepository.
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 an on-disk git repository.
Task< bool > CommittishIsParent(string committish, CancellationToken cancellationToken)
Check if a given committish is a parent of the current Head.
ValueTask CheckoutObject(string committish, string? username, string? password, bool updateSubmodules, bool moveCurrentReference, JobProgressReporter progressReporter, CancellationToken cancellationToken)
Checks out a given committish .
ValueTask FetchOrigin(JobProgressReporter progressReporter, string? username, string? password, bool deploymentPipeline, CancellationToken cancellationToken)
Fetch commits from the origin repository.
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 .
IIOManager CreateResolverForSubdirectory(string subdirectoryPath)
Create a new IIOManager that resolves paths to the specified subdirectoryPath .
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.