refactor: simplify the invocation of external merge/diff tool

Signed-off-by: leo <longshuang@msn.cn>
This commit is contained in:
leo
2025-07-28 14:14:11 +08:00
parent 8ce5455753
commit ab14e818be
13 changed files with 133 additions and 136 deletions

View File

@@ -1,47 +1,36 @@
using System.IO;
namespace SourceGit.Commands
namespace SourceGit.Commands
{
public class DiffTool : Command
{
public DiffTool(string repo, int type, string exec, Models.DiffOption option)
public DiffTool(string repo, Models.DiffOption option)
{
WorkingDirectory = repo;
Context = repo;
_merger = Models.ExternalMerger.Supported.Find(x => x.Type == type);
_exec = exec;
_option = option;
}
public void Open()
{
if (_merger == null)
var tool = Native.OS.GetDiffMergeTool(true);
if (tool == null)
{
App.RaiseException(Context, "Invalid merge tool in preference setting!");
return;
}
if (_merger.Type == 0)
if (string.IsNullOrEmpty(tool.Cmd))
{
Args = $"difftool -g --no-prompt {_option}";
}
else if (File.Exists(_exec))
{
var cmd = $"{_exec.Quoted()} {_merger.DiffCmd}";
Args = $"-c difftool.sourcegit.cmd={cmd.Quoted()} difftool --tool=sourcegit --no-prompt {_option}";
}
else
{
App.RaiseException(Context, $"Can NOT find external diff tool in '{_exec}'!");
return;
var cmd = $"{tool.Exec.Quoted()} {tool.Cmd}";
Args = $"-c difftool.sourcegit.cmd={cmd.Quoted()} difftool --tool=sourcegit --no-prompt {_option}";
}
Exec();
}
private Models.ExternalMerger _merger;
private string _exec;
private Models.DiffOption _option;
}
}

View File

@@ -1,48 +1,38 @@
using System.IO;
using System.Threading.Tasks;
using System.Threading.Tasks;
namespace SourceGit.Commands
{
public class MergeTool : Command
{
public MergeTool(string repo, int type, string exec, string file)
public MergeTool(string repo, string file)
{
WorkingDirectory = repo;
Context = exec;
_merger = Models.ExternalMerger.Supported.Find(x => x.Type == type);
_exec = exec;
Context = repo;
_file = string.IsNullOrEmpty(file) ? string.Empty : file.Quoted();
}
public async Task<bool> OpenAsync()
{
if (_merger == null)
var tool = Native.OS.GetDiffMergeTool(false);
if (tool == null)
{
App.RaiseException(Context, "Invalid merge tool in preference setting!");
return false;
}
if (_merger.Type == 0)
if (string.IsNullOrEmpty(tool.Cmd))
{
Args = $"mergetool {_file}";
}
else if (File.Exists(_exec))
{
var cmd = $"{_exec.Quoted()} {_merger.Cmd}";
Args = $"-c mergetool.sourcegit.cmd={cmd.Quoted()} -c mergetool.writeToTemp=true -c mergetool.keepBackup=false -c mergetool.trustExitCode=true mergetool --tool=sourcegit {_file}";
}
else
{
App.RaiseException(Context, $"Can NOT find external merge tool in '{_exec}'!");
return false;
var cmd = $"{tool.Exec.Quoted()} {tool.Cmd}";
Args = $"-c mergetool.sourcegit.cmd={cmd.Quoted()} -c mergetool.writeToTemp=true -c mergetool.keepBackup=false -c mergetool.trustExitCode=true mergetool --tool=sourcegit {_file}";
}
return await ExecAsync().ConfigureAwait(false);
}
private Models.ExternalMerger _merger;
private string _exec;
private string _file;
}
}

View File

