Skip to content

Commit 94daa46

Browse files
committed
code_review: PR #793
* do NOT modify the existing merge, and add a new constructor for `Commands.Merge` instead * rewrite `ViewModels.MergeMultiple` - since `_histories.Commits.Find` may returns null, use `List<object>` instead of `List<Models.Commits>` - supports display merge target as both `Models.Commit` and `Models.Branch` * rename translation key `Text.MergeMultiple.Commit` to `Text.MergeMultiple.Targets`, and add translations for zh_CN and zh_TW * some UI/UX changes
1 parent 4eed967 commit 94daa46

File tree

10 files changed

+122
-40
lines changed

10 files changed

+122
-40
lines changed

src/Commands/Merge.cs

Lines changed: 27 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,41 @@
11
using System;
2+
using System.Collections.Generic;
3+
using System.Text;
24

35
namespace SourceGit.Commands
46
{
57
public class Merge : Command
68
{
7-
public Merge(string repo, string source, string mode, string strategy, Action<string> outputHandler)
9+
public Merge(string repo, string source, string mode, Action<string> outputHandler)
810
{
911
_outputHandler = outputHandler;
1012
WorkingDirectory = repo;
1113
Context = repo;
1214
TraitErrorAsOutput = true;
13-
if (strategy != null)
14-
strategy = string.Concat("--strategy=", strategy);
15-
Args = $"merge --progress {strategy} {source} {mode}";
15+
Args = $"merge --progress {source} {mode}";
16+
}
17+
18+
public Merge(string repo, List<string> targets, bool autoCommit, string strategy, Action<string> outputHandler)
19+
{
20+
_outputHandler = outputHandler;
21+
WorkingDirectory = repo;
22+
Context = repo;
23+
TraitErrorAsOutput = true;
24+
25+
var builder = new StringBuilder();
26+
builder.Append("merge --progress ");
27+
if (!string.IsNullOrEmpty(strategy))
28+
builder.Append($"--strategy={strategy} ");
29+
if (!autoCommit)
30+
builder.Append("--no-commit ");
31+
32+
foreach (var t in targets)
33+
{
34+
builder.Append(t);
35+
builder.Append(' ');
36+
}
37+
38+
Args = builder.ToString();
1639
}
1740

1841
protected override void OnReadline(string line)

src/Models/MergeStrategy.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,10 @@ public class MergeStrategy
99
public string Arg { get; internal set; }
1010

1111
public static List<MergeStrategy> ForMultiple { get; private set; } = [
12-
new MergeStrategy(string.Empty, "Let Git automatically select a strategy", null),
12+
new MergeStrategy("Default", "Let Git automatically select a strategy", string.Empty),
1313
new MergeStrategy("Octopus", "Attempt merging multiple heads", "octopus"),
1414
new MergeStrategy("Ours", "Record the merge without modifying the tree", "ours"),
15-
];
15+
];
1616

1717
public MergeStrategy(string n, string d, string a)
1818
{

src/Resources/Locales/en_US.axaml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@
5858
<x:String x:Key="Text.BranchCM.FetchInto" xml:space="preserve">Fetch ${0}$ into ${1}$...</x:String>
5959
<x:String x:Key="Text.BranchCM.Finish" xml:space="preserve">Git Flow - Finish ${0}$</x:String>
6060
<x:String x:Key="Text.BranchCM.Merge" xml:space="preserve">Merge ${0}$ into ${1}$...</x:String>
61-
<x:String x:Key="Text.BranchCM.MergeMultiBranches" xml:space="preserve">Merge selected {0} branches</x:String>
61+
<x:String x:Key="Text.BranchCM.MergeMultiBranches" xml:space="preserve">Merge selected {0} branches into current</x:String>
6262
<x:String x:Key="Text.BranchCM.Pull" xml:space="preserve">Pull ${0}$</x:String>
6363
<x:String x:Key="Text.BranchCM.PullInto" xml:space="preserve">Pull ${0}$ into ${1}$...</x:String>
6464
<x:String x:Key="Text.BranchCM.Push" xml:space="preserve">Push ${0}$</x:String>
@@ -406,10 +406,10 @@
406406
<x:String x:Key="Text.Merge.Into" xml:space="preserve">Into:</x:String>
407407
<x:String x:Key="Text.Merge.Mode" xml:space="preserve">Merge Option:</x:String>
408408
<x:String x:Key="Text.Merge.Source" xml:space="preserve">Source Branch:</x:String>
409-
<x:String x:Key="Text.MergeMultiple" xml:space="preserve">Merge commits</x:String>
410-
<x:String x:Key="Text.MergeMultiple.Commit" xml:space="preserve">Commit(s):</x:String>
409+
<x:String x:Key="Text.MergeMultiple" xml:space="preserve">Merge (Multiple)</x:String>
411410
<x:String x:Key="Text.MergeMultiple.CommitChanges" xml:space="preserve">Commit all changes</x:String>
412411
<x:String x:Key="Text.MergeMultiple.Strategy" xml:space="preserve">Strategy:</x:String>
412+
<x:String x:Key="Text.MergeMultiple.Targets" xml:space="preserve">Targets:</x:String>
413413
<x:String x:Key="Text.MoveRepositoryNode" xml:space="preserve">Move Repository Node</x:String>
414414
<x:String x:Key="Text.MoveRepositoryNode.Target" xml:space="preserve">Select parent node for:</x:String>
415415
<x:String x:Key="Text.Name" xml:space="preserve">Name:</x:String>

src/Resources/Locales/zh_CN.axaml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@
6161
<x:String x:Key="Text.BranchCM.FetchInto" xml:space="preserve">拉取(fetch) ${0}$ 至 ${1}$...</x:String>
6262
<x:String x:Key="Text.BranchCM.Finish" xml:space="preserve">GIT工作流 - 完成 ${0}$</x:String>
6363
<x:String x:Key="Text.BranchCM.Merge" xml:space="preserve">合并 ${0}$ 到 ${1}$...</x:String>
64+
<x:String x:Key="Text.BranchCM.MergeMultiBranches" xml:space="preserve">合并 {0} 个分支到当前分支</x:String>
6465
<x:String x:Key="Text.BranchCM.Pull" xml:space="preserve">拉回(pull) ${0}$</x:String>
6566
<x:String x:Key="Text.BranchCM.PullInto" xml:space="preserve">拉回(pull) ${0}$ 内容至 ${1}$...</x:String>
6667
<x:String x:Key="Text.BranchCM.Push" xml:space="preserve">推送(push)${0}$</x:String>
@@ -113,6 +114,7 @@
113114
<x:String x:Key="Text.CommitCM.CopySHA" xml:space="preserve">复制提交指纹</x:String>
114115
<x:String x:Key="Text.CommitCM.CustomAction" xml:space="preserve">自定义操作</x:String>
115116
<x:String x:Key="Text.CommitCM.InteractiveRebase" xml:space="preserve">交互式变基(rebase -i) ${0}$ 到此处</x:String>
117+
<x:String x:Key="Text.CommitCM.MergeMultiple" xml:space="preserve">合并(merge)...</x:String>
116118
<x:String x:Key="Text.CommitCM.Rebase" xml:space="preserve">变基(rebase) ${0}$ 到此处</x:String>
117119
<x:String x:Key="Text.CommitCM.Reset" xml:space="preserve">重置(reset) ${0}$ 到此处</x:String>
118120
<x:String x:Key="Text.CommitCM.Revert" xml:space="preserve">回滚此提交</x:String>
@@ -407,6 +409,10 @@
407409
<x:String x:Key="Text.Merge.Into" xml:space="preserve">目标分支 :</x:String>
408410
<x:String x:Key="Text.Merge.Mode" xml:space="preserve">合并方式 :</x:String>
409411
<x:String x:Key="Text.Merge.Source" xml:space="preserve">合并分支 :</x:String>
412+
<x:String x:Key="Text.MergeMultiple" xml:space="preserve">合并(多目标)</x:String>
413+
<x:String x:Key="Text.MergeMultiple.CommitChanges" xml:space="preserve">提交变化</x:String>
414+
<x:String x:Key="Text.MergeMultiple.Strategy" xml:space="preserve">合并策略 :</x:String>
415+
<x:String x:Key="Text.MergeMultiple.Targets" xml:space="preserve">目标列表 :</x:String>
410416
<x:String x:Key="Text.MoveRepositoryNode" xml:space="preserve">调整仓库分组</x:String>
411417
<x:String x:Key="Text.MoveRepositoryNode.Target" xml:space="preserve">请选择目标分组:</x:String>
412418
<x:String x:Key="Text.Name" xml:space="preserve">名称 :</x:String>

src/Resources/Locales/zh_TW.axaml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@
6161
<x:String x:Key="Text.BranchCM.FetchInto" xml:space="preserve">提取 (fetch) ${0}$ 到 ${1}$...</x:String>
6262
<x:String x:Key="Text.BranchCM.Finish" xml:space="preserve">Git 工作流 - 完成 ${0}$</x:String>
6363
<x:String x:Key="Text.BranchCM.Merge" xml:space="preserve">合併 ${0}$ 到 ${1}$...</x:String>
64+
<x:String x:Key="Text.BranchCM.MergeMultiBranches" xml:space="preserve">合併 {0} 個分支到目前分支</x:String>
6465
<x:String x:Key="Text.BranchCM.Pull" xml:space="preserve">拉取 (pull) ${0}$</x:String>
6566
<x:String x:Key="Text.BranchCM.PullInto" xml:space="preserve">拉取 (pull) ${0}$ 內容至 ${1}$...</x:String>
6667
<x:String x:Key="Text.BranchCM.Push" xml:space="preserve">推送 (push) ${0}$</x:String>
@@ -113,6 +114,7 @@
113114
<x:String x:Key="Text.CommitCM.CopySHA" xml:space="preserve">複製提交編號</x:String>
114115
<x:String x:Key="Text.CommitCM.CustomAction" xml:space="preserve">自訂動作</x:String>
115116
<x:String x:Key="Text.CommitCM.InteractiveRebase" xml:space="preserve">互動式重定基底 (rebase -i) ${0}$ 到此處</x:String>
117+
<x:String x:Key="Text.CommitCM.MergeMultiple" xml:space="preserve">合併 (merge)...</x:String>
116118
<x:String x:Key="Text.CommitCM.Rebase" xml:space="preserve">重定基底 (rebase) ${0}$ 到此處</x:String>
117119
<x:String x:Key="Text.CommitCM.Reset" xml:space="preserve">重設 (reset) ${0}$ 到此處</x:String>
118120
<x:String x:Key="Text.CommitCM.Revert" xml:space="preserve">復原此提交</x:String>
@@ -407,6 +409,10 @@
407409
<x:String x:Key="Text.Merge.Into" xml:space="preserve">目標分支:</x:String>
408410
<x:String x:Key="Text.Merge.Mode" xml:space="preserve">合併方式:</x:String>
409411
<x:String x:Key="Text.Merge.Source" xml:space="preserve">合併分支:</x:String>
412+
<x:String x:Key="Text.MergeMultiple" xml:space="preserve">合併(多目標)</x:String>
413+
<x:String x:Key="Text.MergeMultiple.CommitChanges" xml:space="preserve">提交變更</x:String>
414+
<x:String x:Key="Text.MergeMultiple.Strategy" xml:space="preserve">合併策略:</x:String>
415+
<x:String x:Key="Text.MergeMultiple.Targets" xml:space="preserve">目標列表:</x:String>
410416
<x:String x:Key="Text.MoveRepositoryNode" xml:space="preserve">調整存放庫分組</x:String>
411417
<x:String x:Key="Text.MoveRepositoryNode.Target" xml:space="preserve">請選擇目標分組:</x:String>
412418
<x:String x:Key="Text.Name" xml:space="preserve">名稱:</x:String>

src/ViewModels/Merge.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ public override Task<bool> Sure()
3737

3838
return Task.Run(() =>
3939
{
40-
var succ = new Commands.Merge(_repo.FullPath, Source, SelectedMode.Arg, null, SetProgressDescription).Exec();
40+
var succ = new Commands.Merge(_repo.FullPath, Source, SelectedMode.Arg, SetProgressDescription).Exec();
4141
CallUIThread(() => _repo.SetWatcherEnabled(true));
4242
return succ;
4343
});

src/ViewModels/MergeMultiple.cs

Lines changed: 46 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,37 +1,43 @@
11
using System.Collections.Generic;
22
using System.Threading.Tasks;
3-
using SourceGit.Models;
43

54
namespace SourceGit.ViewModels
65
{
76
public class MergeMultiple : Popup
87
{
9-
public List<string> Strategies = ["octopus", "ours"];
10-
11-
public List<Commit> Targets
8+
public List<object> Targets
129
{
1310
get;
1411
private set;
15-
}
12+
} = [];
1613

1714
public bool AutoCommit
1815
{
1916
get;
2017
set;
2118
}
2219

23-
public MergeStrategy Strategy
20+
public Models.MergeStrategy Strategy
2421
{
2522
get;
2623
set;
2724
}
2825

29-
public MergeMultiple(Repository repo, List<Commit> targets)
26+
public MergeMultiple(Repository repo, List<Models.Commit> commits)
27+
{
28+
_repo = repo;
29+
Targets.AddRange(commits);
30+
AutoCommit = true;
31+
Strategy = Models.MergeStrategy.ForMultiple[0];
32+
View = new Views.MergeMultiple() { DataContext = this };
33+
}
34+
35+
public MergeMultiple(Repository repo, List<Models.Branch> branches)
3036
{
3137
_repo = repo;
32-
Targets = targets;
38+
Targets.AddRange(branches);
3339
AutoCommit = true;
34-
Strategy = MergeStrategy.ForMultiple.Find(s => s.Arg == null);
40+
Strategy = Models.MergeStrategy.ForMultiple[0];
3541
View = new Views.MergeMultiple() { DataContext = this };
3642
}
3743

@@ -44,16 +50,44 @@ public override Task<bool> Sure()
4450
{
4551
var succ = new Commands.Merge(
4652
_repo.FullPath,
47-
string.Join(" ", Targets.ConvertAll(c => c.Decorators.Find(d => d.Type == DecoratorType.RemoteBranchHead || d.Type == DecoratorType.LocalBranchHead)?.Name ?? c.Decorators.Find(d => d.Type == DecoratorType.Tag)?.Name ?? c.SHA)),
48-
AutoCommit ? string.Empty : "--no-commit",
49-
Strategy?.Arg,
53+
ConvertTargetToMergeSources(),
54+
AutoCommit,
55+
Strategy.Arg,
5056
SetProgressDescription).Exec();
5157

5258
CallUIThread(() => _repo.SetWatcherEnabled(true));
5359
return succ;
5460
});
5561
}
5662

63+
private List<string> ConvertTargetToMergeSources()
64+
{
65+
var ret = new List<string>();
66+
foreach (var t in Targets)
67+
{
68+
if (t is Models.Branch branch)
69+
{
70+
ret.Add(branch.FriendlyName);
71+
}
72+
else if (t is Models.Commit commit)
73+
{
74+
var d = commit.Decorators.Find(x =>
75+
{
76+
return x.Type == Models.DecoratorType.LocalBranchHead ||
77+
x.Type == Models.DecoratorType.RemoteBranchHead ||
78+
x.Type == Models.DecoratorType.Tag;
79+
});
80+
81+
if (d != null)
82+
ret.Add(d.Name);
83+
else
84+
ret.Add(commit.SHA);
85+
}
86+
}
87+
88+
return ret;
89+
}
90+
5791
private readonly Repository _repo = null;
5892
}
5993
}

