Skip to content

Commit fbc8edc

Browse files
committed
feature: show conflict reason
Signed-off-by: leo <[email protected]>
1 parent 3437f5f commit fbc8edc

File tree

4 files changed

+108
-4
lines changed

4 files changed

+108
-4
lines changed

src/Commands/QueryLocalChanges.cs

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using System;
22
using System.Collections.Generic;
33
using System.Text.RegularExpressions;
4+
45
using Avalonia.Threading;
56

67
namespace SourceGit.Commands
@@ -128,12 +129,31 @@ public QueryLocalChanges(string repo, bool includeUntracked = true)
128129
change.Set(Models.ChangeState.Deleted, Models.ChangeState.Copied);
129130
break;
130131
case "DD":
132+
change.ConflictReason = Models.ConflictReason.BothDeleted;
133+
change.Set(Models.ChangeState.None, Models.ChangeState.Conflicted);
134+
break;
131135
case "AU":
136+
change.ConflictReason = Models.ConflictReason.AddedByUs;
137+
change.Set(Models.ChangeState.None, Models.ChangeState.Conflicted);
138+
break;
132139
case "UD":
140+
change.ConflictReason = Models.ConflictReason.DeletedByThem;
141+
change.Set(Models.ChangeState.None, Models.ChangeState.Conflicted);
142+
break;
133143
case "UA":
144+
change.ConflictReason = Models.ConflictReason.AddedByThem;
145+
change.Set(Models.ChangeState.None, Models.ChangeState.Conflicted);
146+
break;
134147
case "DU":
148+
change.ConflictReason = Models.ConflictReason.DeletedByUs;
149+
change.Set(Models.ChangeState.None, Models.ChangeState.Conflicted);
150+
break;
135151
case "AA":
152+
change.ConflictReason = Models.ConflictReason.BothAdded;
153+
change.Set(Models.ChangeState.None, Models.ChangeState.Conflicted);
154+
break;
136155
case "UU":
156+
change.ConflictReason = Models.ConflictReason.BothModified;
137157
change.Set(Models.ChangeState.None, Models.ChangeState.Conflicted);
138158
break;
139159
case "??":

src/Models/Change.cs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,18 @@ public enum ChangeState
2222
Conflicted,
2323
}
2424

