Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We鈥檒l occasionally send you account related emails.

Already on GitHub? Sign in to your account

--staged param for prs chat command #1513

Merged
merged 4 commits into from
Jun 4, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
using System.Collections.Generic;

using Tgstation.Server.Host.Components.Byond;
using Tgstation.Server.Host.Components.Deployment;
using Tgstation.Server.Host.Components.Repository;
using Tgstation.Server.Host.Components.Watchdog;
using Tgstation.Server.Host.Database;
Expand Down Expand Up @@ -32,6 +33,11 @@ sealed class CommandFactory : ICommandFactory
/// </summary>
readonly IDatabaseContextFactory databaseContextFactory;

/// <summary>
/// The <see cref="ILatestCompileJobProvider"/> for the <see cref="CommandFactory"/>.
/// </summary>
readonly ILatestCompileJobProvider compileJobProvider;

/// <summary>
/// The <see cref="Models.Instance"/> for the <see cref="CommandFactory"/>.
/// </summary>
Expand All @@ -49,18 +55,21 @@ sealed class CommandFactory : ICommandFactory
/// <param name="byondManager">The value of <see cref="byondManager"/>.</param>
/// <param name="repositoryManager">The value of <see cref="repositoryManager"/>.</param>
/// <param name="databaseContextFactory">The value of <see cref="databaseContextFactory"/>.</param>
/// <param name="compileJobProvider">The value of <see cref="compileJobProvider"/>.</param>
/// <param name="instance">The value of <see cref="instance"/>.</param>
public CommandFactory(
IAssemblyInformationProvider assemblyInformationProvider,
IByondManager byondManager,
IRepositoryManager repositoryManager,
IDatabaseContextFactory databaseContextFactory,
ILatestCompileJobProvider compileJobProvider,
Models.Instance instance)
{
this.assemblyInformationProvider = assemblyInformationProvider ?? throw new ArgumentNullException(nameof(assemblyInformationProvider));
this.byondManager = byondManager ?? throw new ArgumentNullException(nameof(byondManager));
this.repositoryManager = repositoryManager ?? throw new ArgumentNullException(nameof(repositoryManager));
this.databaseContextFactory = databaseContextFactory ?? throw new ArgumentNullException(nameof(databaseContextFactory));
this.compileJobProvider = compileJobProvider ?? throw new ArgumentNullException(nameof(compileJobProvider));
this.instance = instance ?? throw new ArgumentNullException(nameof(instance));
}

Expand All @@ -85,7 +94,7 @@ public IReadOnlyList<ICommand> GenerateCommands()
new VersionCommand(assemblyInformationProvider),
new ByondCommand(byondManager, watchdog),
new RevisionCommand(watchdog, repositoryManager),
new PullRequestsCommand(watchdog, repositoryManager, databaseContextFactory, instance),
new PullRequestsCommand(watchdog, repositoryManager, databaseContextFactory, compileJobProvider, instance),
new KekCommand(),
};
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
using Microsoft.EntityFrameworkCore;

using Tgstation.Server.Api.Models;
using Tgstation.Server.Host.Components.Deployment;
using Tgstation.Server.Host.Components.Interop;
using Tgstation.Server.Host.Components.Repository;
using Tgstation.Server.Host.Components.Watchdog;
Expand All @@ -23,7 +24,7 @@ sealed class PullRequestsCommand : ICommand
public string Name => "prs";

/// <inheritdoc />
public string HelpText => "Display live test merge numbers. Add --repo to view test merges in the repository as opposed to live.";
public string HelpText => "Display live test merge numbers. Add --repo to view test merges in the repository as opposed to live. Add --staged to view PRs in the upcoming deployment.";

/// <inheritdoc />
public bool AdminOnly => false;
Expand All @@ -43,6 +44,11 @@ sealed class PullRequestsCommand : ICommand
/// </summary>
readonly IDatabaseContextFactory databaseContextFactory;

/// <summary>
/// The <see cref="ILatestCompileJobProvider"/> for the <see cref="PullRequestsCommand"/>.
/// </summary>
readonly ILatestCompileJobProvider compileJobProvider;

