diff --git a/src/Resources/Locales/en_US.axaml b/src/Resources/Locales/en_US.axaml
index fdd0b8aa..688ffa5c 100644
--- a/src/Resources/Locales/en_US.axaml
+++ b/src/Resources/Locales/en_US.axaml
@@ -853,6 +853,7 @@
OK
TAGGER
TIME
+ Compare with HEAD
Message
Name
Tagger
diff --git a/src/Resources/Locales/zh_CN.axaml b/src/Resources/Locales/zh_CN.axaml
index 148369dc..172618a2 100644
--- a/src/Resources/Locales/zh_CN.axaml
+++ b/src/Resources/Locales/zh_CN.axaml
@@ -857,6 +857,7 @@
确 定
创建者
创建时间
+ 与当前 HEAD 比较
标签信息
标签名
创建者
diff --git a/src/Resources/Locales/zh_TW.axaml b/src/Resources/Locales/zh_TW.axaml
index 4e300af3..59497d6f 100644
--- a/src/Resources/Locales/zh_TW.axaml
+++ b/src/Resources/Locales/zh_TW.axaml
@@ -857,6 +857,7 @@
確 定
建立者
建立時間
+ 與目前 HEAD 比較
標籤訊息
標籤名稱
建立者
diff --git a/src/ViewModels/BranchCompare.cs b/src/ViewModels/BranchCompare.cs
index 7c6a484d..d2d0affd 100644
--- a/src/ViewModels/BranchCompare.cs
+++ b/src/ViewModels/BranchCompare.cs
@@ -8,27 +8,22 @@ namespace SourceGit.ViewModels
{
public class BranchCompare : ObservableObject
{
- public string RepositoryPath
- {
- get => _repo;
- }
-
public bool IsLoading
{
get => _isLoading;
private set => SetProperty(ref _isLoading, value);
}
- public Models.Branch Base
+ public string BaseName
{
- get => _based;
- private set => SetProperty(ref _based, value);
+ get => _baseName;
+ private set => SetProperty(ref _baseName, value);
}
- public Models.Branch To
+ public string ToName
{
- get => _to;
- private set => SetProperty(ref _to, value);
+ get => _toName;
+ private set => SetProperty(ref _toName, value);
}
public Models.Commit BaseHead
@@ -63,7 +58,7 @@ namespace SourceGit.ViewModels
if (SetProperty(ref _selectedChanges, value))
{
if (value is { Count: 1 })
- DiffContext = new DiffContext(_repo, new Models.DiffOption(_based.Head, _to.Head, value[0]), _diffContext);
+ DiffContext = new DiffContext(_repo, new Models.DiffOption(_based, _to, value[0]), _diffContext);
else
DiffContext = null;
}
@@ -86,11 +81,13 @@ namespace SourceGit.ViewModels
private set => SetProperty(ref _diffContext, value);
}
- public BranchCompare(string repo, Models.Branch baseBranch, Models.Branch toBranch)
+ public BranchCompare(string repo, object based, object to)
{
_repo = repo;
- _based = baseBranch;
- _to = toBranch;
+ _based = GetSHA(based);
+ _to = GetSHA(to);
+ _baseName = GetName(based);
+ _toName = GetName(to);
Refresh();
}
@@ -113,10 +110,8 @@ namespace SourceGit.ViewModels
public void Swap()
{
- (Base, To) = (_to, _based);
-
- VisibleChanges = [];
- SelectedChanges = [];
+ (_based, _to) = (_to, _based);
+ (BaseName, ToName) = (_toName, _baseName);
if (_baseHead != null)
(BaseHead, ToHead) = (_toHead, _baseHead);
@@ -134,9 +129,14 @@ namespace SourceGit.ViewModels
return Native.OS.GetAbsPath(_repo, path);
}
+ public void OpenInExternalDiffTool(Models.Change change)
+ {
+ new Commands.DiffTool(_repo, new Models.DiffOption(_based, _to, change)).Open();
+ }
+
public async Task SaveChangesAsPatchAsync(List changes, string saveTo)
{
- var succ = await Commands.SaveChangesAsPatch.ProcessRevisionCompareChangesAsync(_repo, changes, _based.Head, _to.Head, saveTo);
+ var succ = await Commands.SaveChangesAsPatch.ProcessRevisionCompareChangesAsync(_repo, changes, _based, _to, saveTo);
if (succ)
App.SendNotification(_repo, App.Text("SaveAsPatchSuccess"));
}
@@ -144,16 +144,18 @@ namespace SourceGit.ViewModels
private void Refresh()
{
IsLoading = true;
+ VisibleChanges = [];
+ SelectedChanges = [];
Task.Run(async () =>
{
if (_baseHead == null)
{
- var baseHead = await new Commands.QuerySingleCommit(_repo, _based.Head)
+ var baseHead = await new Commands.QuerySingleCommit(_repo, _based)
.GetResultAsync()
.ConfigureAwait(false);
- var toHead = await new Commands.QuerySingleCommit(_repo, _to.Head)
+ var toHead = await new Commands.QuerySingleCommit(_repo, _to)
.GetResultAsync()
.ConfigureAwait(false);
@@ -164,7 +166,7 @@ namespace SourceGit.ViewModels
});
}
- _changes = await new Commands.CompareRevisions(_repo, _based.Head, _to.Head)
+ _changes = await new Commands.CompareRevisions(_repo, _based, _to)
.ReadAsync()
.ConfigureAwait(false);
@@ -215,10 +217,34 @@ namespace SourceGit.ViewModels
}
}
+ private string GetName(object obj)
+ {
+ return obj switch
+ {
+ Models.Branch b => b.FriendlyName,
+ Models.Tag t => t.Name,
+ Models.Commit c => c.SHA.Substring(0, 10),
+ _ => "HEAD",
+ };
+ }
+
+ private string GetSHA(object obj)
+ {
+ return obj switch
+ {
+ Models.Branch b => b.Head,
+ Models.Tag t => t.SHA,
+ Models.Commit c => c.SHA,
+ _ => "HEAD",
+ };
+ }
+
private string _repo;
private bool _isLoading = true;
- private Models.Branch _based = null;
- private Models.Branch _to = null;
+ private string _based = string.Empty;
+ private string _to = string.Empty;
+ private string _baseName = string.Empty;
+ private string _toName = string.Empty;
private Models.Commit _baseHead = null;
private Models.Commit _toHead = null;
private int _totalChanges = 0;
diff --git a/src/Views/BranchCompare.axaml b/src/Views/BranchCompare.axaml
index f222d254..b625ae16 100644
--- a/src/Views/BranchCompare.axaml
+++ b/src/Views/BranchCompare.axaml
@@ -48,7 +48,7 @@
User="{Binding BaseHead.Author}"/>
-
+
@@ -72,7 +72,7 @@
User="{Binding ToHead.Author}"/>
-
+
diff --git a/src/Views/BranchCompare.axaml.cs b/src/Views/BranchCompare.axaml.cs
index f0815bfa..12c91a95 100644
--- a/src/Views/BranchCompare.axaml.cs
+++ b/src/Views/BranchCompare.axaml.cs
@@ -21,7 +21,6 @@ namespace SourceGit.Views
sender is ChangeCollectionView view)
{
var menu = new ContextMenu();
- var repo = vm.RepositoryPath;
var patch = new MenuItem();
patch.Header = App.Text("FileCM.SaveAsPatch");
@@ -48,7 +47,7 @@ namespace SourceGit.Views
}
catch (Exception exception)
{
- App.RaiseException(repo, $"Failed to save as patch: {exception.Message}");
+ App.RaiseException(null, $"Failed to save as patch: {exception.Message}");
}
e.Handled = true;
@@ -63,14 +62,14 @@ namespace SourceGit.Views
openWithMerger.Tag = OperatingSystem.IsMacOS() ? "⌘+⇧+D" : "Ctrl+Shift+D";
openWithMerger.Click += (_, ev) =>
{
- new Commands.DiffTool(repo, new Models.DiffOption(vm.Base.Head, vm.To.Head, change)).Open();
+ vm.OpenInExternalDiffTool(change);
ev.Handled = true;
};
menu.Items.Add(openWithMerger);
if (change.Index != Models.ChangeState.Deleted)
{
- var full = Path.GetFullPath(Path.Combine(repo, change.Path));
+ var full = vm.GetAbsPath(change.Path);
var explore = new MenuItem();
explore.Header = App.Text("RevealFile");
explore.Icon = App.CreateMenuIcon("Icons.Explore");
@@ -99,7 +98,7 @@ namespace SourceGit.Views
copyFullPath.Tag = OperatingSystem.IsMacOS() ? "⌘+⇧+C" : "Ctrl+Shift+C";
copyFullPath.Click += async (_, ev) =>
{
- await App.CopyTextAsync(Native.OS.GetAbsPath(repo, change.Path));
+ await App.CopyTextAsync(vm.GetAbsPath(change.Path));
ev.Handled = true;
};
@@ -133,7 +132,7 @@ namespace SourceGit.Views
{
var builder = new StringBuilder();
foreach (var c in selected)
- builder.AppendLine(Native.OS.GetAbsPath(repo, c.Path));
+ builder.AppendLine(vm.GetAbsPath(c.Path));
await App.CopyTextAsync(builder.ToString());
ev.Handled = true;
diff --git a/src/Views/TagsView.axaml.cs b/src/Views/TagsView.axaml.cs
index d2275d04..c38e1631 100644
--- a/src/Views/TagsView.axaml.cs
+++ b/src/Views/TagsView.axaml.cs
@@ -257,6 +257,14 @@ namespace SourceGit.Views
ev.Handled = true;
};
+ var compareWithHead = new MenuItem();
+ compareWithHead.Header = App.Text("TagCM.CompareWithHead");
+ compareWithHead.Icon = App.CreateMenuIcon("Icons.Compare");
+ compareWithHead.Click += (_, _) =>
+ {
+ App.ShowWindow(new ViewModels.BranchCompare(repo.FullPath, tag, repo.CurrentBranch));
+ };
+
var archive = new MenuItem();
archive.Icon = App.CreateMenuIcon("Icons.Archive");
archive.Header = App.Text("Archive");
@@ -273,6 +281,8 @@ namespace SourceGit.Views
menu.Items.Add(pushTag);
menu.Items.Add(deleteTag);
menu.Items.Add(new MenuItem() { Header = "-" });
+ menu.Items.Add(compareWithHead);
+ menu.Items.Add(new MenuItem() { Header = "-" });
menu.Items.Add(archive);
menu.Items.Add(new MenuItem() { Header = "-" });