Skip to content

Commit cc5bb5f

Browse files
authored
Show the list of children in the commit details (#710)
* feature: add children list to the commit base info view Useful for navigation between the commits. * feature: use repository filters to limit children search * feature: execute children search asynchronously * feature: respect global commit limit for a good measure * fix: input lines may contain several commits The first commit is always the immediate child, so take only 40 initial characters of the line * fix: hide children behind the preference * feature: make parents and children scrollable
1 parent cc1eb55 commit cc5bb5f

File tree

9 files changed

+172
-46
lines changed

9 files changed

+172
-46
lines changed
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using SourceGit.ViewModels;
4+
5+
namespace SourceGit.Commands
6+
{
7+
public class QueryCommitChildren : Command
8+
{
9+
public QueryCommitChildren(string repo, string commit, string filters)
10+
{
11+
WorkingDirectory = repo;
12+
Context = repo;
13+
_commit = commit;
14+
if (string.IsNullOrEmpty(filters))
15+
filters = "--all";
16+
Args = $"rev-list -{Preference.Instance.MaxHistoryCommits} --parents {filters} ^{commit}";
17+
}
18+
19+
protected override void OnReadline(string line)
20+
{
21+
if (line.Contains(_commit))
22+
_lines.Add(line.Substring(0, 40));
23+
}
24+
25+
public IEnumerable<string> Result()
26+
{
27+
Exec();
28+
return _lines;
29+
}
30+
31+
private string _commit;
32+
private List<string> _lines = new List<string>();
33+
}
34+
}

src/Resources/Locales/en_US.axaml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,7 @@
125125
<x:String x:Key="Text.CommitDetail.Info" xml:space="preserve">INFORMATION</x:String>
126126
<x:String x:Key="Text.CommitDetail.Info.Author" xml:space="preserve">AUTHOR</x:String>
127127
<x:String x:Key="Text.CommitDetail.Info.Changed" xml:space="preserve">CHANGED</x:String>
128+
<x:String x:Key="Text.CommitDetail.Info.Children" xml:space="preserve">CHILDREN</x:String>
128129
<x:String x:Key="Text.CommitDetail.Info.Committer" xml:space="preserve">COMMITTER</x:String>
129130
<x:String x:Key="Text.CommitDetail.Info.ContainsIn" xml:space="preserve">Check refs that contains this commit</x:String>
130131
<x:String x:Key="Text.CommitDetail.Info.ContainsIn.Title" xml:space="preserve">COMMIT IS CONTAINED BY</x:String>
@@ -451,6 +452,7 @@
451452
<x:String x:Key="Text.Preference.General.Locale" xml:space="preserve">Language</x:String>
452453
<x:String x:Key="Text.Preference.General.MaxHistoryCommits" xml:space="preserve">History Commits</x:String>
453454
<x:String x:Key="Text.Preference.General.ShowAuthorTime" xml:space="preserve">Show author time intead of commit time in graph</x:String>
455+
<x:String x:Key="Text.Preference.General.ShowChildren" xml:space="preserve">Show children in the comment details</x:String>
454456
<x:String x:Key="Text.Preference.General.SubjectGuideLength" xml:space="preserve">Subject Guide Length</x:String>
455457
<x:String x:Key="Text.Preference.Git" xml:space="preserve">GIT</x:String>
456458
<x:String x:Key="Text.Preference.Git.CRLF" xml:space="preserve">Enable Auto CRLF</x:String>

src/Resources/Locales/fr_FR.axaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,7 @@
126126
<x:String x:Key="Text.CommitDetail.Info" xml:space="preserve">INFORMATIONS</x:String>
127127
<x:String x:Key="Text.CommitDetail.Info.Author" xml:space="preserve">AUTEUR</x:String>
128128
<x:String x:Key="Text.CommitDetail.Info.Changed" xml:space="preserve">CHANGÉ</x:String>
129+
<x:String x:Key="Text.CommitDetail.Info.Children" xml:space="preserve">ENFANTS</x:String>
129130
<x:String x:Key="Text.CommitDetail.Info.Committer" xml:space="preserve">COMMITTER</x:String>
130131
<x:String x:Key="Text.CommitDetail.Info.ContainsIn" xml:space="preserve">Vérifier les références contenant ce commit</x:String>
131132
<x:String x:Key="Text.CommitDetail.Info.ContainsIn.Title" xml:space="preserve">LE COMMIT EST CONTENU PAR</x:String>

src/ViewModels/CommitDetail.cs

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,12 @@ public List<Models.Change> SelectedChanges
7878
}
7979
}
8080

