From cf1bbb73f2572e4c9e6af37d64c9ec1bea2de38d Mon Sep 17 00:00:00 2001 From: Jordan Brown Date: Sun, 22 Jul 2018 18:43:03 -0400 Subject: [PATCH] Implement CopyDMFilesTo --- .../Components/Configuration.cs | 39 ++++++++++++++++++- .../Components/DreamMaker.cs | 2 +- .../Components/InstanceFactory.cs | 1 - 3 files changed, 38 insertions(+), 4 deletions(-) diff --git a/src/Tgstation.Server.Host/Components/Configuration.cs b/src/Tgstation.Server.Host/Components/Configuration.cs index caeab93c8f..ab24c9173d 100644 --- a/src/Tgstation.Server.Host/Components/Configuration.cs +++ b/src/Tgstation.Server.Host/Components/Configuration.cs @@ -1,6 +1,7 @@ using Microsoft.Extensions.Logging; using System; using System.Collections.Generic; +using System.Globalization; using System.Threading; using System.Threading.Tasks; using Tgstation.Server.Api.Models; @@ -12,6 +13,13 @@ namespace Tgstation.Server.Host.Components /// sealed class Configuration : IConfiguration { + const string CodeModificationsSubdirectory = "CodeModifications"; + const string EventScriptsSubdirectory = "EventScripts"; + const string GameStaticFilesSubdirectory = "GameStaticFiles"; + + const string CodeModificationsHeadFile = "HeadInclude.dm"; + const string CodeModificationsTailFile = "TailInclude.dm"; + /// /// The for /// @@ -34,9 +42,36 @@ namespace Tgstation.Server.Host.Components } /// - public Task CopyDMFilesTo(string destination, CancellationToken cancellationToken) + public async Task CopyDMFilesTo(string destination, CancellationToken cancellationToken) { - throw new NotImplementedException(); + //just assume no other fs race conditions here + var dmeExistsTask = ioManager.FileExists(ioManager.ConcatPath(CodeModificationsSubdirectory, dmeFile), cancellationToken); + var headFileExistsTask = ioManager.FileExists(ioManager.ConcatPath(CodeModificationsSubdirectory, CodeModificationsHeadFile), cancellationToken); + var tailFileExistsTask = ioManager.FileExists(ioManager.ConcatPath(CodeModificationsSubdirectory, CodeModificationsTailFile), cancellationToken); + + await Task.WhenAll(dmeExistsTask, headFileExistsTask, tailFileExistsTask).ConfigureAwait(false); + + if (!dmeExistsTask.Result && !headFileExistsTask.Result && !tailFileExistsTask.Result) + return null; + + var copyTask = ioManager.CopyDirectory(CodeModificationsSubdirectory, destination, null, cancellationToken); + + if (dmeExistsTask.Result) + { + await copyTask.ConfigureAwait(false); + return new ServerSideModifications(null, null, true); + } + + if (!headFileExistsTask.Result && !tailFileExistsTask.Result) + { + await copyTask.ConfigureAwait(false); + return null; + } + + string IncludeLine(string filePath) => String.Format(CultureInfo.InvariantCulture, "#include \"{0}\"", filePath); + + await copyTask.ConfigureAwait(false); + return new ServerSideModifications(headFileExistsTask.Result ? IncludeLine(CodeModificationsHeadFile) : null, tailFileExistsTask.Result ? IncludeLine(CodeModificationsTailFile) : null, false); } /// diff --git a/src/Tgstation.Server.Host/Components/DreamMaker.cs b/src/Tgstation.Server.Host/Components/DreamMaker.cs index 5d3caa81d1..a55b2c1016 100644 --- a/src/Tgstation.Server.Host/Components/DreamMaker.cs +++ b/src/Tgstation.Server.Host/Components/DreamMaker.cs @@ -212,7 +212,7 @@ namespace Tgstation.Server.Host.Components } else if (line.Contains("END_INCLUDE") && dmeModifications.TailIncludeLine != null) { - dmeLines.Insert(I - 1, dmeModifications.TailIncludeLine); + dmeLines.Insert(I, dmeModifications.TailIncludeLine); break; } } diff --git a/src/Tgstation.Server.Host/Components/InstanceFactory.cs b/src/Tgstation.Server.Host/Components/InstanceFactory.cs index 7c2fc53965..09467dedda 100644 --- a/src/Tgstation.Server.Host/Components/InstanceFactory.cs +++ b/src/Tgstation.Server.Host/Components/InstanceFactory.cs @@ -93,7 +93,6 @@ namespace Tgstation.Server.Host.Components var byondIOManager = new ResolvingIOManager(instanceIoManager, "Byond"); var gameIoManager = new ResolvingIOManager(instanceIoManager, "Game"); var configurationIoManager = new ResolvingIOManager(instanceIoManager, "Configuration"); - var codeModificationsIoMananger = new ResolvingIOManager(instanceIoManager, "CodeModifications"); var dmbFactory = new DmbFactory(databaseContextFactory, gameIoManager, metadata); var commandFactory = new CommandFactory(application);