/// <summary>
/// The <see cref="Models.Instance"/> for the <see cref="PullRequestsCommand"/>.
/// </summary>
Expand All @@ -54,12 +60,19 @@ sealed class PullRequestsCommand : ICommand
/// <param name="watchdog">The value of <see cref="watchdog"/>.</param>
/// <param name="repositoryManager">The value of <see cref="repositoryManager"/>.</param>
/// <param name="databaseContextFactory">The value of <see cref="databaseContextFactory"/>.</param>
/// <param name="compileJobProvider">The value of <see cref="compileJobProvider"/>.</param>
/// <param name="instance">The value of <see cref="instance"/>.</param>
public PullRequestsCommand(IWatchdog watchdog, IRepositoryManager repositoryManager, IDatabaseContextFactory databaseContextFactory, Models.Instance instance)
public PullRequestsCommand(
IWatchdog watchdog,
IRepositoryManager repositoryManager,
IDatabaseContextFactory databaseContextFactory,
ILatestCompileJobProvider compileJobProvider,
Models.Instance instance)
{
this.watchdog = watchdog ?? throw new ArgumentNullException(nameof(watchdog));
this.repositoryManager = repositoryManager ?? throw new ArgumentNullException(nameof(repositoryManager));
this.databaseContextFactory = databaseContextFactory ?? throw new ArgumentNullException(nameof(databaseContextFactory));
this.compileJobProvider = compileJobProvider ?? throw new ArgumentNullException(nameof(compileJobProvider));
this.instance = instance ?? throw new ArgumentNullException(nameof(instance));
}

