Skip to content

Commit ef53dd0

Browse files
committed
refactor: use a new Models.ChangeState.Conflicted to represent all the unmerged file state (#1359)
Signed-off-by: leo <[email protected]>
1 parent 30d4c10 commit ef53dd0

File tree

6 files changed

+83
-131
lines changed

6 files changed

+83
-131
lines changed

src/Commands/QueryLocalChanges.cs

Lines changed: 2 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -128,30 +128,16 @@ public QueryLocalChanges(string repo, bool includeUntracked = true)
128128
change.Set(Models.ChangeState.Deleted, Models.ChangeState.Copied);
129129
break;
130130
case "DD":
131-
change.Set(Models.ChangeState.Deleted, Models.ChangeState.Deleted);
132-
break;
133131
case "AU":
134-
change.Set(Models.ChangeState.Added, Models.ChangeState.Unmerged);
135-
break;
136132
case "UD":
137-
change.Set(Models.ChangeState.Unmerged, Models.ChangeState.Deleted);
138-
break;
139133
case "UA":
140-
change.Set(Models.ChangeState.Unmerged, Models.ChangeState.Added);
141-
break;
142134
case "DU":
143-
change.Set(Models.ChangeState.Deleted, Models.ChangeState.Unmerged);
144-
break;
145135
case "AA":
146-
change.Set(Models.ChangeState.Added, Models.ChangeState.Added);
147-
break;
148136
case "UU":
149-
change.Set(Models.ChangeState.Unmerged, Models.ChangeState.Unmerged);
137+
change.Set(Models.ChangeState.None, Models.ChangeState.Conflicted);
150138
break;
151139
case "??":
152-
change.Set(Models.ChangeState.Untracked, Models.ChangeState.Untracked);
153-
break;
154-
default:
140+
change.Set(Models.ChangeState.None, Models.ChangeState.Untracked);
155141
break;
156142
}
157143

src/Commands/QueryStagedChangesWithAmend.cs

