Skip to content

Commit b424641

Browse files
committed
feature: supports to view details changes of submodule (only if this submodule is initialized and not available for new/delete submodule change) (sourcegit-scm#2264)
Signed-off-by: leo <longshuang@msn.cn>
1 parent 5a838ec commit b424641

File tree

10 files changed

+593
-0
lines changed

10 files changed

+593
-0
lines changed

src/Models/DiffResult.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -608,8 +608,11 @@ public class NoOrEOLChange;
608608

609609
public class SubmoduleDiff
610610
{
611+
public string FullPath { get; set; } = string.Empty;
611612
public RevisionSubmodule Old { get; set; } = null;
612613
public RevisionSubmodule New { get; set; } = null;
614+
615+
public bool CanOpenDetails => File.Exists(Path.Combine(FullPath, ".git")) && Old != null && New != null;
613616
}
614617

615618
public class DiffResult

src/Resources/Locales/en_US.axaml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -905,6 +905,8 @@
905905
<x:String x:Key="Text.Submodule.Status.Unmerged" xml:space="preserve">unmerged</x:String>
906906
<x:String x:Key="Text.Submodule.Update" xml:space="preserve">Update</x:String>
907907
<x:String x:Key="Text.Submodule.URL" xml:space="preserve">URL</x:String>
908+
<x:String x:Key="Text.SubmoduleRevisionCompare" xml:space="preserve">Submodule Change Details</x:String>
909+
<x:String x:Key="Text.SubmoduleRevisionCompare.OpenDetails" xml:space="preserve">OPEN DETAILS</x:String>
908910
<x:String x:Key="Text.Sure" xml:space="preserve">OK</x:String>
909911
<x:String x:Key="Text.Tag.Tagger" xml:space="preserve">TAGGER</x:String>
910912
<x:String x:Key="Text.Tag.Time" xml:space="preserve">TIME</x:String>

src/Resources/Locales/zh_CN.axaml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -909,6 +909,8 @@
909909
<x:String x:Key="Text.Submodule.Status.Unmerged" xml:space="preserve">未解决冲突</x:String>
910910
<x:String x:Key="Text.Submodule.Update" xml:space="preserve">更新</x:String>
911911
<x:String x:Key="Text.Submodule.URL" xml:space="preserve">仓库</x:String>
912+
<x:String x:Key="Text.SubmoduleRevisionCompare" xml:space="preserve">子模块变更详情</x:String>
913+
<x:String x:Key="Text.SubmoduleRevisionCompare.OpenDetails" xml:space="preserve">查看变更详情</x:String>
912914
<x:String x:Key="Text.Sure" xml:space="preserve">确 定</x:String>
913915
<x:String x:Key="Text.Tag.Tagger" xml:space="preserve">创建者</x:String>
914916
<x:String x:Key="Text.Tag.Time" xml:space="preserve">创建时间</x:String>

src/Resources/Locales/zh_TW.axaml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -909,6 +909,8 @@
909909
<x:String x:Key="Text.Submodule.Status.Unmerged" xml:space="preserve">未解決的衝突</x:String>
910910
<x:String x:Key="Text.Submodule.Update" xml:space="preserve">更新</x:String>
911911
<x:String x:Key="Text.Submodule.URL" xml:space="preserve">存放庫</x:String>
912+
<x:String x:Key="Text.SubmoduleRevisionCompare" xml:space="preserve">子模組變更詳細資訊</x:String>
913+
<x:String x:Key="Text.SubmoduleRevisionCompare.OpenDetails" xml:space="preserve">開啟變更詳細資訊</x:String>
912914
<x:String x:Key="Text.Sure" xml:space="preserve">確 定</x:String>
913915
<x:String x:Key="Text.Tag.Tagger" xml:space="preserve">建立者</x:String>
914916
<x:String x:Key="Text.Tag.Time" xml:space="preserve">建立時間</x:String>

src/ViewModels/DiffContext.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -190,7 +190,10 @@ private void LoadContent()
190190
}
191191

192192
if (isSubmodule)
193+
{
194+
submoduleDiff.FullPath = submoduleRoot;
193195
rs = submoduleDiff;
196+
}
194197
}
195198