@@ -7,14 +7,13 @@ using Avalonia.Platform;
namespace SourceGit.Models
{
public class ExternalMerger
public class ExternalMerger(string icon, string name, string finder, string mergeCmd, string diffCmd)
{
public int Type { get; set; }
public string Icon { get; set; }
public string Name { get; set; }
public string Exec { get; set; }
public string Cmd { get; set; }
public string DiffCmd { get; set; }
public string Icon { get; } = icon;
public string Name { get; } = name;
public string Finder { get; } = finder;
public string MergeCmd { get; } = mergeCmd;
public string DiffCmd { get; } = diffCmd;
public Bitmap IconImage
{
@@ -32,74 +31,69 @@ namespace SourceGit.Models
if (OperatingSystem.IsWindows())
{
Supported = new List<ExternalMerger>() {
new ExternalMerger(0, "git", "Use Git Settings", "", "", ""),
new ExternalMerger(1, "vscode", "Visual Studio Code", "Code.exe", "-n --wait \"$MERGED\"", "-n --wait --diff \"$LOCAL\" \"$REMOTE\""),
new ExternalMerger(2, "vscode_insiders", "Visual Studio Code - Insiders", "Code - Insiders.exe", "-n --wait \"$MERGED\"", "-n --wait --diff \"$LOCAL\" \"$REMOTE\""),
new ExternalMerger(3, "vs", "Visual Studio", "vsDiffMerge.exe", "\"$REMOTE\" \"$LOCAL\" \"$BASE\" \"$MERGED\" /m", "\"$LOCAL\" \"$REMOTE\""),
new ExternalMerger(4, "tortoise_merge", "Tortoise Merge", "TortoiseMerge.exe;TortoiseGitMerge.exe", "-base:\"$BASE\" -theirs:\"$REMOTE\" -mine:\"$LOCAL\" -merged:\"$MERGED\"", "-base:\"$LOCAL\" -theirs:\"$REMOTE\""),
new ExternalMerger(5, "kdiff3", "KDiff3", "kdiff3.exe", "\"$REMOTE\" -b \"$BASE\" \"$LOCAL\" -o \"$MERGED\"", "\"$LOCAL\" \"$REMOTE\""),
new ExternalMerger(6, "beyond_compare", "Beyond Compare", "BComp.exe", "\"$REMOTE\" \"$LOCAL\" \"$BASE\" \"$MERGED\"", "\"$LOCAL\" \"$REMOTE\""),
new ExternalMerger(7, "win_merge", "WinMerge", "WinMergeU.exe", "\"$MERGED\"", "-u -e -sw \"$LOCAL\" \"$REMOTE\""),
new ExternalMerger(8, "codium", "VSCodium", "VSCodium.exe", "-n --wait \"$MERGED\"", "-n --wait --diff \"$LOCAL\" \"$REMOTE\""),
new ExternalMerger(9, "p4merge", "P4Merge", "p4merge.exe", "-tw 4 \"$BASE\" \"$LOCAL\" \"$REMOTE\" \"$MERGED\"", "-tw 4 \"$LOCAL\" \"$REMOTE\""),
new ExternalMerger(10, "plastic_merge", "Plastic SCM", "mergetool.exe", "-s=\"$REMOTE\" -b=\"$BASE\" -d=\"$LOCAL\" -r=\"$MERGED\" --automatic", "-s=\"$LOCAL\" -d=\"$REMOTE\""),
new ExternalMerger(11, "meld", "Meld", "Meld.exe", "\"$LOCAL\" \"$BASE\" \"$REMOTE\" --output \"$MERGED\"", "\"$LOCAL\" \"$REMOTE\""),
new ExternalMerger(12, "cursor", "Cursor", "Cursor.exe", "-n --wait \"$MERGED\"", "-n --wait --diff \"$LOCAL\" \"$REMOTE\""),
new ExternalMerger("git", "Use Git Settings", "", "", ""),
new ExternalMerger("vscode", "Visual Studio Code", "Code.exe", "-n --wait \"$MERGED\"", "-n --wait --diff \"$LOCAL\" \"$REMOTE\""),
new ExternalMerger("vscode_insiders", "Visual Studio Code - Insiders", "Code - Insiders.exe", "-n --wait \"$MERGED\"", "-n --wait --diff \"$LOCAL\" \"$REMOTE\""),
new ExternalMerger("vs", "Visual Studio", "vsDiffMerge.exe", "\"$REMOTE\" \"$LOCAL\" \"$BASE\" \"$MERGED\" /m", "\"$LOCAL\" \"$REMOTE\""),
new ExternalMerger("tortoise_merge", "Tortoise Merge", "TortoiseMerge.exe;TortoiseGitMerge.exe", "-base:\"$BASE\" -theirs:\"$REMOTE\" -mine:\"$LOCAL\" -merged:\"$MERGED\"", "-base:\"$LOCAL\" -theirs:\"$REMOTE\""),
new ExternalMerger("kdiff3", "KDiff3", "kdiff3.exe", "\"$REMOTE\" -b \"$BASE\" \"$LOCAL\" -o \"$MERGED\"", "\"$LOCAL\" \"$REMOTE\""),
new ExternalMerger("beyond_compare", "Beyond Compare", "BComp.exe", "\"$REMOTE\" \"$LOCAL\" \"$BASE\" \"$MERGED\"", "\"$LOCAL\" \"$REMOTE\""),
new ExternalMerger("win_merge", "WinMerge", "WinMergeU.exe", "\"$MERGED\"", "-u -e -sw \"$LOCAL\" \"$REMOTE\""),
new ExternalMerger("codium", "VSCodium", "VSCodium.exe", "-n --wait \"$MERGED\"", "-n --wait --diff \"$LOCAL\" \"$REMOTE\""),
new ExternalMerger("p4merge", "P4Merge", "p4merge.exe", "-tw 4 \"$BASE\" \"$LOCAL\" \"$REMOTE\" \"$MERGED\"", "-tw 4 \"$LOCAL\" \"$REMOTE\""),
new ExternalMerger("plastic_merge", "Plastic SCM", "mergetool.exe", "-s=\"$REMOTE\" -b=\"$BASE\" -d=\"$LOCAL\" -r=\"$MERGED\" --automatic", "-s=\"$LOCAL\" -d=\"$REMOTE\""),
new ExternalMerger("meld", "Meld", "Meld.exe", "\"$LOCAL\" \"$BASE\" \"$REMOTE\" --output \"$MERGED\"", "\"$LOCAL\" \"$REMOTE\""),
new ExternalMerger("cursor", "Cursor", "Cursor.exe", "-n --wait \"$MERGED\"", "-n --wait --diff \"$LOCAL\" \"$REMOTE\""),
};
}
else if (OperatingSystem.IsMacOS())
{
Supported = new List<ExternalMerger>() {
new ExternalMerger(0, "git", "Use Git Settings", "", "", ""),
new ExternalMerger(1, "xcode", "FileMerge", "/usr/bin/opendiff", "\"$BASE\" \"$LOCAL\" \"$REMOTE\" -ancestor \"$MERGED\"", "\"$LOCAL\" \"$REMOTE\""),
new ExternalMerger(2, "vscode", "Visual Studio Code", "/Applications/Visual Studio Code.app/Contents/Resources/app/bin/code", "-n --wait \"$MERGED\"", "-n --wait --diff \"$LOCAL\" \"$REMOTE\""),
new ExternalMerger(3, "vscode_insiders", "Visual Studio Code - Insiders", "/Applications/Visual Studio Code - Insiders.app/Contents/Resources/app/bin/code", "-n --wait \"$MERGED\"", "-n --wait --diff \"$LOCAL\" \"$REMOTE\""),
new ExternalMerger(4, "kdiff3", "KDiff3", "/Applications/kdiff3.app/Contents/MacOS/kdiff3", "\"$REMOTE\" -b \"$BASE\" \"$LOCAL\" -o \"$MERGED\"", "\"$LOCAL\" \"$REMOTE\""),
new ExternalMerger(5, "beyond_compare", "Beyond Compare", "/Applications/Beyond Compare.app/Contents/MacOS/bcomp", "\"$REMOTE\" \"$LOCAL\" \"$BASE\" \"$MERGED\"", "\"$LOCAL\" \"$REMOTE\""),
new ExternalMerger(6, "codium", "VSCodium", "/Applications/VSCodium.app/Contents/Resources/app/bin/codium", "-n --wait \"$MERGED\"", "-n --wait --diff \"$LOCAL\" \"$REMOTE\""),
new ExternalMerger(7, "p4merge", "P4Merge", "/Applications/p4merge.app/Contents/Resources/launchp4merge", "-tw 4 \"$BASE\" \"$LOCAL\" \"$REMOTE\" \"$MERGED\"", "-tw 4 \"$LOCAL\" \"$REMOTE\""),
new ExternalMerger(8, "cursor", "Cursor", "/Applications/Cursor.app/Contents/Resources/app/bin/cursor", "-n --wait \"$MERGED\"", "-n --wait --diff \"$LOCAL\" \"$REMOTE\""),
new ExternalMerger("git", "Use Git Settings", "", "", ""),
new ExternalMerger("xcode", "FileMerge", "/usr/bin/opendiff", "\"$BASE\" \"$LOCAL\" \"$REMOTE\" -ancestor \"$MERGED\"", "\"$LOCAL\" \"$REMOTE\""),
new ExternalMerger("vscode", "Visual Studio Code", "/Applications/Visual Studio Code.app/Contents/Resources/app/bin/code", "-n --wait \"$MERGED\"", "-n --wait --diff \"$LOCAL\" \"$REMOTE\""),
new ExternalMerger("vscode_insiders", "Visual Studio Code - Insiders", "/Applications/Visual Studio Code - Insiders.app/Contents/Resources/app/bin/code", "-n --wait \"$MERGED\"", "-n --wait --diff \"$LOCAL\" \"$REMOTE\""),
new ExternalMerger("kdiff3", "KDiff3", "/Applications/kdiff3.app/Contents/MacOS/kdiff3", "\"$REMOTE\" -b \"$BASE\" \"$LOCAL\" -o \"$MERGED\"", "\"$LOCAL\" \"$REMOTE\""),
new ExternalMerger("beyond_compare", "Beyond Compare", "/Applications/Beyond Compare.app/Contents/MacOS/bcomp", "\"$REMOTE\" \"$LOCAL\" \"$BASE\" \"$MERGED\"", "\"$LOCAL\" \"$REMOTE\""),
new ExternalMerger("codium", "VSCodium", "/Applications/VSCodium.app/Contents/Resources/app/bin/codium", "-n --wait \"$MERGED\"", "-n --wait --diff \"$LOCAL\" \"$REMOTE\""),
new ExternalMerger("p4merge", "P4Merge", "/Applications/p4merge.app/Contents/Resources/launchp4merge", "-tw 4 \"$BASE\" \"$LOCAL\" \"$REMOTE\" \"$MERGED\"", "-tw 4 \"$LOCAL\" \"$REMOTE\""),
new ExternalMerger("cursor", "Cursor", "/Applications/Cursor.app/Contents/Resources/app/bin/cursor", "-n --wait \"$MERGED\"", "-n --wait --diff \"$LOCAL\" \"$REMOTE\""),
};
}
else if (OperatingSystem.IsLinux())
{
Supported = new List<ExternalMerger>() {
new ExternalMerger(0, "git", "Use Git Settings", "", "", ""),
new ExternalMerger(1, "vscode", "Visual Studio Code", "/usr/share/code/code", "-n --wait \"$MERGED\"", "-n --wait --diff \"$LOCAL\" \"$REMOTE\""),
new ExternalMerger(2, "vscode_insiders", "Visual Studio Code - Insiders", "/usr/share/code-insiders/code-insiders", "-n --wait \"$MERGED\"", "-n --wait --diff \"$LOCAL\" \"$REMOTE\""),
new ExternalMerger(3, "kdiff3", "KDiff3", "/usr/bin/kdiff3", "\"$REMOTE\" -b \"$BASE\" \"$LOCAL\" -o \"$MERGED\"", "\"$LOCAL\" \"$REMOTE\""),
new ExternalMerger(4, "beyond_compare", "Beyond Compare", "/usr/bin/bcomp", "\"$REMOTE\" \"$LOCAL\" \"$BASE\" \"$MERGED\"", "\"$LOCAL\" \"$REMOTE\""),
new ExternalMerger(5, "meld", "Meld", "/usr/bin/meld", "\"$LOCAL\" \"$BASE\" \"$REMOTE\" --output \"$MERGED\"", "\"$LOCAL\" \"$REMOTE\""),
new ExternalMerger(6, "codium", "VSCodium", "/usr/share/codium/bin/codium", "-n --wait \"$MERGED\"", "-n --wait --diff \"$LOCAL\" \"$REMOTE\""),
new ExternalMerger(7, "p4merge", "P4Merge", "/usr/local/bin/p4merge", "-tw 4 \"$BASE\" \"$LOCAL\" \"$REMOTE\" \"$MERGED\"", "-tw 4 \"$LOCAL\" \"$REMOTE\""),
new ExternalMerger(8, "cursor", "Cursor", "cursor", "-n --wait \"$MERGED\"", "-n --wait --diff \"$LOCAL\" \"$REMOTE\""),
new ExternalMerger("git", "Use Git Settings", "", "", ""),
new ExternalMerger("vscode", "Visual Studio Code", "/usr/share/code/code", "-n --wait \"$MERGED\"", "-n --wait --diff \"$LOCAL\" \"$REMOTE\""),
new ExternalMerger("vscode_insiders", "Visual Studio Code - Insiders", "/usr/share/code-insiders/code-insiders", "-n --wait \"$MERGED\"", "-n --wait --diff \"$LOCAL\" \"$REMOTE\""),
new ExternalMerger("kdiff3", "KDiff3", "/usr/bin/kdiff3", "\"$REMOTE\" -b \"$BASE\" \"$LOCAL\" -o \"$MERGED\"", "\"$LOCAL\" \"$REMOTE\""),
new ExternalMerger("beyond_compare", "Beyond Compare", "/usr/bin/bcomp", "\"$REMOTE\" \"$LOCAL\" \"$BASE\" \"$MERGED\"", "\"$LOCAL\" \"$REMOTE\""),
new ExternalMerger("meld", "Meld", "/usr/bin/meld", "\"$LOCAL\" \"$BASE\" \"$REMOTE\" --output \"$MERGED\"", "\"$LOCAL\" \"$REMOTE\""),
new ExternalMerger("codium", "VSCodium", "/usr/share/codium/bin/codium", "-n --wait \"$MERGED\"", "-n --wait --diff \"$LOCAL\" \"$REMOTE\""),
new ExternalMerger("p4merge", "P4Merge", "/usr/local/bin/p4merge", "-tw 4 \"$BASE\" \"$LOCAL\" \"$REMOTE\" \"$MERGED\"", "-tw 4 \"$LOCAL\" \"$REMOTE\""),
new ExternalMerger("cursor", "Cursor", "cursor", "-n --wait \"$MERGED\"", "-n --wait --diff \"$LOCAL\" \"$REMOTE\""),
};
}
else
{
Supported = new List<ExternalMerger>() {
new ExternalMerger(0, "git", "Use Git Settings", "", "", ""),
new ExternalMerger("git", "Use Git Settings", "", "", ""),
};
}
}
public ExternalMerger(int type, string icon, string name, string exec, string cmd, string diffCmd)
{
Type = type;
Icon = icon;
Name = name;
Exec = exec;
Cmd = cmd;
DiffCmd = diffCmd;
}
public string[] GetPatterns()
public string[] GetPatternsToFindExecFile()
{
if (OperatingSystem.IsWindows())
return Exec.Split(';');
return Finder.Split(';', StringSplitOptions.RemoveEmptyEntries);
var choices = Exec.Split(';', StringSplitOptions.RemoveEmptyEntries);
return Array.ConvertAll(choices, Path.GetFileName);
return [Path.GetFileName(Finder)];
}
}
public class DiffMergeTool(string exec, string cmd)
{
public string Exec { get; } = exec;
public string Cmd { get; } = cmd;
}
}