Lines changed: 53 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ namespace SourceGit.Commands
66
{
77
public partial class QueryStagedChangesWithAmend : Command
88
{
9-
[GeneratedRegex(@"^:[\d]{6} ([\d]{6}) ([0-9a-f]{40}) [0-9a-f]{40} ([ACDMTUX])\d{0,6}\t(.*)$")]
9+
[GeneratedRegex(@"^:[\d]{6} ([\d]{6}) ([0-9a-f]{40}) [0-9a-f]{40} ([ACDMT])\d{0,6}\t(.*)$")]
1010
private static partial Regex REG_FORMAT1();
1111
[GeneratedRegex(@"^:[\d]{6} ([\d]{6}) ([0-9a-f]{40}) [0-9a-f]{40} R\d{0,6}\t(.*\t.*)$")]
1212
private static partial Regex REG_FORMAT2();
@@ -22,76 +22,71 @@ public QueryStagedChangesWithAmend(string repo, string parent)
2222
public List<Models.Change> Result()
2323
{
2424
var rs = ReadToEnd();
25-
if (rs.IsSuccess)
25+
if (!rs.IsSuccess)
26+
return [];
27+
28+
var changes = new List<Models.Change>();
29+
var lines = rs.StdOut.Split(['\r', '\n'], StringSplitOptions.RemoveEmptyEntries);
30+
foreach (var line in lines)
2631
{
27-
var changes = new List<Models.Change>();
28-
var lines = rs.StdOut.Split(['\r', '\n'], StringSplitOptions.RemoveEmptyEntries);
29-
foreach (var line in lines)
32+
var match = REG_FORMAT2().Match(line);
33+
if (match.Success)
3034
{
31-
var match = REG_FORMAT2().Match(line);
32-
if (match.Success)
35+
var change = new Models.Change()
3336
{
34-
var change = new Models.Change()
37+
Path = match.Groups[3].Value,
38+
DataForAmend = new Models.ChangeDataForAmend()
3539
{
36-
Path = match.Groups[3].Value,
37-
DataForAmend = new Models.ChangeDataForAmend()
38-
{
39-
FileMode = match.Groups[1].Value,
40-
ObjectHash = match.Groups[2].Value,
41-
ParentSHA = _parent,
42-
},
43-
};
44-
change.Set(Models.ChangeState.Renamed);
45-
changes.Add(change);
46-
continue;
47-
}
40+
FileMode = match.Groups[1].Value,
41+
ObjectHash = match.Groups[2].Value,
42+
ParentSHA = _parent,
43+
},
44+
};
45+
change.Set(Models.ChangeState.Renamed);
46+
changes.Add(change);
47+
continue;
48+
}
4849

49-
match = REG_FORMAT1().Match(line);
50-
if (match.Success)
50+
match = REG_FORMAT1().Match(line);
51+
if (match.Success)
52+
{
53+
var change = new Models.Change()
5154
{
52-
var change = new Models.Change()
55+
Path = match.Groups[4].Value,
56+
DataForAmend = new Models.ChangeDataForAmend()
5357
{
54-
Path = match.Groups[4].Value,
55-
DataForAmend = new Models.ChangeDataForAmend()
56-
{
57-
FileMode = match.Groups[1].Value,
58-
ObjectHash = match.Groups[2].Value,
59-
ParentSHA = _parent,
60-
},
61-
};
58+
FileMode = match.Groups[1].Value,
59+
ObjectHash = match.Groups[2].Value,
60+
ParentSHA = _parent,
61+
},
62+
};
6263

63-
var type = match.Groups[3].Value;
64-
switch (type)
65-
{
66-
case "A":
67-
change.Set(Models.ChangeState.Added);
68-
break;
69-
case "C":
70-
change.Set(Models.ChangeState.Copied);
71-
break;
72-
case "D":
73-
change.Set(Models.ChangeState.Deleted);
74-
break;
75-
case "M":
76-
change.Set(Models.ChangeState.Modified);
77-
break;
78-
case "T":
79-
change.Set(Models.ChangeState.TypeChanged);
80-
break;
81-
case "U":
82-
change.Set(Models.ChangeState.Unmerged);
83-
break;
84-
}
85-
changes.Add(change);
64+
var type = match.Groups[3].Value;
65+
switch (type)
66+
{
67+
case "A":
68+
change.Set(Models.ChangeState.Added);
69+
break;
70+
case "C":
71+
change.Set(Models.ChangeState.Copied);
72+
break;
73+
case "D":
74+
change.Set(Models.ChangeState.Deleted);
75+
break;
76+
case "M":
77+
change.Set(Models.ChangeState.Modified);
78+
break;
79+
case "T":
80+
change.Set(Models.ChangeState.TypeChanged);
81+
break;
8682
}
83+
changes.Add(change);
8784
}
88-
89-
return changes;
9085
}
9186

92-
return [];
87+
return changes;
9388
}
9489

95-
private string _parent = string.Empty;
90+
private readonly string _parent;
9691
}
9792
}

src/Models/Change.cs

Lines changed: 4 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,8 @@ public enum ChangeState
1818
Deleted,
1919
Renamed,
2020
Copied,
21-
Unmerged,
22-
Untracked
21+
Untracked,
22+
Conflicted,
2323
}
2424

2525
public class ChangeDataForAmend
@@ -36,20 +36,7 @@ public class Change
3636
public string Path { get; set; } = "";
3737
public string OriginalPath { get; set; } = "";
3838
public ChangeDataForAmend DataForAmend { get; set; } = null;
39-
40-
public bool IsConflict
41-
{
42-
get
43-
{
44-
if (Index == ChangeState.Unmerged || WorkTree == ChangeState.Unmerged)
45-
return true;
46-
if (Index == ChangeState.Added && WorkTree == ChangeState.Added)
47-
return true;
48-
if (Index == ChangeState.Deleted && WorkTree == ChangeState.Deleted)
49-
return true;
50-
return false;
51-
}
52-
}
39+
public bool IsConflicted => WorkTree == ChangeState.Conflicted;
5340

5441
public void Set(ChangeState index, ChangeState workTree = ChangeState.None)
5542
{
@@ -77,6 +64,7 @@ public void Set(ChangeState index, ChangeState workTree = ChangeState.None)
7764

7865
if (Path[0] == '"')
7966
Path = Path.Substring(1, Path.Length - 2);
67+
8068
if (!string.IsNullOrEmpty(OriginalPath) && OriginalPath[0] == '"')
8169
OriginalPath = OriginalPath.Substring(1, OriginalPath.Length - 2);
8270
}

