Skip to content

Commit 84568e5

Browse files
committed
feature: test if conflicts have been resolved manually (#96)
1 parent df66bac commit 84568e5

File tree

5 files changed

+73
-26
lines changed

5 files changed

+73
-26
lines changed

src/Commands/IsConflictResolved.cs

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
namespace SourceGit.Commands
2+
{
3+
public class IsConflictResolved : Command
4+
{
5+
public IsConflictResolved(string repo, Models.Change change)
6+
{
7+
var opt = new Models.DiffOption(change, true);
8+
9+
WorkingDirectory = repo;
10+
Context = repo;
11+
Args = $"diff -a --ignore-cr-at-eol --check {opt}";
12+
}
13+
14+
public bool Result()
15+
{
16+
var rs = ReadToEnd();
17+
return rs.IsSuccess;
18+
}
19+
}
20+
}

src/Resources/Locales/en_US.axaml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -427,11 +427,13 @@
427427
<x:String x:Key="Text.Welcome.Sort" xml:space="preserve">Sort</x:String>
428428
<x:String x:Key="Text.WorkingCopy" xml:space="preserve">Changes</x:String>
429429
<x:String x:Key="Text.WorkingCopy.Amend" xml:space="preserve">Amend</x:String>
430+
<x:String x:Key="Text.WorkingCopy.CanStageTip" xml:space="preserve">You can stage this file now.</x:String>
430431
<x:String x:Key="Text.WorkingCopy.Commit" xml:space="preserve">COMMIT</x:String>
431432
<x:String x:Key="Text.WorkingCopy.CommitAndPush" xml:space="preserve">COMMIT &amp; PUSH</x:String>
432433
<x:String x:Key="Text.WorkingCopy.CommitMessageTip" xml:space="preserve">Enter commit message</x:String>
433434
<x:String x:Key="Text.WorkingCopy.CommitTip" xml:space="preserve">CTRL + Enter</x:String>
434435
<x:String x:Key="Text.WorkingCopy.Conflicts" xml:space="preserve">CONFLICTS DETECTED</x:String>
436+
<x:String x:Key="Text.WorkingCopy.Conflicts.Resolved" xml:space="preserve">FILE CONFLICTS ARE RESOLVED</x:String>
435437
<x:String x:Key="Text.WorkingCopy.HasCommitHistories" xml:space="preserve">RECENT INPUT MESSAGES</x:String>
436438
<x:String x:Key="Text.WorkingCopy.IncludeUntracked" xml:space="preserve">INCLUDE UNTRACKED FILES</x:String>
437439
<x:String x:Key="Text.WorkingCopy.MessageHistories" xml:space="preserve">MESSAGE HISTORIES</x:String>

src/Resources/Locales/zh_CN.axaml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -427,11 +427,13 @@
427427
<x:String x:Key="Text.Welcome.Sort" xml:space="preserve">排序</x:String>
428428
<x:String x:Key="Text.WorkingCopy" xml:space="preserve">本地更改</x:String>
429429
<x:String x:Key="Text.WorkingCopy.Amend" xml:space="preserve">修补(--amend)</x:String>
430+
<x:String x:Key="Text.WorkingCopy.CanStageTip" xml:space="preserve">现在您已可将其加入暂存区中</x:String>
430431
<x:String x:Key="Text.WorkingCopy.Commit" xml:space="preserve">提交</x:String>
431432
<x:String x:Key="Text.WorkingCopy.CommitAndPush" xml:space="preserve">提交并推送</x:String>
432433
<x:String x:Key="Text.WorkingCopy.CommitMessageTip" xml:space="preserve">填写提交信息</x:String>
433434
<x:String x:Key="Text.WorkingCopy.CommitTip" xml:space="preserve">CTRL + Enter</x:String>
434435
<x:String x:Key="Text.WorkingCopy.Conflicts" xml:space="preserve">检测到冲突</x:String>
436+
<x:String x:Key="Text.WorkingCopy.Conflicts.Resolved" xml:space="preserve">文件冲突已解决</x:String>
435437
<x:String x:Key="Text.WorkingCopy.HasCommitHistories" xml:space="preserve">最近输入的提交信息</x:String>
436438
<x:String x:Key="Text.WorkingCopy.IncludeUntracked" xml:space="preserve">显示未跟踪文件</x:String>
437439
<x:String x:Key="Text.WorkingCopy.MessageHistories" xml:space="preserve">历史提交信息</x:String>

src/ViewModels/WorkingCopy.cs

Lines changed: 36 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,27 @@
1212

1313
namespace SourceGit.ViewModels
1414
{
15-
public class ConflictContext
15+
public class ConflictContext : ObservableObject
1616
{
17-
public Models.Change Change { get; set; }
17+
public bool IsResolved
18+
{
19+
get => _isResolved;
20+
set => SetProperty(ref _isResolved, value);
21+
}
22+
23+
public ConflictContext(string repo, Models.Change change)
24+
{
25+
Task.Run(() =>
26+
{
27+
var result = new Commands.IsConflictResolved(repo, change).Result();
28+
Dispatcher.UIThread.Post(() =>
29+
{
30+
IsResolved = result;
31+
});
32+
});
33+
}
34+
35+
private bool _isResolved = false;
1836
}
1937

2038
public class WorkingCopy : ObservableObject
@@ -296,9 +314,9 @@ public void SetDetail(Models.Change change, bool isUnstaged)
296314
{
297315
DetailContext = null;
298316
}
299-
else if (change.IsConflit)
317+
else if (change.IsConflit && isUnstaged)
300318
{
301-
DetailContext = new ConflictContext() { Change = change };
319+
DetailContext = new ConflictContext(_repo.FullPath, change);
302320
}
303321
else
304322
{
@@ -432,26 +450,23 @@ public async void UseMine(List<Models.Change> changes)
432450
_repo.SetWatcherEnabled(true);
433451
}
434452

435-
public async void UseExternalMergeTool()
453+
public async void UseExternalMergeTool(Models.Change change)
436454
{
437-
if (_detailContext is ConflictContext ctx)
438-
{
439-
var type = Preference.Instance.ExternalMergeToolType;
440-
var exec = Preference.Instance.ExternalMergeToolPath;
455+
var type = Preference.Instance.ExternalMergeToolType;
456+
var exec = Preference.Instance.ExternalMergeToolPath;
441457

442-
var tool = Models.ExternalMerger.Supported.Find(x => x.Type == type);
443-
if (tool == null)
444-
{
445-
App.RaiseException(_repo.FullPath, "Invalid merge tool in preference setting!");
446-
return;
447-
}
458+
var tool = Models.ExternalMerger.Supported.Find(x => x.Type == type);
459+
if (tool == null)
460+
{
461+
App.RaiseException(_repo.FullPath, "Invalid merge tool in preference setting!");
462+
return;
463+
}
448464

449-
var args = tool.Type != 0 ? tool.Cmd : Preference.Instance.ExternalMergeToolCmd;
465+
var args = tool.Type != 0 ? tool.Cmd : Preference.Instance.ExternalMergeToolCmd;
450466

451-
_repo.SetWatcherEnabled(false);
452-
await Task.Run(() => Commands.MergeTool.OpenForMerge(_repo.FullPath, exec, args, ctx.Change.Path));
453-
_repo.SetWatcherEnabled(true);
454-
}
467+
_repo.SetWatcherEnabled(false);
468+
await Task.Run(() => Commands.MergeTool.OpenForMerge(_repo.FullPath, exec, args, change.Path));
469+
_repo.SetWatcherEnabled(true);
455470
}
456471

457472
public async void DoCommit(bool autoPush)
@@ -554,7 +569,7 @@ public ContextMenu CreateContextMenuForUnstagedChanges(List<Models.Change> chang
554569
openMerger.Header = App.Text("FileCM.OpenWithExternalMerger");
555570
openMerger.Click += (_, e) =>
556571
{
557-
UseExternalMergeTool();
572+
UseExternalMergeTool(change);
558573
e.Handled = true;
559574
};
560575

src/Views/WorkingCopy.axaml

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -319,11 +319,19 @@
319319
<ContentControl.DataTemplates>
320320
<DataTemplate DataType="vm:ConflictContext">
321321
<Border Background="{DynamicResource Brush.Window}" BorderThickness="1" BorderBrush="{DynamicResource Brush.Border2}">
322-
<StackPanel Orientation="Vertical" HorizontalAlignment="Center" VerticalAlignment="Center">
323-
<Path Width="64" Height="64" Data="{StaticResource Icons.Conflict}" Fill="{DynamicResource Brush.FG2}"/>
324-
<TextBlock Margin="0,16,0,8" FontSize="20" FontWeight="Bold" Text="{DynamicResource Text.WorkingCopy.Conflicts}" Foreground="{DynamicResource Brush.FG2}" HorizontalAlignment="Center"/>
325-
<TextBlock Text="{DynamicResource Text.WorkingCopy.ResolveTip}" Foreground="{DynamicResource Brush.FG2}" HorizontalAlignment="Center"/>
326-
</StackPanel>
322+
<Grid HorizontalAlignment="Center" VerticalAlignment="Center">
323+
<StackPanel Orientation="Vertical" IsVisible="{Binding !IsResolved}">
324+
<Path Width="64" Height="64" Data="{StaticResource Icons.Conflict}" Fill="{DynamicResource Brush.FG2}"/>
325+
<TextBlock Margin="0,16,0,8" FontSize="20" FontWeight="Bold" Text="{DynamicResource Text.WorkingCopy.Conflicts}" Foreground="{DynamicResource Brush.FG2}" HorizontalAlignment="Center"/>
326+
<TextBlock Text="{DynamicResource Text.WorkingCopy.ResolveTip}" Foreground="{DynamicResource Brush.FG2}" HorizontalAlignment="Center"/>
327+
</StackPanel>
328+
329+
<StackPanel Orientation="Vertical" IsVisible="{Binding IsResolved}">
330+
<Path Width="64" Height="64" Data="{StaticResource Icons.Check}" Fill="Green"/>
331+
<TextBlock Margin="0,16,0,8" FontSize="20" FontWeight="Bold" Text="{DynamicResource Text.WorkingCopy.Conflicts.Resolved}" Foreground="{DynamicResource Brush.FG2}" HorizontalAlignment="Center"/>
332+
<TextBlock Text="{DynamicResource Text.WorkingCopy.CanStageTip}" Foreground="{DynamicResource Brush.FG2}" HorizontalAlignment="Center"/>
333+
</StackPanel>
334+
</Grid>
327335
</Border>
328336
</DataTemplate>
329337

0 commit comments

Comments
 (0)