View File

@@ -12,13 +12,14 @@ namespace SourceGit.Models
{
public class ExternalTool
{
public string Name { get; private set; }
public Bitmap IconImage { get; private set; } = null;
public string Name { get; }
public string ExecFile { get; }
public Bitmap IconImage { get; }
public ExternalTool(string name, string icon, string execFile, Func<string, string> execArgsGenerator = null)
{
Name = name;
_execFile = execFile;
ExecFile = execFile;
_execArgsGenerator = execArgsGenerator ?? (repo => repo.Quoted());
try
@@ -38,13 +39,12 @@ namespace SourceGit.Models
Process.Start(new ProcessStartInfo()
{
WorkingDirectory = repo,
FileName = _execFile,
FileName = ExecFile,
Arguments = _execArgsGenerator.Invoke(repo),
UseShellExecute = false,
});
}
private string _execFile = string.Empty;
private Func<string, string> _execArgsGenerator = null;
}

View File

@@ -76,6 +76,18 @@ namespace SourceGit.Native
set;
} = [];
public static int ExternalMergerType
{
get;
set;
} = 0;
public static string ExternalMergerExecFile
{
get;
set;
} = string.Empty;
public static bool UseSystemWindowFrame
{
get => OperatingSystem.IsLinux() && _enableSystemWindowFrame;
@@ -158,6 +170,33 @@ namespace SourceGit.Native
ShellOrTerminal = _backend.FindTerminal(shell);
}
public static Models.DiffMergeTool GetDiffMergeTool(bool onlyDiff)
{
if (ExternalMergerType < 0 || ExternalMergerType >= Models.ExternalMerger.Supported.Count)
return null;
if (ExternalMergerType != 0 && (string.IsNullOrEmpty(ExternalMergerExecFile) || !File.Exists(ExternalMergerExecFile)))
return null;
var tool = Models.ExternalMerger.Supported[ExternalMergerType];
return new Models.DiffMergeTool(ExternalMergerExecFile, onlyDiff ? tool.DiffCmd : tool.MergeCmd);
}
public static void AutoSelectExternalMergeToolExecFile()
{
if (ExternalMergerType >= 0 && ExternalMergerType < Models.ExternalMerger.Supported.Count)
{
var merger = Models.ExternalMerger.Supported[ExternalMergerType];
var externalTool = ExternalTools.Find(x => x.Name.Equals(merger.Name, StringComparison.Ordinal));
if (externalTool != null)
ExternalMergerExecFile = externalTool.ExecFile;
else if (!OperatingSystem.IsWindows() && File.Exists(merger.Finder))
ExternalMergerExecFile = merger.Finder;
else
ExternalMergerExecFile = string.Empty;
}
}
public static void OpenInFileManager(string path, bool select = false)
{
_backend.OpenInFileManager(path, select);

View File

@@ -207,10 +207,7 @@ namespace SourceGit.ViewModels
public void OpenChangeInMergeTool(Models.Change c)
{
var toolType = Preferences.Instance.ExternalMergeToolType;
var toolPath = Preferences.Instance.ExternalMergeToolPath;
var opt = new Models.DiffOption(_commit, c);
new Commands.DiffTool(_repo.FullPath, toolType, toolPath, opt).Open();
new Commands.DiffTool(_repo.FullPath, new Models.DiffOption(_commit, c)).Open();
}
public async Task SaveChangesAsPatchAsync(List<Models.Change> changes, string saveTo)

View File

@@ -95,9 +95,7 @@ namespace SourceGit.ViewModels
public void OpenExternalMergeTool()
{
var toolType = Preferences.Instance.ExternalMergeToolType;
var toolPath = Preferences.Instance.ExternalMergeToolPath;
new Commands.DiffTool(_repo, toolType, toolPath, _option).Open();
new Commands.DiffTool(_repo, _option).Open();
}
private void LoadDiffContent()

View File

@@ -356,25 +356,34 @@ namespace SourceGit.ViewModels
public int ExternalMergeToolType
{
get => _externalMergeToolType;
get => Native.OS.ExternalMergerType;
set
{
var changed = SetProperty(ref _externalMergeToolType, value);
if (changed && !OperatingSystem.IsWindows() && value > 0 && value < Models.ExternalMerger.Supported.Count)
if (Native.OS.ExternalMergerType != value)
{
var tool = Models.ExternalMerger.Supported[value];
if (File.Exists(tool.Exec))
ExternalMergeToolPath = tool.Exec;
else
ExternalMergeToolPath = string.Empty;
Native.OS.ExternalMergerType = value;
OnPropertyChanged();
if (!_isLoading)
{
Native.OS.AutoSelectExternalMergeToolExecFile();
OnPropertyChanged(nameof(ExternalMergeToolPath));
}
}
}
}
public string ExternalMergeToolPath
{
get => _externalMergeToolPath;
set => SetProperty(ref _externalMergeToolPath, value);
get => Native.OS.ExternalMergerExecFile;
set
{
if (!Native.OS.ExternalMergerExecFile.Equals(value, StringComparison.Ordinal))
{
Native.OS.ExternalMergerExecFile = value;
OnPropertyChanged();
}
}
}
public uint StatisticsSampleColor
@@ -716,11 +725,7 @@ namespace SourceGit.ViewModels
private Models.ChangeViewMode _stashChangeViewMode = Models.ChangeViewMode.List;
private string _gitDefaultCloneDir = string.Empty;
private int _shellOrTerminal = -1;
private int _externalMergeToolType = 0;
private string _externalMergeToolPath = string.Empty;
private uint _statisticsSampleColor = 0xFF00FF00;
}
}

