From b6084292bd3b563977a4df3eb922ac4e4a3eb133 Mon Sep 17 00:00:00 2001 From: Dominion Date: Sat, 1 Apr 2023 17:55:03 -0400 Subject: [PATCH] Add support for showing conflicting files in repo update error --- .../Components/Events/EventType.cs | 2 +- .../Components/Repository/IRepository.cs | 4 +- .../Components/Repository/Repository.cs | 49 ++++++++++++------- .../Repository/RepositoryUpdateService.cs | 6 ++- .../Components/Repository/TestMergeResult.cs | 22 +++++++++ 5 files changed, 61 insertions(+), 22 deletions(-) create mode 100644 src/Tgstation.Server.Host/Components/Repository/TestMergeResult.cs 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; } + } +}