diff --git a/src/Tgstation.Server.Host/Components/Events/EventType.cs b/src/Tgstation.Server.Host/Components/Events/EventType.cs
index a518f37712..0a54518a24 100644
--- a/src/Tgstation.Server.Host/Components/Events/EventType.cs
+++ b/src/Tgstation.Server.Host/Components/Events/EventType.cs
@@ -85,7 +85,7 @@
InstanceAutoUpdateStart,
///
- /// Parameters: Base sha, target sha, base reference, target reference
+ /// Parameters: Base sha, target sha, base reference, target reference, all conflicting files
///
[EventScript("RepoMergeConflict")]
RepoMergeConflict,
diff --git a/src/Tgstation.Server.Host/Components/Repository/IRepository.cs b/src/Tgstation.Server.Host/Components/Repository/IRepository.cs
index 73574da2af..ae54a9a8c7 100644
--- a/src/Tgstation.Server.Host/Components/Repository/IRepository.cs
+++ b/src/Tgstation.Server.Host/Components/Repository/IRepository.cs
@@ -69,8 +69,8 @@ namespace Tgstation.Server.Host.Components.Repository
/// If a submodule update should be attempted after the merge.
/// The to report progress of the operation.
/// The for the operation.
- /// A resulting in a representing the merge result that is after a fast forward or up to date, on a non-fast-forward, on a conflict.
- Task AddTestMerge(
+ /// A resulting in the .
+ Task AddTestMerge(
TestMergeParameters testMergeParameters,
string committerName,
string committerEmail,
diff --git a/src/Tgstation.Server.Host/Components/Repository/Repository.cs b/src/Tgstation.Server.Host/Components/Repository/Repository.cs
index 9e0bea04f3..db3d04bcc9 100644
--- a/src/Tgstation.Server.Host/Components/Repository/Repository.cs
+++ b/src/Tgstation.Server.Host/Components/Repository/Repository.cs
@@ -172,7 +172,7 @@ namespace Tgstation.Server.Host.Components.Repository
///
#pragma warning disable CA1506 // TODO: Decomplexify
- public async Task AddTestMerge(
+ public async Task AddTestMerge(
TestMergeParameters testMergeParameters,
string committerName,
string committerEmail,
@@ -225,6 +225,7 @@ namespace Tgstation.Server.Host.Components.Repository
var progressFactor = 1.0 / (updateSubmodules ? 3 : 2);
var sig = new Signature(new Identity(committerName, committerEmail), DateTimeOffset.UtcNow);
+ List conflictedPaths = null;
await Task.Factory.StartNew(
() =>
{
@@ -279,7 +280,7 @@ namespace Tgstation.Server.Host.Components.Repository
result = libGitRepo.Merge(testMergeParameters.TargetCommitSha, sig, new MergeOptions
{
CommitOnSuccess = commitMessage == null,
- FailOnConflict = true,
+ FailOnConflict = false, // Needed to get conflicting files
FastForwardStrategy = FastForwardStrategy.NoFastForward,
SkipReuc = true,
OnCheckoutProgress = CheckoutProgressHandler(
@@ -295,6 +296,12 @@ namespace Tgstation.Server.Host.Components.Repository
if (result.Status == MergeStatus.Conflicts)
{
+ var repoStatus = libGitRepo.RetrieveStatus();
+ conflictedPaths = new List();
+ foreach (var file in repoStatus)
+ if (file.State == FileStatus.Conflicted)
+ conflictedPaths.Add(file.FilePath);
+
var revertTo = originalCommit.CanonicalName ?? originalCommit.Tip.Sha;
logger.LogDebug("Merge conflict, aborting and reverting to {0}", revertTo);
progressReporter.ReportProgress(0);
@@ -306,23 +313,29 @@ namespace Tgstation.Server.Host.Components.Repository
},
cancellationToken,
DefaultIOManager.BlockingTaskCreationOptions,
- TaskScheduler.Current)
- ;
+ TaskScheduler.Current);
if (result.Status == MergeStatus.Conflicts)
{
+ var arguments = new List
+ {
+ originalCommit.Tip.Sha,
+ testMergeParameters.TargetCommitSha,
+ originalCommit.FriendlyName ?? UnknownReference,
+ testMergeBranchName,
+ };
+
+ arguments.AddRange(conflictedPaths);
+
await eventConsumer.HandleEvent(
EventType.RepoMergeConflict,
- new List
- {
- originalCommit.Tip.Sha,
- testMergeParameters.TargetCommitSha,
- originalCommit.FriendlyName ?? UnknownReference,
- testMergeBranchName,
- },
- cancellationToken)
- ;
- return null;
+ arguments,
+ cancellationToken);
+ return new TestMergeResult
+ {
+ Status = result.Status,
+ ConflictingFiles = conflictedPaths,
+ };
}
if (result.Status != MergeStatus.UpToDate)
@@ -356,10 +369,12 @@ namespace Tgstation.Server.Host.Components.Repository
testMergeParameters.TargetCommitSha,
testMergeParameters.Comment,
},
- cancellationToken)
- ;
+ cancellationToken);
- return result.Status != MergeStatus.NonFastForward;
+ return new TestMergeResult
+ {
+ Status = result.Status,
+ };
}
#pragma warning restore CA1506
diff --git a/src/Tgstation.Server.Host/Components/Repository/RepositoryUpdateService.cs b/src/Tgstation.Server.Host/Components/Repository/RepositoryUpdateService.cs
index 5e6b9808cf..4f283079de 100644
--- a/src/Tgstation.Server.Host/Components/Repository/RepositoryUpdateService.cs
+++ b/src/Tgstation.Server.Host/Components/Repository/RepositoryUpdateService.cs
@@ -4,6 +4,8 @@ using System.Linq;
using System.Threading;
using System.Threading.Tasks;
+using LibGit2Sharp;
+
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Logging;
@@ -499,11 +501,11 @@ namespace Tgstation.Server.Host.Components.Repository
NextProgressReporter($"Test merge #{newTestMerge.Number}"),
cancellationToken);
- if (mergeResult == null)
+ if (mergeResult.Status == MergeStatus.Conflicts)
throw new JobException(
ErrorCode.RepoTestMergeConflict,
new JobException(
- $"Test Merge #{newTestMerge.Number} at {newTestMerge.TargetCommitSha[..7]} conflicted!"));
+ $"Test Merge #{newTestMerge.Number} at {newTestMerge.TargetCommitSha[..7]} conflicted! Conflicting files:{Environment.NewLine}{String.Join(Environment.NewLine, mergeResult.ConflictingFiles.Select(file => $"\t- /{file}"))}"));
Models.TestMerge fullTestMerge;
try
diff --git a/src/Tgstation.Server.Host/Components/Repository/TestMergeResult.cs b/src/Tgstation.Server.Host/Components/Repository/TestMergeResult.cs
new file mode 100644
index 0000000000..387a6baad1
--- /dev/null
+++ b/src/Tgstation.Server.Host/Components/Repository/TestMergeResult.cs
@@ -0,0 +1,22 @@
+using System.Collections.Generic;
+
+using LibGit2Sharp;
+
+namespace Tgstation.Server.Host.Components.Repository
+{
+ ///
+ /// Represents the result of a repository test merge attempt.
+ ///
+ public sealed class TestMergeResult
+ {
+ ///
+ /// The resulting .
+ ///
+ public MergeStatus Status { get; init; }
+
+ ///
+ /// List of conflicting file paths relative to the repository root. Only present if is .
+ ///
+ public IReadOnlyList ConflictingFiles { get; init; }
+ }
+}