196199
if (!isSubmodule)
Lines changed: 177 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,177 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Threading.Tasks;
4+
using Avalonia.Threading;
5+
using CommunityToolkit.Mvvm.ComponentModel;
6+
7+
namespace SourceGit.ViewModels
8+
{
9+
public class SubmoduleRevisionCompare : ObservableObject
10+
{
11+
public bool IsLoading
12+
{
13+
get => _isLoading;
14+
private set => SetProperty(ref _isLoading, value);
15+
}
16+
17+
public Models.Commit Base
18+
{
19+
get => _base;
20+
private set => SetProperty(ref _base, value);
21+
}
22+
23+
public Models.Commit To
24+
{
25+
get => _to;
26+
private set => SetProperty(ref _to, value);
27+
}
28+
29+
public int TotalChanges
30+
{
31+
get => _totalChanges;
32+
private set => SetProperty(ref _totalChanges, value);
33+
}
34+
35+
public List<Models.Change> VisibleChanges
36+
{
37+
get => _visibleChanges;
38+
private set => SetProperty(ref _visibleChanges, value);
39+
}
40+
41+
public List<Models.Change> SelectedChanges
42+
{
43+
get => _selectedChanges;
44+
set
45+
{
46+
if (SetProperty(ref _selectedChanges, value))
47+
{
48+
if (value is { Count: 1 })
49+
DiffContext = new DiffContext(_repo, new Models.DiffOption(_base.SHA, _to.SHA, value[0]), _diffContext);
50+
else
51+
DiffContext = null;
52+
}
53+
}
54+
}
55+
56+
public string SearchFilter
57+
{
58+
get => _searchFilter;
59+
set
60+
{
61+
if (SetProperty(ref _searchFilter, value))
62+
RefreshVisible();
63+
}
64+
}
65+
66+
public DiffContext DiffContext
67+
{
68+
get => _diffContext;
69+
private set => SetProperty(ref _diffContext, value);
70+
}
71+
72+
public SubmoduleRevisionCompare(Models.SubmoduleDiff diff)
73+
{
74+
_repo = diff.FullPath;
75+
_base = diff.Old.Commit;
76+
_to = diff.New.Commit;
77+
78+
Refresh();
79+
}
80+
81+
public void Swap()
82+
{
83+
(Base, To) = (To, Base);
84+
Refresh();
85+
}
86+
87+
public void ClearSearchFilter()
88+
{
89+
SearchFilter = string.Empty;
90+
}
91+
92+
public string GetAbsPath(string path)
93+
{
94+
return Native.OS.GetAbsPath(_repo, path);
95+
}
96+
97+
public void OpenInExternalDiffTool(Models.Change change)
98+
{
99+
new Commands.DiffTool(_repo, new Models.DiffOption(_base.SHA, _to.SHA, change)).Open();
100+
}
101+
102+
public async Task<bool> SaveChangesAsPatchAsync(List<Models.Change> changes, string saveTo)
103+
{
104+
return await Commands.SaveChangesAsPatch.ProcessRevisionCompareChangesAsync(_repo, changes, _base.SHA, _to.SHA, saveTo);
105+
}
106+
107+
private void Refresh()
108+
{
109+
IsLoading = true;
110+
VisibleChanges = [];
111+
SelectedChanges = [];
112+
113+
Task.Run(async () =>
114+
{
115+
_changes = await new Commands.CompareRevisions(_repo, _base.SHA, _to.SHA)
116+
.ReadAsync()
117+
.ConfigureAwait(false);
118+
119+
var visible = _changes;
120+
if (!string.IsNullOrWhiteSpace(_searchFilter))
121+
{
122+
visible = new List<Models.Change>();
123+
foreach (var c in _changes)
124+
{
125+
if (c.Path.Contains(_searchFilter, StringComparison.OrdinalIgnoreCase))
126+
visible.Add(c);
127+
}
128+
}
129+
130+
Dispatcher.UIThread.Post(() =>
131+
{
132+
TotalChanges = _changes.Count;
133+
VisibleChanges = visible;
134+
IsLoading = false;
135+
136+
if (VisibleChanges.Count > 0)
137+
SelectedChanges = [VisibleChanges[0]];
138+
else
139+
SelectedChanges = [];
140+
});
141+
});
142+
}
143+
144+
private void RefreshVisible()
145+
{
146+
if (_changes == null)
147+
return;
148+
149+
if (string.IsNullOrEmpty(_searchFilter))
150+
{
151+
VisibleChanges = _changes;
152+
}
153+
else
154+
{
155+
var visible = new List<Models.Change>();
156+
foreach (var c in _changes)
157+
{
158+
if (c.Path.Contains(_searchFilter, StringComparison.OrdinalIgnoreCase))
159+
visible.Add(c);
160+
}
161+
162+
VisibleChanges = visible;
163+
}
164+
}
165+
166+
private string _repo;
167+
private bool _isLoading = true;
168+
private Models.Commit _base = null;
169+
private Models.Commit _to = null;
170+
private int _totalChanges = 0;
171+
private List<Models.Change> _changes = null;
172+
private List<Models.Change> _visibleChanges = null;
173+
private List<Models.Change> _selectedChanges = null;
174+
private string _searchFilter = string.Empty;
175+
private DiffContext _diffContext = null;
176+
}
177+
}

src/Views/DiffView.axaml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -326,6 +326,13 @@
326326
</ContentControl.DataTemplates>
327327
</ContentControl>
328328
</Border>
329+
330+
<Button Classes="flat"
331+
Margin="0,8"
332+
HorizontalAlignment="Center"
333+
Content="{DynamicResource Text.SubmoduleRevisionCompare.OpenDetails}"
334+
Click="OnOpenSubmoduleRevisionCompare"
335+
IsEnabled="{Binding CanOpenDetails, Mode=OneWay}"/>
329336
</StackPanel>
330337
</ScrollViewer>
331338
</Grid>

src/Views/DiffView.axaml.cs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,5 +42,19 @@ private void OnGotoLastChange(object _, RoutedEventArgs e)
4242
this.FindDescendantOfType<ThemedTextDiffPresenter>()?.GotoChange(ViewModels.BlockNavigationDirection.Last);
4343
e.Handled = true;
4444
}
45+
46+
private void OnOpenSubmoduleRevisionCompare(object sender, RoutedEventArgs e)
47+
{
48+
var owner = TopLevel.GetTopLevel(this) as Window;
49+
if (owner == null)
50+
return;
51+
52+
if (sender is Button { DataContext: Models.SubmoduleDiff diff } && diff.CanOpenDetails)
53+
{
54+
var vm = new ViewModels.SubmoduleRevisionCompare(diff);
55+
var dailog = new SubmoduleRevisionCompare() { DataContext = vm };
56+
dailog.Show(owner);
57+
}
58+
}
4559
}
4660
}

0 commit comments

Comments
 (0)