25+
public enum ConflictReason
26+
{
27+
None,
28+
BothDeleted,
29+
AddedByUs,
30+
DeletedByThem,
31+
AddedByThem,
32+
DeletedByUs,
33+
BothAdded,
34+
BothModified,
35+
}
36+
2537
public class ChangeDataForAmend
2638
{
2739
public string FileMode { get; set; } = "";
@@ -36,6 +48,8 @@ public class Change
3648
public string Path { get; set; } = "";
3749
public string OriginalPath { get; set; } = "";
3850
public ChangeDataForAmend DataForAmend { get; set; } = null;
51+
public ConflictReason ConflictReason { get; set; } = ConflictReason.None;
52+
public bool IsSubmodule { get; set; } = false;
3953
public bool IsConflicted => WorkTree == ChangeState.Conflicted;
4054

4155
public void Set(ChangeState index, ChangeState workTree = ChangeState.None)

src/ViewModels/Conflict.cs

Lines changed: 64 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,18 @@ public ConflictSourceBranch(Repository repo, Models.Branch branch)
2525

2626
public class Conflict
2727
{
28+
public string Marker
29+
{
30+
get;
31+
private set;
32+
}
33+
34+
public string Description
35+
{
36+
get;
37+
private set;
38+
}
39+
2840
public object Theirs
2941
{
3042
get;
@@ -41,15 +53,65 @@ public bool IsResolved
4153
{
4254
get;
4355
private set;
44-
}
56+
} = false;
57+
58+
public bool CanUseExternalMergeTool
59+
{
60+
get;
61+
private set;
62+
} = false;
4563

4664
public Conflict(Repository repo, WorkingCopy wc, Models.Change change)
4765
{
4866
_wc = wc;
4967
_change = change;
5068

5169
var isSubmodule = repo.Submodules.Find(x => x.Path.Equals(change.Path, StringComparison.Ordinal)) != null;
52-
IsResolved = !isSubmodule && new Commands.IsConflictResolved(repo.FullPath, change).Result();
70+
switch (change.ConflictReason)
71+
{
72+
case Models.ConflictReason.BothDeleted:
73+
Marker = "DD";
74+
Description = "Both deleted";
75+
break;
76+
case Models.ConflictReason.AddedByUs:
77+
Marker = "AU";
78+
Description = "Added by us";
79+
break;
80+
case Models.ConflictReason.DeletedByThem:
81+
Marker = "UD";
82+
Description = "Deleted by them";
83+
break;
84+
case Models.ConflictReason.AddedByThem:
85+
Marker = "UA";
86+
Description = "Added by them";
87+
break;
88+
case Models.ConflictReason.DeletedByUs:
89+
Marker = "DU";
90+
Description = "Deleted by us";
91+
break;
92+
case Models.ConflictReason.BothAdded:
93+
Marker = "AA";
94+
Description = "Both added";
95+
if (!isSubmodule)
96+
{
97+
CanUseExternalMergeTool = true;
98+
IsResolved = new Commands.IsConflictResolved(repo.FullPath, change).Result();
99+
}
100+
break;
101+
case Models.ConflictReason.BothModified:
102+
Marker = "UU";
103+
Description = "Both modified";
104+
if (!isSubmodule)
105+
{
106+
CanUseExternalMergeTool = true;
107+
IsResolved = new Commands.IsConflictResolved(repo.FullPath, change).Result();
108+
}
109+
break;
110+
default:
111+
Marker = string.Empty;
112+
Description = string.Empty;
113+
break;
114+
}
53115

54116
var context = wc.InProgressContext;
55117
if (context is CherryPickInProgress cherryPick)

src/Views/Conflict.axaml

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,15 @@
1414
<StackPanel Orientation="Vertical" IsVisible="{Binding !IsResolved}">
1515
<Path Width="64" Height="64" Data="{StaticResource Icons.Conflict}" Fill="{DynamicResource Brush.FG2}" HorizontalAlignment="Center"/>
1616
<TextBlock Margin="0,16" FontSize="20" FontWeight="Bold" Text="{DynamicResource Text.WorkingCopy.Conflicts}" Foreground="{DynamicResource Brush.FG2}" HorizontalAlignment="Center"/>
17-
17+
18+
<StackPanel Orientation="Horizontal" HorizontalAlignment="Center" Margin="0,0,0,8">
19+
<Border Height="16" VerticalAlignment="Center" Background="Red" CornerRadius="8">
20+
<TextBlock Classes="primary" Text="{Binding Marker}" Foreground="White" FontWeight="Bold" Margin="8,0" FontSize="10"/>
21+
</Border>
22+
23+
<TextBlock Margin="8,0,0,0" VerticalAlignment="Center" Text="{Binding Description}"/>
24+
</StackPanel>
25+
1826
<Border Margin="16,0" Padding="8" CornerRadius="4" BorderThickness="1" BorderBrush="{DynamicResource Brush.Border2}">
1927
<Border.DataTemplates>
2028
<DataTemplate DataType="vm:ConflictSourceBranch">
@@ -117,7 +125,7 @@
117125
<TextBlock Margin="6,0,0,0" Text="{DynamicResource Text.WorkingCopy.Conflicts.UseMine}" VerticalAlignment="Center"/>
118126
</StackPanel>
119127
</Button>
120-
<Button Classes="flat" Margin="8,0,0,0" Command="{Binding OpenExternalMergeTool}">
128+
<Button Classes="flat" Margin="8,0,0,0" Command="{Binding OpenExternalMergeTool}" IsVisible="{Binding CanUseExternalMergeTool}">
121129
<StackPanel Orientation="Horizontal">
122130
<Path Width="12" Height="12" Data="{StaticResource Icons.OpenWith}"/>
123131
<TextBlock Margin="6,0,0,0" Text="{DynamicResource Text.WorkingCopy.Conflicts.OpenExternalMergeTool}" VerticalAlignment="Center"/>

0 commit comments

Comments
 (0)