Expand All @@ -69,8 +82,24 @@ public PullRequestsCommand(IWatchdog watchdog, IRepositoryManager repositoryMana
public async Task<MessageContent> Invoke(string arguments, ChatUser user, CancellationToken cancellationToken)
{
IEnumerable<Models.TestMerge> results = null;
if (arguments.Split(' ').Any(x => x.ToUpperInvariant() == "--REPO"))
var splits = arguments.Split(' ');
var hasRepo = splits.Any(x => x.Equals("--repo", StringComparison.OrdinalIgnoreCase));
var hasStaged = splits.Any(x => x.Equals("--staged", StringComparison.OrdinalIgnoreCase));

if (hasStaged && hasRepo)
return new MessageContent
{
Text = "Please use only one of `--staged` or `--repo`",
};

if (hasRepo)
{
if (repositoryManager.CloneInProgress || repositoryManager.InUse)
return new MessageContent
{
Text = "Repository busy! Try again later",
};

string head;
using (var repo = await repositoryManager.LoadRepository(cancellationToken))
{
Expand All @@ -97,14 +126,24 @@ public async Task<MessageContent> Invoke(string arguments, ChatUser user, Cancel
})
.ToListAsync(cancellationToken));
}
else if (watchdog.Status == WatchdogStatus.Offline)
return new MessageContent
{
Text = "Server offline!",
};
else
{
if (watchdog.Status == WatchdogStatus.Offline)
return new MessageContent
{
Text = "Server offline!",
};
results = watchdog.ActiveCompileJob?.RevisionInformation.ActiveTestMerges.Select(x => x.TestMerge).ToList() ?? new List<Models.TestMerge>();
var compileJobToUse = watchdog.ActiveCompileJob;
if (hasStaged)
{
var latestCompileJob = compileJobProvider.LatestCompileJob();
if (latestCompileJob?.Id != compileJobToUse?.Id)
compileJobToUse = latestCompileJob;
else
compileJobToUse = null;
}

results = compileJobToUse?.RevisionInformation.ActiveTestMerges.Select(x => x.TestMerge).ToList() ?? Enumerable.Empty<Models.TestMerge>();
}

return new MessageContent
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,13 @@ public async Task<MessageContent> Invoke(string arguments, ChatUser user, Cancel
{
string result;
if (arguments.Split(' ').Any(x => x.ToUpperInvariant() == "--REPO"))
{
if (repositoryManager.CloneInProgress || repositoryManager.InUse)
return new MessageContent
{
Text = "Repository busy! Try again later",
};

using (var repo = await repositoryManager.LoadRepository(cancellationToken))
{
if (repo == null)
Expand All @@ -60,6 +67,7 @@ public async Task<MessageContent> Invoke(string arguments, ChatUser user, Cancel
};
result = repo.Head;
}
}
else
{
if (watchdog.Status == WatchdogStatus.Offline)
Expand Down
65 changes: 33 additions & 32 deletions src/Tgstation.Server.Host/Components/InstanceFactory.cs
Original file line number Diff line number Diff line change
Expand Up @@ -300,38 +300,18 @@ public async Task<IInstance> CreateInstance(IBridgeRegistrar bridgeRegistrar, Mo
{
var byond = new ByondManager(byondIOManager, byondInstaller, eventConsumer, loggerFactory.CreateLogger<ByondManager>());

var commandFactory = new CommandFactory(assemblyInformationProvider, byond, repoManager, databaseContextFactory, metadata);

var chatManager = chatFactory.CreateChatManager(commandFactory, metadata.ChatSettings);
var dmbFactory = new DmbFactory(
databaseContextFactory,
gameIoManager,
remoteDeploymentManagerFactory,
eventConsumer,
loggerFactory.CreateLogger<DmbFactory>(),
metadata);
try
{
var sessionControllerFactory = new SessionControllerFactory(
processExecutor,
byond,
topicClientFactory,
cryptographySuite,
assemblyInformationProvider,
gameIoManager,
diagnosticsIOManager,
chatManager,
networkPromptReaper,
platformIdentifier,
bridgeRegistrar,
serverPortProvider,
eventConsumer,
asyncDelayer,
loggerFactory,
loggerFactory.CreateLogger<SessionControllerFactory>(),
sessionConfiguration,
metadata);

var dmbFactory = new DmbFactory(
databaseContextFactory,
gameIoManager,
remoteDeploymentManagerFactory,
eventConsumer,
loggerFactory.CreateLogger<DmbFactory>(),
metadata);
var commandFactory = new CommandFactory(assemblyInformationProvider, byond, repoManager, databaseContextFactory, dmbFactory, metadata);

var chatManager = chatFactory.CreateChatManager(commandFactory, metadata.ChatSettings);
try
{
var reattachInfoHandler = new SessionPersistor(
Expand All @@ -340,6 +320,27 @@ public async Task<IInstance> CreateInstance(IBridgeRegistrar bridgeRegistrar, Mo
processExecutor,
loggerFactory.CreateLogger<SessionPersistor>(),
metadata);

var sessionControllerFactory = new SessionControllerFactory(
processExecutor,
byond,
topicClientFactory,
cryptographySuite,
assemblyInformationProvider,
gameIoManager,
diagnosticsIOManager,
chatManager,
networkPromptReaper,
platformIdentifier,
bridgeRegistrar,
serverPortProvider,
eventConsumer,
asyncDelayer,
loggerFactory,
loggerFactory.CreateLogger<SessionControllerFactory>(),
sessionConfiguration,
metadata);

var watchdog = watchdogFactory.CreateWatchdog(
chatManager,
dmbFactory,
Expand Down Expand Up @@ -398,13 +399,13 @@ public async Task<IInstance> CreateInstance(IBridgeRegistrar bridgeRegistrar, Mo
}
catch
{
dmbFactory.Dispose();
await chatManager.DisposeAsync();
throw;
}
}
catch
{
await chatManager.DisposeAsync();
dmbFactory.Dispose();
throw;
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -170,8 +170,7 @@ public async Task<IActionResult> Update([FromBody] DreamDaemonRequest model, Can
.AsQueryable()
.Where(x => x.Id == Instance.Id)
.Select(x => x.DreamDaemonSettings)
.FirstOrDefaultAsync(cancellationToken)
;
.FirstOrDefaultAsync(cancellationToken);

if (current == default)
return Gone();
Expand All @@ -182,8 +181,8 @@ public async Task<IActionResult> Update([FromBody] DreamDaemonRequest model, Can
.GetAvailablePort(
model.Port.Value,
true,
cancellationToken)
;
cancellationToken);

if (verifiedPort != model.Port)
return Conflict(new ErrorMessageResponse(ErrorCode.PortNotAvailable));
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
using Tgstation.Server.Host.Components.Byond;
using Tgstation.Server.Host.Components.Chat.Commands;
using Tgstation.Server.Host.Components.Chat.Providers;
using Tgstation.Server.Host.Components.Deployment;
using Tgstation.Server.Host.Components.Repository;
using Tgstation.Server.Host.Components.Watchdog;
using Tgstation.Server.Host.Database;
Expand Down Expand Up @@ -42,6 +43,7 @@ public DummyChatProviderFactory(IJobManager jobManager, ICryptographySuite crypt
Mock.Of<IByondManager>(),
Mock.Of<IRepositoryManager>(),
Mock.Of<IDatabaseContextFactory>(),
Mock.Of<ILatestCompileJobProvider>(),
new Host.Models.Instance());

commandFactory.SetWatchdog(Mock.Of<IWatchdog>());
Expand Down