81+
public AvaloniaList<string> Children
82+
{
83+
get;
84+
private set;
85+
} = new AvaloniaList<string>();
86+
8187
public string SearchChangeFilter
8288
{
8389
get => _searchChangeFilter;
@@ -515,6 +521,7 @@ private void Refresh()
515521
VisibleChanges = null;
516522
SelectedChanges = null;
517523
ViewRevisionFileContent = null;
524+
Children.Clear();
518525

519526
if (_commit == null)
520527
return;
@@ -535,6 +542,18 @@ private void Refresh()
535542
_cancelToken.Requested = true;
536543

537544
_cancelToken = new Commands.Command.CancelToken();
545+
546+
if (Preference.Instance.ShowChildren)
547+
{
548+
Task.Run(() =>
549+
{
550+
var cmdChildren = new Commands.QueryCommitChildren(_repo.FullPath, _commit.SHA, _repo.Settings.BuildHistoriesFilter()) { Cancel = _cancelToken };
551+
var children = cmdChildren.Result();
552+
if (!cmdChildren.Cancel.Requested)
553+
Dispatcher.UIThread.Post(() => Children.AddRange(children));
554+
});
555+
}
556+
538557
Task.Run(() =>
539558
{
540559
var parent = _commit.Parents.Count == 0 ? "4b825dc642cb6eb9a060e54bf8d69288fbee4904" : _commit.Parents[0];

src/ViewModels/Preference.cs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -294,6 +294,12 @@ public uint StatisticsSampleColor
294294
set => SetProperty(ref _statisticsSampleColor, value);
295295
}
296296

297+
public bool ShowChildren
298+
{
299+
get => _showChildren;
300+
set => SetProperty(ref _showChildren, value);
301+
}
302+
297303
public List<RepositoryNode> RepositoryNodes
298304
{
299305
get;
@@ -617,5 +623,7 @@ private bool RemoveInvalidRepositoriesRecursive(List<RepositoryNode> collection)
617623
private string _externalMergeToolPath = string.Empty;
618624

619625
private uint _statisticsSampleColor = 0xFF00FF00;
626+
627+
private bool _showChildren = false;
620628
}
621629
}

src/Views/CommitBaseInfo.axaml

Lines changed: 91 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@
5151
<Rectangle Height=".65" Margin="8" Fill="{DynamicResource Brush.Border2}" VerticalAlignment="Center"/>
5252

5353
<!-- Base Information -->
54-
<Grid RowDefinitions="24,Auto,Auto,Auto" ColumnDefinitions="96,*">
54+
<Grid RowDefinitions="24,Auto,Auto,Auto,Auto" ColumnDefinitions="96,*">
5555
<!-- SHA -->
5656
<TextBlock Grid.Row="0" Grid.Column="0" Classes="info_label" Text="{DynamicResource Text.CommitDetail.Info.SHA}" />
5757
<StackPanel Grid.Row="0" Grid.Column="1" Orientation="Horizontal">
@@ -102,50 +102,97 @@
102102

103103
<!-- PARENTS -->
104104
<TextBlock Grid.Row="1" Grid.Column="0" Classes="info_label" Text="{DynamicResource Text.CommitDetail.Info.Parents}" IsVisible="{Binding Parents.Count, Converter={x:Static c:IntConverters.IsGreaterThanZero}}"/>
105-
<ItemsControl Grid.Row="1" Grid.Column="1" Height="24" Margin="12,0,0,0" ItemsSource="{Binding Parents}" IsVisible="{Binding Parents.Count, Converter={x:Static c:IntConverters.IsGreaterThanZero}}">
106-
<ItemsControl.ItemsPanel>
107-
<ItemsPanelTemplate>
108-
<StackPanel Orientation="Horizontal" VerticalAlignment="Center"/>
109-
</ItemsPanelTemplate>
110-
</ItemsControl.ItemsPanel>
111-
112-
<ItemsControl.ItemTemplate>
113-
<DataTemplate>
114-
<TextBlock Classes="primary"
115-
Text="{Binding Converter={x:Static c:StringConverters.ToShortSHA}}"
116-
Foreground="DarkOrange"
117-
TextDecorations="Underline"
118-
Cursor="Hand"
119-
Margin="0,0,16,0"
120-
PointerEntered="OnSHAPointerEntered"
121-
PointerPressed="OnSHAPressed">
122-
<TextBlock.Styles>
123-
<Style Selector="ToolTip">
124-
<Setter Property="MaxWidth" Value="600"/>
125-
</Style>
126-
</TextBlock.Styles>
127-
128-
<TextBlock.DataTemplates>
129-
<DataTemplate DataType="m:Commit">
130-
<StackPanel MinWidth="400" Orientation="Vertical">
131-
<Grid ColumnDefinitions="Auto,*,Auto">
132-
<v:Avatar Grid.Column="0" Width="16" Height="16" VerticalAlignment="Center" IsHitTestVisible="False" User="{Binding Author}"/>
133-
<TextBlock Grid.Column="1" Classes="primary" Text="{Binding Author.Name}" Margin="8,0,0,0"/>
134-
<TextBlock Grid.Column="2" Classes="primary" Text="{Binding CommitterTimeStr}" Foreground="{DynamicResource Brush.FG2}" Margin="8,0,0,0"/>
135-
</Grid>
105+
<ScrollViewer Grid.Row="1" Grid.Column="1" HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Hidden" AllowAutoHide="True">
106+
<ItemsControl Height="24" Margin="12,0,0,0" ItemsSource="{Binding Parents}" IsVisible="{Binding Parents.Count, Converter={x:Static c:IntConverters.IsGreaterThanZero}}">
107+
<ItemsControl.ItemsPanel>
108+
<ItemsPanelTemplate>
109+
<StackPanel Orientation="Horizontal" VerticalAlignment="Center"/>
110+
</ItemsPanelTemplate>
111+
</ItemsControl.ItemsPanel>
136112

137-
<TextBlock Classes="primary" Margin="0,8,0,0" Text="{Binding Subject}" TextWrapping="Wrap"/>
138-
</StackPanel>
139-
</DataTemplate>
140-
</TextBlock.DataTemplates>
141-
</TextBlock>
142-
</DataTemplate>
143-
</ItemsControl.ItemTemplate>
144-
</ItemsControl>
113+
<ItemsControl.ItemTemplate>
114+
<DataTemplate>
115+
<TextBlock Classes="primary"
116+
Text="{Binding Converter={x:Static c:StringConverters.ToShortSHA}}"
117+
Foreground="DarkOrange"
118+
TextDecorations="Underline"
119+
Cursor="Hand"
120+
Margin="0,0,16,0"
121+
PointerEntered="OnSHAPointerEntered"
122+
PointerPressed="OnSHAPressed">
123+
<TextBlock.Styles>
124+
<Style Selector="ToolTip">
125+
<Setter Property="MaxWidth" Value="600"/>
126+
</Style>
127+
</TextBlock.Styles>
128+
129+
<TextBlock.DataTemplates>
130+
<DataTemplate DataType="m:Commit">
131+
<StackPanel MinWidth="400" Orientation="Vertical">
132+
<Grid ColumnDefinitions="Auto,*,Auto">
133+
<v:Avatar Grid.Column="0" Width="16" Height="16" VerticalAlignment="Center" IsHitTestVisible="False" User="{Binding Author}"/>
134+
<TextBlock Grid.Column="1" Classes="primary" Text="{Binding Author.Name}" Margin="8,0,0,0"/>
135+
<TextBlock Grid.Column="2" Classes="primary" Text="{Binding CommitterTimeStr}" Foreground="{DynamicResource Brush.FG2}" Margin="8,0,0,0"/>
136+
</Grid>
137+
138+
<TextBlock Classes="primary" Margin="0,8,0,0" Text="{Binding Subject}" TextWrapping="Wrap"/>
139+
</StackPanel>
140+
</DataTemplate>
141+
</TextBlock.DataTemplates>
142+
</TextBlock>
143+
</DataTemplate>
144+
</ItemsControl.ItemTemplate>
145+
</ItemsControl>
146+
</ScrollViewer>
147+
148+
<!-- CHILDREN -->
149+
<TextBlock Grid.Row="2" Grid.Column="0" Classes="info_label" Text="{DynamicResource Text.CommitDetail.Info.Children}" IsVisible="{Binding #ThisControl.Children.Count, Converter={x:Static c:IntConverters.IsGreaterThanZero}}"/>
150+
<ScrollViewer Grid.Row="2" Grid.Column="1" HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Hidden" AllowAutoHide="True">
151+
<ItemsControl Height="24" Margin="12,0,0,0" ItemsSource="{Binding #ThisControl.Children}" IsVisible="{Binding #ThisControl.Children.Count, Converter={x:Static c:IntConverters.IsGreaterThanZero}}">
152+
<ItemsControl.ItemsPanel>
153+
<ItemsPanelTemplate>
154+
<StackPanel Orientation="Horizontal" VerticalAlignment="Center"/>
155+
</ItemsPanelTemplate>
156+
</ItemsControl.ItemsPanel>
157+
158+
<ItemsControl.ItemTemplate>
159+
<DataTemplate>
160+
<TextBlock Classes="primary"
161+
Text="{Binding Converter={x:Static c:StringConverters.ToShortSHA}}"
162+
Foreground="DarkOrange"
163+
TextDecorations="Underline"
164+
Cursor="Hand"
165+
Margin="0,0,16,0"
166+
PointerEntered="OnSHAPointerEntered"
167+
PointerPressed="OnSHAPressed">
168+
<TextBlock.Styles>
169+
<Style Selector="ToolTip">
170+
<Setter Property="MaxWidth" Value="600"/>
171+
</Style>
172+
</TextBlock.Styles>
173+
174+
<TextBlock.DataTemplates>
175+
<DataTemplate DataType="m:Commit">
176+
<StackPanel MinWidth="400" Orientation="Vertical">
177+
<Grid ColumnDefinitions="Auto,*,Auto">
178+
<v:Avatar Grid.Column="0" Width="16" Height="16" VerticalAlignment="Center" IsHitTestVisible="False" User="{Binding Author}"/>
179+
<TextBlock Grid.Column="1" Classes="primary" Text="{Binding Author.Name}" Margin="8,0,0,0"/>
180+
<TextBlock Grid.Column="2" Classes="primary" Text="{Binding CommitterTimeStr}" Foreground="{DynamicResource Brush.FG2}" Margin="8,0,0,0"/>
181+
</Grid>
182+
183+
<TextBlock Classes="primary" Margin="0,8,0,0" Text="{Binding Subject}" TextWrapping="Wrap"/>
184+
</StackPanel>
185+
</DataTemplate>
186+
</TextBlock.DataTemplates>
187+
</TextBlock>
188+
</DataTemplate>
189+
</ItemsControl.ItemTemplate>
190+
</ItemsControl>
191+
</ScrollViewer>
145192

146193
<!-- REFS -->
147-
<TextBlock Grid.Row="2" Grid.Column="0" Classes="info_label" Text="{DynamicResource Text.CommitDetail.Info.Refs}" IsVisible="{Binding HasDecorators}"/>
148-
<Border Grid.Row="2" Grid.Column="1" Margin="12,0,0,0" Height="24" IsVisible="{Binding HasDecorators}">
194+
<TextBlock Grid.Row="3" Grid.Column="0" Classes="info_label" Text="{DynamicResource Text.CommitDetail.Info.Refs}" IsVisible="{Binding HasDecorators}"/>
195+
<Border Grid.Row="3" Grid.Column="1" Margin="12,0,0,0" Height="24" IsVisible="{Binding HasDecorators}">
149196
<v:CommitRefsPresenter TagBackground="{DynamicResource Brush.DecoratorTag}"
150197
Foreground="{DynamicResource Brush.FG1}"
151198
FontFamily="{DynamicResource Fonts.Primary}"
@@ -155,8 +202,8 @@
155202
</Border>
156203

157204
<!-- Messages -->
158-
<TextBlock Grid.Row="3" Grid.Column="0" Classes="info_label" Text="{DynamicResource Text.CommitDetail.Info.Message}" VerticalAlignment="Top" Margin="0,4,0,0" />
159-
<v:CommitMessagePresenter Grid.Row="4" Grid.Column="1"
205+
<TextBlock Grid.Row="4" Grid.Column="0" Classes="info_label" Text="{DynamicResource Text.CommitDetail.Info.Message}" VerticalAlignment="Top" Margin="0,4,0,0" />
206+
<v:CommitMessagePresenter Grid.Row="5" Grid.Column="1"
160207
Margin="12,5,8,0"
161208
Classes="primary"
162209
Message="{Binding #ThisControl.Message}"

src/Views/CommitBaseInfo.axaml.cs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,15 @@ public AvaloniaList<Models.IssueTrackerRule> IssueTrackerRules
5555
set => SetValue(IssueTrackerRulesProperty, value);
5656
}
5757

