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