View File

@@ -100,9 +100,7 @@ namespace SourceGit.ViewModels
public void OpenChangeWithExternalDiffTool(Models.Change change)
{
var opt = new Models.DiffOption(GetSHA(_startPoint), GetSHA(_endPoint), change);
var toolType = Preferences.Instance.ExternalMergeToolType;
var toolPath = Preferences.Instance.ExternalMergeToolPath;
new Commands.DiffTool(_repo, toolType, toolPath, opt).Open();
new Commands.DiffTool(_repo, opt).Open();
}
public void NavigateTo(string commitSHA)

View File

@@ -193,9 +193,7 @@ namespace SourceGit.ViewModels
else
opt = new Models.DiffOption(_selectedStash.Parents[0], _selectedStash.SHA, change);
var toolType = Preferences.Instance.ExternalMergeToolType;
var toolPath = Preferences.Instance.ExternalMergeToolPath;
new Commands.DiffTool(_repo.FullPath, toolType, toolPath, opt).Open();
new Commands.DiffTool(_repo.FullPath, opt).Open();
}
public async Task CheckoutSingleFileAsync(Models.Change change)

View File

@@ -531,18 +531,12 @@ namespace SourceGit.ViewModels
public async Task<bool> UseExternalMergeToolAsync(Models.Change change)
{
var toolType = Preferences.Instance.ExternalMergeToolType;
var toolPath = Preferences.Instance.ExternalMergeToolPath;
var file = change?.Path;
return await new Commands.MergeTool(_repo.FullPath, toolType, toolPath, file).OpenAsync();
return await new Commands.MergeTool(_repo.FullPath, change?.Path).OpenAsync();
}
public void UseExternalDiffTool(Models.Change change, bool isUnstaged)
{
var toolType = Preferences.Instance.ExternalMergeToolType;
var toolPath = Preferences.Instance.ExternalMergeToolPath;
var opt = new Models.DiffOption(change, isUnstaged);
new Commands.DiffTool(_repo.FullPath, toolType, toolPath, opt).Open();
new Commands.DiffTool(_repo.FullPath, new Models.DiffOption(change, isUnstaged)).Open();
}
public async Task ContinueMergeAsync()

View File

@@ -28,12 +28,7 @@ namespace SourceGit.Views
openWithMerger.Tag = OperatingSystem.IsMacOS() ? "⌘+⇧+D" : "Ctrl+Shift+D";
openWithMerger.Click += (_, ev) =>
{
var pref = ViewModels.Preferences.Instance;
var toolType = pref.ExternalMergeToolType;
var toolPath = pref.ExternalMergeToolPath;
var opt = new Models.DiffOption(vm.Base.Head, vm.To.Head, change);
new Commands.DiffTool(repo, toolType, toolPath, opt).Open();
new Commands.DiffTool(repo, new Models.DiffOption(vm.Base.Head, vm.To.Head, change)).Open();
ev.Handled = true;
};
menu.Items.Add(openWithMerger);

View File

@@ -349,7 +349,7 @@ namespace SourceGit.Views
var tool = Models.ExternalMerger.Supported[type];
var options = new FilePickerOpenOptions()
{
FileTypeFilter = [new FilePickerFileType(tool.Name) { Patterns = tool.GetPatterns() }],
FileTypeFilter = [new FilePickerFileType(tool.Name) { Patterns = tool.GetPatternsToFindExecFile() }],
AllowMultiple = false,
};