mirror of
https://github.com/tgstation/tgstation-server.git
synced 2026-08-25 14:06:41 +01:00
Update Nuget Packages. Fix Test projects. Etc...
This commit is contained in:
@@ -22,8 +22,10 @@ namespace Tgstation.Server.Api.Models.Internal
|
||||
return true;
|
||||
return Provider.Value switch
|
||||
{
|
||||
#pragma warning disable CS0618
|
||||
ChatProvider.Discord => Channels?.Select(x => (x.DiscordChannelId.HasValue || ulong.TryParse(x.ChannelData, out _)) && x.IrcChannel == null).All(x => x) ?? true,
|
||||
ChatProvider.Irc => Channels?.Select(x => !x.DiscordChannelId.HasValue && (x.IrcChannel != null || x.ChannelData != null)).All(x => x) ?? true,
|
||||
#pragma warning restore CS0618
|
||||
_ => throw new InvalidOperationException("Invalid provider type!"),
|
||||
};
|
||||
}
|
||||
|
||||
@@ -47,7 +47,7 @@
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Microsoft.AspNetCore.Http.Extensions" Version="2.2.0" />
|
||||
<PackageReference Include="Newtonsoft.Json" Version="13.0.2" />
|
||||
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
|
||||
<PackageReference Include="StyleCop.Analyzers" Version="1.1.118">
|
||||
<PrivateAssets>all</PrivateAssets>
|
||||
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
||||
|
||||
@@ -26,15 +26,11 @@ namespace Tgstation.Server.Host.Console
|
||||
/// <returns>A <see cref="Task"/> representing the running operation.</returns>
|
||||
internal static async Task Main(string[] args)
|
||||
{
|
||||
using var loggerFactory = new LoggerFactory();
|
||||
using var loggerFactory = LoggerFactory.Create(builder => builder.AddConsole());
|
||||
var arguments = new List<string>(args);
|
||||
var trace = arguments.Remove("--trace-host-watchdog");
|
||||
var debug = arguments.Remove("--debug-host-watchdog");
|
||||
|
||||
#pragma warning disable CS0618 // Type or member is obsolete
|
||||
loggerFactory.AddConsole();
|
||||
#pragma warning restore CS0618 // Type or member is obsolete
|
||||
|
||||
if (trace && debug)
|
||||
{
|
||||
loggerFactory.CreateLogger(nameof(Program)).LogCritical("Please specify only 1 of --trace-host-watchdog or --debug-host-watchdog!");
|
||||
|
||||
@@ -25,7 +25,7 @@
|
||||
|
||||
<ItemGroup>
|
||||
<!-- DO NOT UPDATE UNLESS YOU WANT TO DEAL WITH THE LOGGERFACTORY REFACTOR -->
|
||||
<PackageReference Include="Microsoft.Extensions.Logging.Console" Version="2.2.0" />
|
||||
<PackageReference Include="Microsoft.Extensions.Logging.Console" Version="6.0.0" />
|
||||
<PackageReference Include="StyleCop.Analyzers" Version="1.1.118">
|
||||
<PrivateAssets>all</PrivateAssets>
|
||||
<IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets>
|
||||
|
||||
@@ -77,6 +77,54 @@ namespace Tgstation.Server.Host.Service
|
||||
/// <returns>A <see cref="Task"/> resulting in the <see cref="Program"/>'s exit code.</returns>
|
||||
static Task<int> Main(string[] args) => CommandLineApplication.ExecuteAsync<Program>(args);
|
||||
|
||||
/// <summary>
|
||||
/// Attempt to install the TGS Service.
|
||||
/// </summary>
|
||||
static void RunServiceInstall()
|
||||
{
|
||||
// First check if the service already exists
|
||||
if (Environment.UserInteractive)
|
||||
foreach (ServiceController sc in ServiceController.GetServices())
|
||||
if (sc.ServiceName == "tgstation-server" || sc.ServiceName == "tgstation-server-4")
|
||||
{
|
||||
DialogResult result = MessageBox.Show($"You already have another TGS service installed ({sc.ServiceName}). Would you like to uninstall it now? Pressing \"No\" will cancel this install.", "TGS Service", MessageBoxButtons.YesNo);
|
||||
if (result != DialogResult.Yes)
|
||||
return; // is this needed after exit?
|
||||
|
||||
// Stop it first to give it some cleanup time
|
||||
if (sc.Status == ServiceControllerStatus.Running)
|
||||
{
|
||||
sc.Stop();
|
||||
sc.WaitForStatus(ServiceControllerStatus.Stopped);
|
||||
}
|
||||
|
||||
// And remove it
|
||||
using (ServiceInstaller si = new ServiceInstaller())
|
||||
{
|
||||
si.Context = new InstallContext($"old-{sc.ServiceName}-uninstall.log", null);
|
||||
si.ServiceName = sc.ServiceName;
|
||||
si.Uninstall(null);
|
||||
}
|
||||
}
|
||||
|
||||
using (var processInstaller = new ServiceProcessInstaller())
|
||||
using (var installer = new ServiceInstaller())
|
||||
{
|
||||
processInstaller.Account = ServiceAccount.LocalSystem;
|
||||
|
||||
installer.Context = new InstallContext("tgs-install.log", new string[] { String.Format(CultureInfo.InvariantCulture, "/assemblypath={0}", Assembly.GetEntryAssembly().Location) });
|
||||
installer.Description = "/tg/station 13 server running as a windows service";
|
||||
installer.DisplayName = "/tg/station server";
|
||||
installer.StartType = ServiceStartMode.Automatic;
|
||||
installer.ServicesDependedOn = new string[] { "Tcpip", "Dhcp", "Dnscache" };
|
||||
installer.ServiceName = ServerService.Name;
|
||||
installer.Parent = processInstaller;
|
||||
|
||||
var state = new ListDictionary();
|
||||
installer.Install(state);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Command line handler, always runs.
|
||||
/// </summary>
|
||||
@@ -112,54 +160,35 @@ namespace Tgstation.Server.Host.Service
|
||||
}
|
||||
}
|
||||
|
||||
using (var loggerFactory = new LoggerFactory())
|
||||
ServerService service = null;
|
||||
ILoggerFactory loggerFactory;
|
||||
try
|
||||
{
|
||||
loggerFactory = LoggerFactory.Create(builder =>
|
||||
{
|
||||
if (Configure)
|
||||
{
|
||||
builder.AddConsole();
|
||||
}
|
||||
|
||||
service = new ServerService(builder, Trace ? LogLevel.Trace : Debug ? LogLevel.Debug : LogLevel.Information);
|
||||
});
|
||||
}
|
||||
catch
|
||||
{
|
||||
service?.Dispose();
|
||||
throw;
|
||||
}
|
||||
|
||||
using (loggerFactory)
|
||||
using (service)
|
||||
{
|
||||
if (Install)
|
||||
{
|
||||
if (Uninstall)
|
||||
return; // oh no, it's retarded...
|
||||
|
||||
// First check if the service already exists
|
||||
if (Environment.UserInteractive)
|
||||
foreach (ServiceController sc in ServiceController.GetServices())
|
||||
if (sc.ServiceName == "tgstation-server" || sc.ServiceName == "tgstation-server-4")
|
||||
{
|
||||
DialogResult result = MessageBox.Show($"You already have another TGS service installed ({sc.ServiceName}). Would you like to uninstall it now? Pressing \"No\" will cancel this install.", "TGS Service", MessageBoxButtons.YesNo);
|
||||
if (result != DialogResult.Yes)
|
||||
return; // is this needed after exit?
|
||||
|
||||
// Stop it first to give it some cleanup time
|
||||
if (sc.Status == ServiceControllerStatus.Running)
|
||||
{
|
||||
sc.Stop();
|
||||
sc.WaitForStatus(ServiceControllerStatus.Stopped);
|
||||
}
|
||||
|
||||
// And remove it
|
||||
using (ServiceInstaller si = new ServiceInstaller())
|
||||
{
|
||||
si.Context = new InstallContext($"old-{sc.ServiceName}-uninstall.log", null);
|
||||
si.ServiceName = sc.ServiceName;
|
||||
si.Uninstall(null);
|
||||
}
|
||||
}
|
||||
|
||||
using (var processInstaller = new ServiceProcessInstaller())
|
||||
using (var installer = new ServiceInstaller())
|
||||
{
|
||||
processInstaller.Account = ServiceAccount.LocalSystem;
|
||||
|
||||
installer.Context = new InstallContext("tgs-install.log", new string[] { String.Format(CultureInfo.InvariantCulture, "/assemblypath={0}", Assembly.GetEntryAssembly().Location) });
|
||||
installer.Description = "/tg/station 13 server running as a windows service";
|
||||
installer.DisplayName = "/tg/station server";
|
||||
installer.StartType = ServiceStartMode.Automatic;
|
||||
installer.ServicesDependedOn = new string[] { "Tcpip", "Dhcp", "Dnscache" };
|
||||
installer.ServiceName = ServerService.Name;
|
||||
installer.Parent = processInstaller;
|
||||
|
||||
var state = new ListDictionary();
|
||||
installer.Install(state);
|
||||
}
|
||||
RunServiceInstall();
|
||||
|
||||
if (Configure)
|
||||
{
|
||||
@@ -175,15 +204,13 @@ namespace Tgstation.Server.Host.Service
|
||||
installer.Uninstall(null);
|
||||
}
|
||||
else if (!Configure)
|
||||
using (var service = new ServerService(WatchdogFactory, loggerFactory, Trace ? LogLevel.Trace : Debug ? LogLevel.Debug : LogLevel.Information))
|
||||
ServiceBase.Run(service);
|
||||
{
|
||||
service.SetupWatchdog(WatchdogFactory.CreateWatchdog(loggerFactory));
|
||||
ServiceBase.Run(service);
|
||||
}
|
||||
|
||||
if (Configure)
|
||||
{
|
||||
#pragma warning disable CS0618 // Type or member is obsolete
|
||||
loggerFactory.AddConsole();
|
||||
#pragma warning restore CS0618 // Type or member is obsolete
|
||||
|
||||
// DCT: None available
|
||||
await WatchdogFactory.CreateWatchdog(loggerFactory).RunAsync(true, Array.Empty<string>(), default);
|
||||
}
|
||||
|
||||
@@ -25,7 +25,7 @@ namespace Tgstation.Server.Host.Service
|
||||
/// <summary>
|
||||
/// The <see cref="IWatchdog"/> for the <see cref="ServerService"/>.
|
||||
/// </summary>
|
||||
readonly IWatchdog watchdog;
|
||||
IWatchdog watchdog;
|
||||
|
||||
/// <summary>
|
||||
/// The <see cref="Task"/> recieved from <see cref="IWatchdog.RunAsync(bool, string[], CancellationToken)"/> of <see cref="watchdog"/>.
|
||||
@@ -40,28 +40,39 @@ namespace Tgstation.Server.Host.Service
|
||||
/// <summary>
|
||||
/// Initializes a new instance of the <see cref="ServerService"/> class.
|
||||
/// </summary>
|
||||
/// <param name="watchdogFactory">The <see cref="IWatchdogFactory"/> to create <see cref="watchdog"/> with.</param>
|
||||
/// <param name="loggerFactory">The <see cref="ILoggerFactory"/> for <paramref name="watchdogFactory"/>.</param>
|
||||
/// <param name="loggingBuilder">The <see cref="ILoggingBuilder"/> to configure.</param>
|
||||
/// <param name="minumumLogLevel">The minimum <see cref="Microsoft.Extensions.Logging.LogLevel"/> to record in the event log.</param>
|
||||
public ServerService(IWatchdogFactory watchdogFactory, ILoggerFactory loggerFactory, LogLevel minumumLogLevel)
|
||||
public ServerService(ILoggingBuilder loggingBuilder, LogLevel minumumLogLevel)
|
||||
{
|
||||
if (watchdogFactory == null)
|
||||
throw new ArgumentNullException(nameof(watchdogFactory));
|
||||
if (loggerFactory == null)
|
||||
throw new ArgumentNullException(nameof(loggerFactory));
|
||||
if (loggingBuilder == null)
|
||||
throw new ArgumentNullException(nameof(loggingBuilder));
|
||||
|
||||
#pragma warning disable CS0618 // Type or member is obsolete
|
||||
loggerFactory.AddEventLog(new EventLogSettings
|
||||
loggingBuilder.AddEventLog(new EventLogSettings
|
||||
{
|
||||
LogName = EventLog.Log,
|
||||
MachineName = EventLog.MachineName,
|
||||
SourceName = EventLog.Source,
|
||||
Filter = (message, logLevel) => logLevel >= minumumLogLevel,
|
||||
});
|
||||
#pragma warning restore CS0618 // Type or member is obsolete
|
||||
|
||||
ServiceName = Name;
|
||||
watchdog = watchdogFactory.CreateWatchdog(loggerFactory);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Setup the <see cref="IWatchdog"/> for the service.
|
||||
/// </summary>
|
||||
/// <param name="watchdog">The value of <see cref="watchdog"/>.</param>
|
||||
public void SetupWatchdog(IWatchdog watchdog)
|
||||
{
|
||||
if (watchdog == null)
|
||||
#pragma warning disable IDE0016 // Use 'throw' expression
|
||||
throw new ArgumentNullException(nameof(watchdog));
|
||||
#pragma warning restore IDE0016 // Use 'throw' expression
|
||||
|
||||
if (this.watchdog != null)
|
||||
throw new InvalidOperationException("SetupWatchdog called twice!");
|
||||
|
||||
this.watchdog = watchdog;
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
@@ -74,6 +85,9 @@ namespace Tgstation.Server.Host.Service
|
||||
/// <inheritdoc />
|
||||
protected override void OnStart(string[] args)
|
||||
{
|
||||
if (watchdog == null)
|
||||
throw new InvalidOperationException("Cannot start without watchdog!");
|
||||
|
||||
cancellationTokenSource?.Dispose();
|
||||
cancellationTokenSource = new CancellationTokenSource();
|
||||
watchdogTask = RunWatchdog(args, cancellationTokenSource.Token);
|
||||
|
||||
@@ -23,13 +23,13 @@
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="McMaster.Extensions.CommandLineUtils" Version="3.1.0" />
|
||||
<PackageReference Include="McMaster.Extensions.CommandLineUtils" Version="4.0.2" />
|
||||
<PackageReference Include="Microsoft.CodeAnalysis.NetAnalyzers" Version="6.0.0">
|
||||
<PrivateAssets>all</PrivateAssets>
|
||||
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
||||
</PackageReference>
|
||||
<PackageReference Include="Microsoft.Extensions.Logging.EventLog" Version="2.2.0" />
|
||||
<PackageReference Include="Microsoft.Extensions.Logging.Console" Version="2.2.0" />
|
||||
<PackageReference Include="Microsoft.Extensions.Logging.EventLog" Version="6.0.0" />
|
||||
<PackageReference Include="Microsoft.Extensions.Logging.Console" Version="6.0.0" />
|
||||
<PackageReference Include="StyleCop.Analyzers" Version="1.1.118">
|
||||
<PrivateAssets>all</PrivateAssets>
|
||||
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
"isRoot": true,
|
||||
"tools": {
|
||||
"dotnet-ef": {
|
||||
"version": "6.0.8",
|
||||
"version": "6.0.15",
|
||||
"commands": [
|
||||
"dotnet-ef"
|
||||
]
|
||||
|
||||
@@ -6,6 +6,7 @@ using Elastic.CommonSchema.Serilog;
|
||||
using Microsoft.Extensions.Configuration;
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
using Microsoft.Extensions.Logging;
|
||||
|
||||
using Serilog;
|
||||
using Serilog.Configuration;
|
||||
using Serilog.Sinks.Elasticsearch;
|
||||
@@ -82,10 +83,10 @@ namespace Tgstation.Server.Host.Extensions
|
||||
.WriteTo
|
||||
.Async(sinkConfiguration =>
|
||||
{
|
||||
sinkConfiguration.Console(
|
||||
outputTemplate: "[{Timestamp:HH:mm:ss}] {Level:w3}: {SourceContext:l} "
|
||||
var template = "[{Timestamp:HH:mm:ss}] {Level:w3}: {SourceContext:l} "
|
||||
+ SerilogContextTemplate
|
||||
+ "|IR:{InstanceReference}){NewLine} {Message:lj}{NewLine}{Exception}");
|
||||
+ "|IR:{InstanceReference}){NewLine} {Message:lj}{NewLine}{Exception}";
|
||||
sinkConfiguration.Console(outputTemplate: template, formatProvider: CultureInfo.InvariantCulture);
|
||||
sinkConfigurationAction?.Invoke(sinkConfiguration);
|
||||
});
|
||||
|
||||
|
||||
@@ -68,39 +68,39 @@
|
||||
<PackageReference Include="Elastic.CommonSchema.Serilog" Version="1.5.3" />
|
||||
<PackageReference Include="GitLabApiClient" Version="1.8.0" />
|
||||
<PackageReference Include="LibGit2Sharp" Version="0.27.0-preview-0034" />
|
||||
<PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="6.0.9" />
|
||||
<PackageReference Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="6.0.9" />
|
||||
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="6.0.9" />
|
||||
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="6.0.9">
|
||||
<PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="6.0.15" />
|
||||
<PackageReference Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="6.0.15" />
|
||||
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="6.0.15" />
|
||||
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="6.0.15">
|
||||
<PrivateAssets>all</PrivateAssets>
|
||||
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
||||
</PackageReference>
|
||||
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="6.0.9" />
|
||||
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="6.0.9" />
|
||||
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="6.0.15" />
|
||||
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="6.0.15" />
|
||||
<!-- Required for https://github.com/coverlet-coverage/coverlet/issues/1381 -->
|
||||
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="6.0.2" />
|
||||
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="6.0.3" />
|
||||
<PackageReference Include="Mono.Posix.NETStandard" Version="1.0.0" />
|
||||
<PackageReference Include="NetEscapades.Configuration.Yaml" Version="2.2.0" />
|
||||
<PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="6.0.7" />
|
||||
<PackageReference Include="Octokit" Version="3.0.0" />
|
||||
<PackageReference Include="NetEscapades.Configuration.Yaml" Version="3.0.0" />
|
||||
<PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="6.0.8" />
|
||||
<PackageReference Include="Octokit" Version="5.0.2" />
|
||||
<PackageReference Include="Pomelo.EntityFrameworkCore.MySql" Version="6.0.2" />
|
||||
<PackageReference Include="Remora.Discord" Version="2022.48.0" />
|
||||
<PackageReference Include="Remora.Discord" Version="2022.49.0" />
|
||||
<PackageReference Include="Serilog.Extensions.Logging" Version="3.1.0" />
|
||||
<PackageReference Include="Serilog.Sinks.Async" Version="1.5.0" />
|
||||
<PackageReference Include="Serilog.Sinks.Console" Version="4.1.0" />
|
||||
<PackageReference Include="Serilog.Sinks.Elasticsearch" Version="8.4.1" />
|
||||
<PackageReference Include="Serilog.Sinks.Elasticsearch" Version="9.0.0" />
|
||||
<PackageReference Include="Serilog.Sinks.File" Version="5.0.0" />
|
||||
<PackageReference Include="StyleCop.Analyzers" Version="1.1.118">
|
||||
<PrivateAssets>all</PrivateAssets>
|
||||
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
||||
</PackageReference>
|
||||
<PackageReference Include="Swashbuckle.AspNetCore" Version="6.4.0" />
|
||||
<PackageReference Include="Swashbuckle.AspNetCore.Newtonsoft" Version="6.4.0" />
|
||||
<PackageReference Include="Swashbuckle.AspNetCore" Version="6.5.0" />
|
||||
<PackageReference Include="Swashbuckle.AspNetCore.Newtonsoft" Version="6.5.0" />
|
||||
<PackageReference Include="System.Data.SqlClient" Version="4.8.5" />
|
||||
<PackageReference Include="System.DirectoryServices.AccountManagement" Version="6.0.0" />
|
||||
<PackageReference Include="System.IdentityModel.Tokens.Jwt" Version="6.23.1" />
|
||||
<PackageReference Include="System.IdentityModel.Tokens.Jwt" Version="6.27.0" />
|
||||
<PackageReference Include="System.Management" Version="6.0.0" />
|
||||
<PackageReference Include="Z.EntityFramework.Plus.EFCore" Version="6.15.1" />
|
||||
<PackageReference Include="Z.EntityFramework.Plus.EFCore" Version="6.20.1" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
|
||||
@@ -8,14 +8,14 @@
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="coverlet.collector" Version="3.1.2">
|
||||
<PackageReference Include="coverlet.collector" Version="3.2.0">
|
||||
<PrivateAssets>all</PrivateAssets>
|
||||
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
||||
</PackageReference>
|
||||
<PackageReference Include="Microsoft.AspNetCore.Http" Version="2.2.2" />
|
||||
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.3.1" />
|
||||
<PackageReference Include="MSTest.TestAdapter" Version="2.2.10" />
|
||||
<PackageReference Include="MSTest.TestFramework" Version="2.2.10" />
|
||||
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.5.0" />
|
||||
<PackageReference Include="MSTest.TestAdapter" Version="3.0.2" />
|
||||
<PackageReference Include="MSTest.TestFramework" Version="3.0.2" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
|
||||
@@ -8,14 +8,14 @@
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="coverlet.collector" Version="3.1.2">
|
||||
<PackageReference Include="coverlet.collector" Version="3.2.0">
|
||||
<PrivateAssets>all</PrivateAssets>
|
||||
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
||||
</PackageReference>
|
||||
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.3.1" />
|
||||
<PackageReference Include="Moq" Version="4.18.2" />
|
||||
<PackageReference Include="MSTest.TestAdapter" Version="2.2.10" />
|
||||
<PackageReference Include="MSTest.TestFramework" Version="2.2.10" />
|
||||
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.5.0" />
|
||||
<PackageReference Include="Moq" Version="4.18.4" />
|
||||
<PackageReference Include="MSTest.TestAdapter" Version="3.0.2" />
|
||||
<PackageReference Include="MSTest.TestFramework" Version="3.0.2" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
|
||||
+5
-5
@@ -8,14 +8,14 @@
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="coverlet.collector" Version="3.1.2">
|
||||
<PackageReference Include="coverlet.collector" Version="3.2.0">
|
||||
<PrivateAssets>all</PrivateAssets>
|
||||
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
||||
</PackageReference>
|
||||
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.3.1" />
|
||||
<PackageReference Include="Moq" Version="4.18.2" />
|
||||
<PackageReference Include="MSTest.TestAdapter" Version="2.2.10" />
|
||||
<PackageReference Include="MSTest.TestFramework" Version="2.2.10" />
|
||||
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.5.0" />
|
||||
<PackageReference Include="Moq" Version="4.18.4" />
|
||||
<PackageReference Include="MSTest.TestAdapter" Version="3.0.2" />
|
||||
<PackageReference Include="MSTest.TestFramework" Version="3.0.2" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
using Microsoft.Extensions.Logging;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using Microsoft.VisualStudio.TestTools.UnitTesting;
|
||||
using Moq;
|
||||
using System;
|
||||
@@ -19,11 +19,9 @@ namespace Tgstation.Server.Host.Service.Tests
|
||||
[TestMethod]
|
||||
public void TestConstructionAndDisposal()
|
||||
{
|
||||
Assert.ThrowsException<ArgumentNullException>(() => new ServerService(null, null, default));
|
||||
var mockWatchdogFactory = new Mock<IWatchdogFactory>();
|
||||
Assert.ThrowsException<ArgumentNullException>(() => new ServerService(mockWatchdogFactory.Object, null, default));
|
||||
var mockLoggerFactory = new LoggerFactory();
|
||||
new ServerService(mockWatchdogFactory.Object, mockLoggerFactory, default).Dispose();
|
||||
Assert.ThrowsException<ArgumentNullException>(() => new ServerService(null, default));
|
||||
var mockLoggingBuilder = Mock.Of<ILoggingBuilder>();
|
||||
new ServerService(mockLoggingBuilder, default).Dispose();
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
@@ -37,18 +35,16 @@ namespace Tgstation.Server.Host.Service.Tests
|
||||
var args = Array.Empty<string>();
|
||||
CancellationToken cancellationToken;
|
||||
mockWatchdog.Setup(x => x.RunAsync(false, args, It.IsAny<CancellationToken>())).Callback((bool x, string[] _, CancellationToken token) => cancellationToken = token).Returns(Task.CompletedTask).Verifiable();
|
||||
var mockWatchdogFactory = new Mock<IWatchdogFactory>();
|
||||
var mockLoggerFactory = new LoggerFactory();
|
||||
mockWatchdogFactory.Setup(x => x.CreateWatchdog(mockLoggerFactory)).Returns(mockWatchdog.Object).Verifiable();
|
||||
var mockLoggerFactory = Mock.Of<ILoggingBuilder>();
|
||||
|
||||
using (var service = new ServerService(mockWatchdogFactory.Object, mockLoggerFactory, default))
|
||||
using (var service = new ServerService(mockLoggerFactory, default))
|
||||
{
|
||||
Assert.ThrowsException<InvalidOperationException>(() => onStart.Invoke(service, new object[] { args }));
|
||||
service.SetupWatchdog(mockWatchdog.Object);
|
||||
onStart.Invoke(service, new object[] { args });
|
||||
onStop.Invoke(service, Array.Empty<object>());
|
||||
mockWatchdog.VerifyAll();
|
||||
}
|
||||
|
||||
mockWatchdogFactory.VerifyAll();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+5
-4
@@ -13,13 +13,14 @@
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="coverlet.collector" Version="3.1.2">
|
||||
<PackageReference Include="coverlet.collector" Version="3.2.0">
|
||||
<PrivateAssets>all</PrivateAssets>
|
||||
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
||||
</PackageReference>
|
||||
<PackageReference Include="Moq" Version="4.18.2" />
|
||||
<PackageReference Include="MSTest.TestAdapter" Version="2.2.10" />
|
||||
<PackageReference Include="MSTest.TestFramework" Version="2.2.10" />
|
||||
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.5.0" />
|
||||
<PackageReference Include="Moq" Version="4.18.4" />
|
||||
<PackageReference Include="MSTest.TestAdapter" Version="3.0.2" />
|
||||
<PackageReference Include="MSTest.TestFramework" Version="3.0.2" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
|
||||
+2
-2
@@ -9,8 +9,8 @@
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Moq" Version="4.18.2" />
|
||||
<PackageReference Include="MSTest.TestFramework" Version="2.2.10" />
|
||||
<PackageReference Include="Moq" Version="4.18.4" />
|
||||
<PackageReference Include="MSTest.TestFramework" Version="3.0.2" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
|
||||
@@ -8,14 +8,14 @@
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="coverlet.collector" Version="3.1.2">
|
||||
<PackageReference Include="coverlet.collector" Version="3.2.0">
|
||||
<PrivateAssets>all</PrivateAssets>
|
||||
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
||||
</PackageReference>
|
||||
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.3.1" />
|
||||
<PackageReference Include="Moq" Version="4.18.2" />
|
||||
<PackageReference Include="MSTest.TestAdapter" Version="2.2.10" />
|
||||
<PackageReference Include="MSTest.TestFramework" Version="2.2.10" />
|
||||
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.5.0" />
|
||||
<PackageReference Include="Moq" Version="4.18.4" />
|
||||
<PackageReference Include="MSTest.TestAdapter" Version="3.0.2" />
|
||||
<PackageReference Include="MSTest.TestFramework" Version="3.0.2" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
|
||||
+5
-5
@@ -14,14 +14,14 @@
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="coverlet.collector" Version="3.1.2">
|
||||
<PackageReference Include="coverlet.collector" Version="3.2.0">
|
||||
<PrivateAssets>all</PrivateAssets>
|
||||
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
||||
</PackageReference>
|
||||
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.3.1" />
|
||||
<PackageReference Include="Moq" Version="4.18.2" />
|
||||
<PackageReference Include="MSTest.TestAdapter" Version="2.2.10" />
|
||||
<PackageReference Include="MSTest.TestFramework" Version="2.2.10" />
|
||||
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.5.0" />
|
||||
<PackageReference Include="Moq" Version="4.18.4" />
|
||||
<PackageReference Include="MSTest.TestAdapter" Version="3.0.2" />
|
||||
<PackageReference Include="MSTest.TestFramework" Version="3.0.2" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
|
||||
@@ -152,7 +152,7 @@ namespace Tgstation.Server.Tests
|
||||
Assert.AreEqual(1, serverInformation.SwarmServers.Count);
|
||||
var controller = serverInformation.SwarmServers.SingleOrDefault(x => x.Identifier == "controller");
|
||||
Assert.IsNotNull(controller);
|
||||
Assert.AreEqual(controller.Address, "http://localhost:5011");
|
||||
Assert.AreEqual(controller.Address, new Uri("http://localhost:5011"));
|
||||
Assert.IsTrue(controller.Controller);
|
||||
}
|
||||
|
||||
@@ -270,17 +270,17 @@ namespace Tgstation.Server.Tests
|
||||
|
||||
var node1 = serverInformation.SwarmServers.SingleOrDefault(x => x.Identifier == "node1");
|
||||
Assert.IsNotNull(node1);
|
||||
Assert.AreEqual(node1.Address, "http://localhost:5012");
|
||||
Assert.AreEqual(node1.Address, new Uri("http://localhost:5012"));
|
||||
Assert.IsFalse(node1.Controller);
|
||||
|
||||
var node2 = serverInformation.SwarmServers.SingleOrDefault(x => x.Identifier == "node2");
|
||||
Assert.IsNotNull(node2);
|
||||
Assert.AreEqual(node2.Address, "http://localhost:5013");
|
||||
Assert.AreEqual(node2.Address, new Uri("http://localhost:5013"));
|
||||
Assert.IsFalse(node2.Controller);
|
||||
|
||||
var controller = serverInformation.SwarmServers.SingleOrDefault(x => x.Identifier == "controller");
|
||||
Assert.IsNotNull(controller);
|
||||
Assert.AreEqual(controller.Address, "http://localhost:5011");
|
||||
Assert.AreEqual(controller.Address, new Uri("http://localhost:5011"));
|
||||
Assert.IsTrue(controller.Controller);
|
||||
}
|
||||
|
||||
@@ -483,17 +483,17 @@ namespace Tgstation.Server.Tests
|
||||
|
||||
var node1 = serverInformation.SwarmServers.SingleOrDefault(x => x.Identifier == "node1");
|
||||
Assert.IsNotNull(node1);
|
||||
Assert.AreEqual(node1.Address, "http://localhost:5012");
|
||||
Assert.AreEqual(node1.Address, new Uri("http://localhost:5012"));
|
||||
Assert.IsFalse(node1.Controller);
|
||||
|
||||
var node2 = serverInformation.SwarmServers.SingleOrDefault(x => x.Identifier == "node2");
|
||||
Assert.IsNotNull(node2);
|
||||
Assert.AreEqual(node2.Address, "http://localhost:5013");
|
||||
Assert.AreEqual(node2.Address, new Uri("http://localhost:5013"));
|
||||
Assert.IsFalse(node2.Controller);
|
||||
|
||||
var controller = serverInformation.SwarmServers.SingleOrDefault(x => x.Identifier == "controller");
|
||||
Assert.IsNotNull(controller);
|
||||
Assert.AreEqual(controller.Address, "http://localhost:5011");
|
||||
Assert.AreEqual(controller.Address, new Uri("http://localhost:5011"));
|
||||
Assert.IsTrue(controller.Controller);
|
||||
}
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
<Import Project="../../build/Version.props" />
|
||||
|
||||
<PropertyGroup>
|
||||
@@ -8,14 +8,14 @@
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="coverlet.collector" Version="3.1.2">
|
||||
<PackageReference Include="coverlet.collector" Version="3.2.0">
|
||||
<PrivateAssets>all</PrivateAssets>
|
||||
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
||||
</PackageReference>
|
||||
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.3.1" />
|
||||
<PackageReference Include="Moq" Version="4.18.2" />
|
||||
<PackageReference Include="MSTest.TestAdapter" Version="2.2.10" />
|
||||
<PackageReference Include="MSTest.TestFramework" Version="2.2.10" />
|
||||
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.5.0" />
|
||||
<PackageReference Include="Moq" Version="4.18.4" />
|
||||
<PackageReference Include="MSTest.TestAdapter" Version="3.0.2" />
|
||||
<PackageReference Include="MSTest.TestFramework" Version="3.0.2" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
|
||||
@@ -75,7 +75,6 @@ namespace ReleaseNotes
|
||||
Task<Milestone> milestoneTask = null;
|
||||
var milestoneTaskLock = new object();
|
||||
var releaseDictionary = new Dictionary<string, List<Tuple<string, int, string>>>(StringComparer.OrdinalIgnoreCase);
|
||||
var authorizedUsers = new Dictionary<long, Task<bool>>();
|
||||
|
||||
bool postControlPanelMessage = false;
|
||||
|
||||
@@ -111,44 +110,13 @@ namespace ReleaseNotes
|
||||
// if (!fullPR.Merged)
|
||||
//return;
|
||||
|
||||
async Task BuildNotesFromComment(string comment, User user)
|
||||
void BuildNotesFromComment(string comment, User user)
|
||||
{
|
||||
if (comment == null)
|
||||
return;
|
||||
|
||||
async Task CommitNotes(string component, List<string> notes)
|
||||
void CommitNotes(string component, List<string> notes)
|
||||
{
|
||||
Task<bool> authTask;
|
||||
TaskCompletionSource<bool> ourTcs = null;
|
||||
lock (authorizedUsers)
|
||||
{
|
||||
if (!authorizedUsers.TryGetValue(user.Id, out authTask))
|
||||
{
|
||||
ourTcs = new TaskCompletionSource<bool>();
|
||||
authTask = ourTcs.Task;
|
||||
authorizedUsers.Add(user.Id, authTask);
|
||||
}
|
||||
}
|
||||
|
||||
if (ourTcs != null)
|
||||
try
|
||||
{
|
||||
//check if the user has access
|
||||
var perm = String.IsNullOrWhiteSpace(githubToken)
|
||||
? PermissionLevel.Write
|
||||
: (await client.Repository.Collaborator.ReviewPermission(RepoOwner, RepoName, user.Login).ConfigureAwait(false)).Permission;
|
||||
ourTcs.SetResult(perm == PermissionLevel.Write || perm == PermissionLevel.Admin);
|
||||
}
|
||||
catch
|
||||
{
|
||||
ourTcs.SetResult(false);
|
||||
throw;
|
||||
}
|
||||
|
||||
var authorized = await authTask.ConfigureAwait(false);
|
||||
if (!authorized)
|
||||
return;
|
||||
|
||||
lock (releaseDictionary)
|
||||
{
|
||||
foreach (var I in notes)
|
||||
@@ -180,7 +148,7 @@ namespace ReleaseNotes
|
||||
}
|
||||
if (trimmedLine.StartsWith("/:cl:", StringComparison.Ordinal))
|
||||
{
|
||||
await CommitNotes(targetComponent, notes);
|
||||
CommitNotes(targetComponent, notes);
|
||||
targetComponent = null;
|
||||
notes.Clear();
|
||||
continue;
|
||||
@@ -193,7 +161,9 @@ namespace ReleaseNotes
|
||||
}
|
||||
|
||||
var comments = await client.Issue.Comment.GetAllForIssue(RepoOwner, RepoName, fullPR.Number).ConfigureAwait(false);
|
||||
await Task.WhenAll(BuildNotesFromComment(fullPR.Body, fullPR.User), Task.WhenAll(comments.Select(x => BuildNotesFromComment(x.Body, x.User)))).ConfigureAwait(false);
|
||||
BuildNotesFromComment(fullPR.Body, fullPR.User);
|
||||
foreach(var x in comments)
|
||||
BuildNotesFromComment(x.Body, x.User);
|
||||
}
|
||||
|
||||
var tasks = new List<Task>();
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="octokit" Version="3.0.0" />
|
||||
<PackageReference Include="octokit" Version="5.0.2" />
|
||||
<PackageReference Include="Octokit.GraphQL" Version="0.2.0-beta" />
|
||||
</ItemGroup>
|
||||
|
||||
|
||||
Reference in New Issue
Block a user