feature: test if conflicts have been resolved manually (#96)

This commit is contained in:
leo 2024-04-29 10:54:29 +08:00
parent df66bacbd2
commit 84568e573a
5 changed files with 74 additions and 27 deletions

View file

@ -12,9 +12,27 @@ using CommunityToolkit.Mvvm.ComponentModel;
namespace SourceGit.ViewModels
{
public class ConflictContext
public class ConflictContext : ObservableObject
{
public Models.Change Change { get; set; }
public bool IsResolved
{
get => _isResolved;
set => SetProperty(ref _isResolved, value);
}
public ConflictContext(string repo, Models.Change change)
{
Task.Run(() =>
{
var result = new Commands.IsConflictResolved(repo, change).Result();
Dispatcher.UIThread.Post(() =>
{
IsResolved = result;
});
});
}
private bool _isResolved = false;
}
public class WorkingCopy : ObservableObject
@ -296,9 +314,9 @@ namespace SourceGit.ViewModels
{
DetailContext = null;
}
else if (change.IsConflit)
else if (change.IsConflit && isUnstaged)
{
DetailContext = new ConflictContext() { Change = change };
DetailContext = new ConflictContext(_repo.FullPath, change);
}
else
{
@ -432,26 +450,23 @@ namespace SourceGit.ViewModels
_repo.SetWatcherEnabled(true);
}
public async void UseExternalMergeTool()
public async void UseExternalMergeTool(Models.Change change)
{
if (_detailContext is ConflictContext ctx)
var type = Preference.Instance.ExternalMergeToolType;
var exec = Preference.Instance.ExternalMergeToolPath;
var tool = Models.ExternalMerger.Supported.Find(x => x.Type == type);
if (tool == null)
{
var type = Preference.Instance.ExternalMergeToolType;
var exec = Preference.Instance.ExternalMergeToolPath;
var tool = Models.ExternalMerger.Supported.Find(x => x.Type == type);
if (tool == null)
{
App.RaiseException(_repo.FullPath, "Invalid merge tool in preference setting!");
return;
}
var args = tool.Type != 0 ? tool.Cmd : Preference.Instance.ExternalMergeToolCmd;
_repo.SetWatcherEnabled(false);
await Task.Run(() => Commands.MergeTool.OpenForMerge(_repo.FullPath, exec, args, ctx.Change.Path));
_repo.SetWatcherEnabled(true);
App.RaiseException(_repo.FullPath, "Invalid merge tool in preference setting!");
return;
}
var args = tool.Type != 0 ? tool.Cmd : Preference.Instance.ExternalMergeToolCmd;
_repo.SetWatcherEnabled(false);
await Task.Run(() => Commands.MergeTool.OpenForMerge(_repo.FullPath, exec, args, change.Path));
_repo.SetWatcherEnabled(true);
}
public async void DoCommit(bool autoPush)
@ -554,7 +569,7 @@ namespace SourceGit.ViewModels
openMerger.Header = App.Text("FileCM.OpenWithExternalMerger");
openMerger.Click += (_, e) =>
{
UseExternalMergeTool();
UseExternalMergeTool(change);
e.Handled = true;
};