src/ViewModels/Pull.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -172,7 +172,7 @@ public override Task<bool> Sure()
172172
else
173173
{
174174
SetProgressDescription($"Merge {_selectedBranch.FriendlyName} into {_current.Name} ...");
175-
rs = new Commands.Merge(_repo.FullPath, _selectedBranch.FriendlyName, "", null, SetProgressDescription).Exec();
175+
rs = new Commands.Merge(_repo.FullPath, _selectedBranch.FriendlyName, "", SetProgressDescription).Exec();
176176
}
177177
}
178178
else

src/ViewModels/Repository.cs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@
1313
using Avalonia.Threading;
1414

1515
using CommunityToolkit.Mvvm.ComponentModel;
16-
using SourceGit.Models;
1716

1817
namespace SourceGit.ViewModels
1918
{
@@ -954,7 +953,7 @@ public void DeleteMultipleBranches(List<Models.Branch> branches, bool isLocal)
954953
public void MergeMultipleBranches(List<Models.Branch> branches)
955954
{
956955
if (PopupHost.CanCreatePopup())
957-
PopupHost.ShowPopup(new MergeMultiple(this, branches.ConvertAll(b => _histories?.Commits?.Find(c => c.SHA == b.Head))));
956+
PopupHost.ShowPopup(new MergeMultiple(this, branches));
958957
}
959958

960959
public void CreateNewTag()

src/Views/MergeMultiple.axaml

Lines changed: 29 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,14 @@
1212
<TextBlock FontSize="18"
1313
Classes="bold"
1414
Text="{DynamicResource Text.MergeMultiple}"/>
15+
1516
<Grid Margin="0,16,0,0" RowDefinitions="Auto,32,32" ColumnDefinitions="100,*">
1617
<TextBlock Grid.Row="0" Grid.Column="0"
1718
HorizontalAlignment="Right" VerticalAlignment="Center"
1819
Margin="0,0,8,0"
19-
Text="{DynamicResource Text.MergeMultiple.Commit}"/>
20+
Text="{DynamicResource Text.MergeMultiple.Targets}"/>
2021
<ListBox Grid.Row="0" Grid.Column="1"
21-
MinHeight="32" MaxHeight="100"
22+
MinHeight="32" MaxHeight="100" Margin="0,0,0,4"
2223
ItemsSource="{Binding Targets}"
2324
Background="{DynamicResource Brush.Contents}"
2425
BorderThickness="1"
@@ -42,25 +43,34 @@
4243
</ListBox.ItemsPanel>
4344

4445
<ListBox.ItemTemplate>
45-
<DataTemplate DataType="m:Commit">
46-
<Grid ColumnDefinitions="14,Auto,*">
47-
<Path Grid.Column="0" Width="14" Height="14" Margin="0,8,0,0" Data="{StaticResource Icons.Commit}"/>
48-
<TextBlock Grid.Column="1" FontFamily="{DynamicResource Fonts.Monospace}" VerticalAlignment="Center" Text="{Binding SHA, Converter={x:Static c:StringConverters.ToShortSHA}}" Foreground="DarkOrange" Margin="6,0,4,0"/>
49-
<TextBlock Grid.Column="2" VerticalAlignment="Center" Text="{Binding Subject}" TextTrimming="CharacterEllipsis"/>
50-
</Grid>
51-
</DataTemplate>
46+
<DataTemplate>
47+
<ContentControl Content="{Binding}">
48+
<ContentControl.DataTemplates>
49+
<DataTemplate DataType="m:Commit">
50+
<Grid ColumnDefinitions="14,Auto,*">
51+
<Path Grid.Column="0" Width="14" Height="14" Margin="0,8,0,0" Data="{StaticResource Icons.Commit}"/>
52+
<TextBlock Grid.Column="1" FontFamily="{DynamicResource Fonts.Monospace}" VerticalAlignment="Center" Text="{Binding SHA, Converter={x:Static c:StringConverters.ToShortSHA}}" Foreground="DarkOrange" Margin="6,0,4,0"/>
53+
<TextBlock Grid.Column="2" VerticalAlignment="Center" Text="{Binding Subject}" TextTrimming="CharacterEllipsis"/>
54+
</Grid>
55+
</DataTemplate>
56+
57+
<DataTemplate DataType="m:Branch">
58+
<StackPanel Orientation="Horizontal">
59+
<Path Width="14" Height="14" Data="{StaticResource Icons.Branch}"/>
60+
<TextBlock VerticalAlignment="Center" Text="{Binding FriendlyName}" Margin="8,0,0,0"/>
61+
</StackPanel>
62+
</DataTemplate>
63+
</ContentControl.DataTemplates>
64+
</ContentControl>
65+
</DataTemplate>
5266
</ListBox.ItemTemplate>
5367
</ListBox>
54-
55-
<CheckBox Grid.Row="1" Grid.Column="1"
56-
Content="{DynamicResource Text.MergeMultiple.CommitChanges}"
57-
IsChecked="{Binding AutoCommit, Mode=TwoWay}"/>
5868

59-
<TextBlock Grid.Row="2" Grid.Column="0"
69+
<TextBlock Grid.Row="1" Grid.Column="0"
6070
HorizontalAlignment="Right" VerticalAlignment="Center"
6171
Margin="0,0,8,0"
6272
Text="{DynamicResource Text.MergeMultiple.Strategy}"/>
63-
<ComboBox Grid.Row="2" Grid.Column="1"
73+
<ComboBox Grid.Row="1" Grid.Column="1"
6474
Height="28" Padding="8,0"
6575
VerticalAlignment="Center" HorizontalAlignment="Stretch"
6676
ItemsSource="{Binding Source={x:Static m:MergeStrategy.ForMultiple}}"
@@ -74,6 +84,10 @@
7484
</DataTemplate>
7585
</ComboBox.ItemTemplate>
7686
</ComboBox>
87+
88+
<CheckBox Grid.Row="2" Grid.Column="1"
89+
Content="{DynamicResource Text.MergeMultiple.CommitChanges}"
90+
IsChecked="{Binding AutoCommit, Mode=TwoWay}"/>
7791
</Grid>
7892
</StackPanel>
7993
</UserControl>

0 commit comments

Comments
 (0)