From fbc8edcc13a336a674d2c46077462de5e1eda3f0 Mon Sep 17 00:00:00 2001 From: leo Date: Wed, 28 May 2025 14:20:31 +0800 Subject: [PATCH] feature: show conflict reason Signed-off-by: leo --- src/Commands/QueryLocalChanges.cs | 20 ++++++++++ src/Models/Change.cs | 14 +++++++ src/ViewModels/Conflict.cs | 66 ++++++++++++++++++++++++++++++- src/Views/Conflict.axaml | 12 +++++- 4 files changed, 108 insertions(+), 4 deletions(-) diff --git a/src/Commands/QueryLocalChanges.cs b/src/Commands/QueryLocalChanges.cs index 9abf433e..db29531a 100644 --- a/src/Commands/QueryLocalChanges.cs +++ b/src/Commands/QueryLocalChanges.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Text.RegularExpressions; + using Avalonia.Threading; namespace SourceGit.Commands @@ -128,12 +129,31 @@ namespace SourceGit.Commands change.Set(Models.ChangeState.Deleted, Models.ChangeState.Copied); break; case "DD": + change.ConflictReason = Models.ConflictReason.BothDeleted; + change.Set(Models.ChangeState.None, Models.ChangeState.Conflicted); + break; case "AU": + change.ConflictReason = Models.ConflictReason.AddedByUs; + change.Set(Models.ChangeState.None, Models.ChangeState.Conflicted); + break; case "UD": + change.ConflictReason = Models.ConflictReason.DeletedByThem; + change.Set(Models.ChangeState.None, Models.ChangeState.Conflicted); + break; case "UA": + change.ConflictReason = Models.ConflictReason.AddedByThem; + change.Set(Models.ChangeState.None, Models.ChangeState.Conflicted); + break; case "DU": + change.ConflictReason = Models.ConflictReason.DeletedByUs; + change.Set(Models.ChangeState.None, Models.ChangeState.Conflicted); + break; case "AA": + change.ConflictReason = Models.ConflictReason.BothAdded; + change.Set(Models.ChangeState.None, Models.ChangeState.Conflicted); + break; case "UU": + change.ConflictReason = Models.ConflictReason.BothModified; change.Set(Models.ChangeState.None, Models.ChangeState.Conflicted); break; case "??": diff --git a/src/Models/Change.cs b/src/Models/Change.cs index 7d772d3e..4e0e23ae 100644 --- a/src/Models/Change.cs +++ b/src/Models/Change.cs @@ -22,6 +22,18 @@ namespace SourceGit.Models Conflicted, } + public enum ConflictReason + { + None, + BothDeleted, + AddedByUs, + DeletedByThem, + AddedByThem, + DeletedByUs, + BothAdded, + BothModified, + } + public class ChangeDataForAmend { public string FileMode { get; set; } = ""; @@ -36,6 +48,8 @@ namespace SourceGit.Models public string Path { get; set; } = ""; public string OriginalPath { get; set; } = ""; public ChangeDataForAmend DataForAmend { get; set; } = null; + public ConflictReason ConflictReason { get; set; } = ConflictReason.None; + public bool IsSubmodule { get; set; } = false; public bool IsConflicted => WorkTree == ChangeState.Conflicted; public void Set(ChangeState index, ChangeState workTree = ChangeState.None) diff --git a/src/ViewModels/Conflict.cs b/src/ViewModels/Conflict.cs index add365a3..db6492cc 100644 --- a/src/ViewModels/Conflict.cs +++ b/src/ViewModels/Conflict.cs @@ -25,6 +25,18 @@ namespace SourceGit.ViewModels public class Conflict { + public string Marker + { + get; + private set; + } + + public string Description + { + get; + private set; + } + public object Theirs { get; @@ -41,7 +53,13 @@ namespace SourceGit.ViewModels { get; private set; - } + } = false; + + public bool CanUseExternalMergeTool + { + get; + private set; + } = false; public Conflict(Repository repo, WorkingCopy wc, Models.Change change) { @@ -49,7 +67,51 @@ namespace SourceGit.ViewModels _change = change; var isSubmodule = repo.Submodules.Find(x => x.Path.Equals(change.Path, StringComparison.Ordinal)) != null; - IsResolved = !isSubmodule && new Commands.IsConflictResolved(repo.FullPath, change).Result(); + switch (change.ConflictReason) + { + case Models.ConflictReason.BothDeleted: + Marker = "DD"; + Description = "Both deleted"; + break; + case Models.ConflictReason.AddedByUs: + Marker = "AU"; + Description = "Added by us"; + break; + case Models.ConflictReason.DeletedByThem: + Marker = "UD"; + Description = "Deleted by them"; + break; + case Models.ConflictReason.AddedByThem: + Marker = "UA"; + Description = "Added by them"; + break; + case Models.ConflictReason.DeletedByUs: + Marker = "DU"; + Description = "Deleted by us"; + break; + case Models.ConflictReason.BothAdded: + Marker = "AA"; + Description = "Both added"; + if (!isSubmodule) + { + CanUseExternalMergeTool = true; + IsResolved = new Commands.IsConflictResolved(repo.FullPath, change).Result(); + } + break; + case Models.ConflictReason.BothModified: + Marker = "UU"; + Description = "Both modified"; + if (!isSubmodule) + { + CanUseExternalMergeTool = true; + IsResolved = new Commands.IsConflictResolved(repo.FullPath, change).Result(); + } + break; + default: + Marker = string.Empty; + Description = string.Empty; + break; + } var context = wc.InProgressContext; if (context is CherryPickInProgress cherryPick) diff --git a/src/Views/Conflict.axaml b/src/Views/Conflict.axaml index 6e8aceb3..a324b50f 100644 --- a/src/Views/Conflict.axaml +++ b/src/Views/Conflict.axaml @@ -14,7 +14,15 @@ - + + + + + + + + + @@ -117,7 +125,7 @@ -