58+
public static readonly StyledProperty<AvaloniaList<string>> ChildrenProperty =
59+
AvaloniaProperty.Register<CommitBaseInfo, AvaloniaList<string>>(nameof(Children));
60+
61+
public AvaloniaList<string> Children
62+
{
63+
get => GetValue(ChildrenProperty);
64+
set => SetValue(ChildrenProperty, value);
65+
}
66+
5867
public CommitBaseInfo()
5968
{
6069
InitializeComponent();

src/Views/CommitDetail.axaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
SignInfo="{Binding SignInfo}"
2525
SupportsContainsIn="True"
2626
WebLinks="{Binding WebLinks}"
27+
Children="{Binding Children}"
2728
IssueTrackerRules="{Binding IssueTrackerRules}"/>
2829

2930
<!-- Line -->

src/Views/Preference.axaml

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@
4545
<TabItem.Header>
4646
<TextBlock Classes="tab_header" Text="{DynamicResource Text.Preference.General}"/>
4747
</TabItem.Header>
48-
<Grid Margin="8" RowDefinitions="32,32,32,32,32,32" ColumnDefinitions="Auto,*">
48+
<Grid Margin="8" RowDefinitions="32,32,32,32,32,32,32" ColumnDefinitions="Auto,*">
4949
<TextBlock Grid.Row="0" Grid.Column="0"
5050
Text="{DynamicResource Text.Preference.General.Locale}"
5151
HorizontalAlignment="Right"
@@ -114,6 +114,11 @@
114114
Height="32"
115115
Content="{DynamicResource Text.Preference.General.Check4UpdatesOnStartup}"
116116
IsChecked="{Binding Source={x:Static vm:Preference.Instance}, Path=Check4UpdatesOnStartup, Mode=TwoWay}"/>
117+
118+
<CheckBox Grid.Row="6" Grid.Column="1"
119+
Height="32"
120+
Content="{DynamicResource Text.Preference.General.ShowChildren}"
121+
IsChecked="{Binding Source={x:Static vm:Preference.Instance}, Path=ShowChildren, Mode=TwoWay}"/>
117122
</Grid>
118123
</TabItem>
119124

@@ -188,7 +193,7 @@
188193
</Border>
189194
</NumericUpDown.InnerLeftContent>
190195
</NumericUpDown>
191-
</Grid>
196+
</Grid>
192197

193198
<TextBlock Grid.Row="4" Grid.Column="0"
194199
Text="{DynamicResource Text.Preference.Appearance.ThemeOverrides}"

0 commit comments

Comments
 (0)