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 @@
-