src/ViewModels/Conflict.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,6 @@ public Conflict(Repository repo, WorkingCopy wc, Models.Change change)
4949
_change = change;
5050

5151
var isSubmodule = repo.Submodules.Find(x => x.Path.Equals(change.Path, StringComparison.Ordinal)) != null;
52-
5352
IsResolved = !isSubmodule && new Commands.IsConflictResolved(repo.FullPath, change).Result();
5453

5554
var context = wc.InProgressContext;

src/ViewModels/WorkingCopy.cs

Lines changed: 18 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -244,7 +244,7 @@ public void SetData(List<Models.Change> changes)
244244
// Just force refresh selected changes.
245245
Dispatcher.UIThread.Invoke(() =>
246246
{
247-
HasUnsolvedConflicts = _cached.Find(x => x.IsConflict) != null;
247+
HasUnsolvedConflicts = _cached.Find(x => x.IsConflicted) != null;
248248

249249
UpdateDetail();
250250
UpdateInProgressState();
@@ -276,7 +276,7 @@ public void SetData(List<Models.Change> changes)
276276
if (c.WorkTree != Models.ChangeState.None)
277277
{
278278
unstaged.Add(c);
279-
hasConflict |= c.IsConflict;
279+
hasConflict |= c.IsConflicted;
280280
}
281281
}
282282

@@ -378,7 +378,7 @@ public async void UseTheirs(List<Models.Change> changes)
378378

379379
foreach (var change in changes)
380380
{
381-
if (!change.IsConflict)
381+
if (!change.IsConflicted)
382382
continue;
383383

384384
if (change.WorkTree == Models.ChangeState.Deleted)
@@ -420,7 +420,7 @@ public async void UseMine(List<Models.Change> changes)
420420

421421
foreach (var change in changes)
422422
{
423-
if (!change.IsConflict)
423+
if (!change.IsConflicted)
424424
continue;
425425

426426
if (change.Index == Models.ChangeState.Deleted)
@@ -547,17 +547,17 @@ public void AbortMerge()
547547

548548
public void Commit()
549549
{
550-
DoCommit(false, false, false);
550+
DoCommit(false, false);
551551
}
552552

553553
public void CommitWithAutoStage()
554554
{
555-
DoCommit(true, false, false);
555+
DoCommit(true, false);
556556
}
557557

558558
public void CommitWithPush()
559559
{
560-
DoCommit(false, true, false);
560+
DoCommit(false, true);
561561
}
562562

563563
public ContextMenu CreateContextMenuForUnstagedChanges()
@@ -594,7 +594,7 @@ public ContextMenu CreateContextMenuForUnstagedChanges()
594594
menu.Items.Add(openWith);
595595
menu.Items.Add(new MenuItem() { Header = "-" });
596596

597-
if (change.IsConflict)
597+
if (change.IsConflicted)
598598
{
599599
var useTheirs = new MenuItem();
600600
useTheirs.Icon = App.CreateMenuIcon("Icons.Incoming");
@@ -949,7 +949,7 @@ public ContextMenu CreateContextMenuForUnstagedChanges()
949949
var hasNonConflicts = false;
950950
foreach (var change in _selectedUnstaged)
951951
{
952-
if (change.IsConflict)
952+
if (change.IsConflicted)
953953
hasConflicts = true;
954954
else
955955
hasNonConflicts = true;
@@ -1534,9 +1534,7 @@ public ContextMenu CreateContextForOpenAI()
15341534
var rs = new List<Models.Change>();
15351535
foreach (var c in _cached)
15361536
{
1537-
if (c.Index != Models.ChangeState.None &&
1538-
c.Index != Models.ChangeState.Untracked &&
1539-
!c.IsConflict)
1537+
if (c.Index != Models.ChangeState.None)
15401538
rs.Add(c);
15411539
}
15421540
return rs;
@@ -1682,7 +1680,7 @@ private void SetDetail(Models.Change change, bool isUnstaged)
16821680

16831681
if (change == null)
16841682
DetailContext = null;
1685-
else if (change.IsConflict && isUnstaged)
1683+
else if (change.IsConflicted)
16861684
DetailContext = new Conflict(_repo, this, change);
16871685
else
16881686
DetailContext = new DiffContext(_repo.FullPath, new Models.DiffOption(change, isUnstaged), _detailContext as DiffContext);
@@ -1764,14 +1762,17 @@ private bool IsChanged(List<Models.Change> old, List<Models.Change> cur)
17641762
{
17651763
if (old.Count != cur.Count)
17661764
return true;
1767-
1768-
var oldSet = new HashSet<string>();
1765+
1766+
var oldMap = new Dictionary<string, Models.Change>();
17691767
foreach (var c in old)
1770-
oldSet.Add($"{c.Path}\n{c.WorkTree}\n{c.Index}");
1768+
oldMap.Add(c.Path, c);
17711769

17721770
foreach (var c in cur)
17731771
{
1774-
if (!oldSet.Contains($"{c.Path}\n{c.WorkTree}\n{c.Index}"))
1772+
if (!oldMap.TryGetValue(c.Path, out var o))
1773+
return true;
1774+
1775+
if (o.Index != c.Index || o.WorkTree != c.WorkTree)
17751776
return true;
17761777
}
17771778

src/Views/ChangeStatusIcon.cs

Lines changed: 6 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -48,25 +48,16 @@ public class ChangeStatusIcon : Control
4848
EndPoint = new RelativePoint(0, 1, RelativeUnit.Relative),
4949
},
5050
new LinearGradientBrush
51-
{
52-
GradientStops = new GradientStops() { new GradientStop(Color.FromRgb(238, 160, 14), 0), new GradientStop(Color.FromRgb(228, 172, 67), 1) },
53-
StartPoint = new RelativePoint(0, 0, RelativeUnit.Relative),
54-
EndPoint = new RelativePoint(0, 1, RelativeUnit.Relative),
55-
},
56-
new LinearGradientBrush
5751
{
5852
GradientStops = new GradientStops() { new GradientStop(Color.FromRgb(47, 185, 47), 0), new GradientStop(Color.FromRgb(75, 189, 75), 1) },
5953
StartPoint = new RelativePoint(0, 0, RelativeUnit.Relative),
6054
EndPoint = new RelativePoint(0, 1, RelativeUnit.Relative),
6155
},
56+
Brushes.OrangeRed,
6257
];
6358

64-
private static readonly string[] INDICATOR = ["?", "±", "T", "+", "−", "➜", "❏", "U", "★"];
65-
private static readonly string[] TIPS = ["Unknown", "Modified", "Type Changed", "Added", "Deleted", "Renamed", "Copied", "Unmerged", "Untracked"];
66-
67-
private static readonly IBrush BACKGROUND_CONFLICT = Brushes.OrangeRed;
68-
private const string INDICATOR_CONFLICT = "!";
69-
private const string TIP_CONFLICT = "Conflict";
59+
private static readonly string[] INDICATOR = ["?", "±", "T", "+", "−", "➜", "❏", "★", "!"];
60+
private static readonly string[] TIPS = ["Unknown", "Modified", "Type Changed", "Added", "Deleted", "Renamed", "Copied", "Untracked", "Conflict"];
7061

7162
public static readonly StyledProperty<bool> IsUnstagedChangeProperty =
7263
AvaloniaProperty.Register<ChangeStatusIcon, bool>(nameof(IsUnstagedChange));
@@ -97,16 +88,8 @@ public override void Render(DrawingContext context)
9788
string indicator;
9889
if (IsUnstagedChange)
9990
{
100-
if (Change.IsConflict)
101-
{
102-
background = BACKGROUND_CONFLICT;
103-
indicator = INDICATOR_CONFLICT;
104-
}
105-
else
106-
{
107-
background = BACKGROUNDS[(int)Change.WorkTree];
108-
indicator = INDICATOR[(int)Change.WorkTree];
109-
}
91+
background = BACKGROUNDS[(int)Change.WorkTree];
92+
indicator = INDICATOR[(int)Change.WorkTree];
11093
}
11194
else
11295
{
@@ -143,7 +126,7 @@ protected override void OnPropertyChanged(AvaloniaPropertyChangedEventArgs chang
143126
}
144127

145128
if (isUnstaged)
146-
ToolTip.SetTip(this, c.IsConflict ? TIP_CONFLICT : TIPS[(int)c.WorkTree]);
129+
ToolTip.SetTip(this, TIPS[(int)c.WorkTree]);
147130
else
148131
ToolTip.SetTip(this, TIPS[(int)c.Index]);
149132

0 commit comments

Comments
 (0)