Skip to content

Commit 184c89e

Browse files
committed
feature: supports squash multiple commits into selected commit (#408)
1 parent 4f8ccc4 commit 184c89e

File tree

9 files changed

+45
-41
lines changed

9 files changed

+45
-41
lines changed

src/Resources/Locales/de_DE.axaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@
109109
<x:String x:Key="Text.CommitCM.Revert" xml:space="preserve">Commit rückgängig machen</x:String>
110110
<x:String x:Key="Text.CommitCM.Reword" xml:space="preserve">Umformulieren</x:String>
111111
<x:String x:Key="Text.CommitCM.SaveAsPatch" xml:space="preserve">Als Patch speichern...</x:String>
112-
<x:String x:Key="Text.CommitCM.Squash" xml:space="preserve">Squash in den Vorgänger</x:String>
112+
<x:String x:Key="Text.CommitCM.Squash" xml:space="preserve">Squash Commits</x:String>
113113
<x:String x:Key="Text.CommitDetail.Changes" xml:space="preserve">ÄNDERUNGEN</x:String>
114114
<x:String x:Key="Text.CommitDetail.Changes.Search" xml:space="preserve">Änderungen durchsuchen...</x:String>
115115
<x:String x:Key="Text.CommitDetail.Files" xml:space="preserve">DATEIEN</x:String>

src/Resources/Locales/en_US.axaml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,7 @@
107107
<x:String x:Key="Text.CommitCM.Reword" xml:space="preserve">Reword</x:String>
108108
<x:String x:Key="Text.CommitCM.SaveAsPatch" xml:space="preserve">Save as Patch...</x:String>
109109
<x:String x:Key="Text.CommitCM.Squash" xml:space="preserve">Squash Into Parent</x:String>
110+
<x:String x:Key="Text.CommitCM.SquashCommitsSinceThis" xml:space="preserve">Squash Commits since Here</x:String>
110111
<x:String x:Key="Text.CommitDetail.Changes" xml:space="preserve">CHANGES</x:String>
111112
<x:String x:Key="Text.CommitDetail.Changes.Search" xml:space="preserve">Search Changes...</x:String>
112113
<x:String x:Key="Text.CommitDetail.Files" xml:space="preserve">FILES</x:String>
@@ -531,7 +532,7 @@
531532
<x:String x:Key="Text.SelfUpdate.IgnoreThisVersion" xml:space="preserve">Skip This Version</x:String>
532533
<x:String x:Key="Text.SelfUpdate.Title" xml:space="preserve">Software Update</x:String>
533534
<x:String x:Key="Text.SelfUpdate.UpToDate" xml:space="preserve">There are currently no updates available.</x:String>
534-
<x:String x:Key="Text.Squash" xml:space="preserve">Squash HEAD Into Parent</x:String>
535+
<x:String x:Key="Text.Squash" xml:space="preserve">Squash Commits</x:String>
535536
<x:String x:Key="Text.SSHKey" xml:space="preserve">SSH Private Key:</x:String>
536537
<x:String x:Key="Text.SSHKey.Placeholder" xml:space="preserve">Private SSH key store path</x:String>
537538
<x:String x:Key="Text.Start" xml:space="preserve">START</x:String>

src/Resources/Locales/fr_FR.axaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -534,7 +534,7 @@
534534
<x:String x:Key="Text.SelfUpdate.IgnoreThisVersion" xml:space="preserve">Passer cette version</x:String>
535535
<x:String x:Key="Text.SelfUpdate.Title" xml:space="preserve">Mise à jour du logiciel</x:String>
536536
<x:String x:Key="Text.SelfUpdate.UpToDate" xml:space="preserve">Il n'y a pas de mise à jour pour le moment.</x:String>
537-
<x:String x:Key="Text.Squash" xml:space="preserve">Squash HEAD Into Parent</x:String>
537+
<x:String x:Key="Text.Squash" xml:space="preserve">Squash Commits</x:String>
538538
<x:String x:Key="Text.SSHKey" xml:space="preserve">SSH Private Key:</x:String>
539539
<x:String x:Key="Text.SSHKey.Placeholder" xml:space="preserve">Private SSH key store path</x:String>
540540
<x:String x:Key="Text.Start" xml:space="preserve">START</x:String>

src/Resources/Locales/pt_BR.axaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -527,7 +527,7 @@
527527
<x:String x:Key="Text.SelfUpdate.IgnoreThisVersion" xml:space="preserve">Ignorar esta versão</x:String>
528528
<x:String x:Key="Text.SelfUpdate.Title" xml:space="preserve">Atualização de Software</x:String>
529529
<x:String x:Key="Text.SelfUpdate.UpToDate" xml:space="preserve">Não há atualizações disponíveis no momento.</x:String>
530-
<x:String x:Key="Text.Squash" xml:space="preserve">Unir HEAD ao Parent</x:String>
530+
<x:String x:Key="Text.Squash" xml:space="preserve">Squash Commits</x:String>
531531
<x:String x:Key="Text.SSHKey" xml:space="preserve">Chave SSH Privada:</x:String>
532532
<x:String x:Key="Text.SSHKey.Placeholder" xml:space="preserve">Caminho para a chave SSH privada</x:String>
533533
<x:String x:Key="Text.Start" xml:space="preserve">INICIAR</x:String>

src/Resources/Locales/zh_CN.axaml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,7 @@
110110
<x:String x:Key="Text.CommitCM.Reword" xml:space="preserve">编辑提交信息</x:String>
111111
<x:String x:Key="Text.CommitCM.SaveAsPatch" xml:space="preserve">另存为补丁 ...</x:String>
112112
<x:String x:Key="Text.CommitCM.Squash" xml:space="preserve">合并此提交到上一个提交</x:String>
113+
<x:String x:Key="Text.CommitCM.SquashCommitsSinceThis" xml:space="preserve">合并之后的提交到此处</x:String>
113114
<x:String x:Key="Text.CommitDetail.Changes" xml:space="preserve">变更对比</x:String>
114115
<x:String x:Key="Text.CommitDetail.Changes.Search" xml:space="preserve">查找变更...</x:String>
115116
<x:String x:Key="Text.CommitDetail.Files" xml:space="preserve">文件列表</x:String>
@@ -533,7 +534,7 @@
533534
<x:String x:Key="Text.SelfUpdate.IgnoreThisVersion" xml:space="preserve">忽略此版本</x:String>
534535
<x:String x:Key="Text.SelfUpdate.Title" xml:space="preserve">软件更新</x:String>
535536
<x:String x:Key="Text.SelfUpdate.UpToDate" xml:space="preserve">当前已是最新版本。</x:String>
536-
<x:String x:Key="Text.Squash" xml:space="preserve">合并HEAD到上一个提交</x:String>
537+
<x:String x:Key="Text.Squash" xml:space="preserve">压缩为单个提交</x:String>
537538
<x:String x:Key="Text.SSHKey" xml:space="preserve">SSH密钥 :</x:String>
538539
<x:String x:Key="Text.SSHKey.Placeholder" xml:space="preserve">SSH密钥文件</x:String>
539540
<x:String x:Key="Text.Start" xml:space="preserve">开 始</x:String>

src/Resources/Locales/zh_TW.axaml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,7 @@
110110
<x:String x:Key="Text.CommitCM.Reword" xml:space="preserve">編輯提交訊息</x:String>
111111
<x:String x:Key="Text.CommitCM.SaveAsPatch" xml:space="preserve">另存為修補檔 (patch)...</x:String>
112112
<x:String x:Key="Text.CommitCM.Squash" xml:space="preserve">合併此提交到上一個提交</x:String>
113+
<x:String x:Key="Text.CommitCM.SquashCommitsSinceThis" xml:space="preserve">合併之後的提交到此處</x:String>
113114
<x:String x:Key="Text.CommitDetail.Changes" xml:space="preserve">變更對比</x:String>
114115
<x:String x:Key="Text.CommitDetail.Changes.Search" xml:space="preserve">搜尋變更...</x:String>
115116
<x:String x:Key="Text.CommitDetail.Files" xml:space="preserve">檔案列表</x:String>
@@ -534,7 +535,7 @@
534535
<x:String x:Key="Text.SelfUpdate.IgnoreThisVersion" xml:space="preserve">忽略此版本</x:String>
535536
<x:String x:Key="Text.SelfUpdate.Title" xml:space="preserve">軟體更新</x:String>
536537
<x:String x:Key="Text.SelfUpdate.UpToDate" xml:space="preserve">目前已是最新版本。</x:String>
537-
<x:String x:Key="Text.Squash" xml:space="preserve">合併 HEAD 至前次提交</x:String>
538+
<x:String x:Key="Text.Squash" xml:space="preserve">壓縮為單個提交</x:String>
538539
<x:String x:Key="Text.SSHKey" xml:space="preserve">SSH 金鑰:</x:String>
539540
<x:String x:Key="Text.SSHKey.Placeholder" xml:space="preserve">SSH 金鑰檔案</x:String>
540541
<x:String x:Key="Text.Start" xml:space="preserve">開 始</x:String>

src/ViewModels/Histories.cs

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
using System;
22
using System.Collections;
33
using System.Collections.Generic;
4+
45
using Avalonia.Controls;
56
using Avalonia.Platform.Storage;
67
using Avalonia.VisualTree;
8+
79
using CommunityToolkit.Mvvm.ComponentModel;
810

911
namespace SourceGit.ViewModels
@@ -240,6 +242,25 @@ public ContextMenu MakeContextMenu(DataGrid datagrid)
240242
e.Handled = true;
241243
};
242244
menu.Items.Add(reset);
245+
246+
var squash = new MenuItem();
247+
squash.Header = App.Text("CommitCM.SquashCommitsSinceThis");
248+
squash.Icon = App.CreateMenuIcon("Icons.SquashIntoParent");
249+
squash.IsVisible = commit.IsMerged;
250+
squash.Click += (_, e) =>
251+
{
252+
if (_repo.LocalChangesCount > 0)
253+
{
254+
App.RaiseException(_repo.FullPath, "You have local changes. Please run stash or discard first.");
255+
return;
256+
}
257+
258+
if (PopupHost.CanCreatePopup())
259+
PopupHost.ShowPopup(new Squash(_repo, commit, commit.SHA));
260+
261+
e.Handled = true;
262+
};
263+
menu.Items.Add(squash);
243264
}
244265
else
245266
{
@@ -276,7 +297,7 @@ public ContextMenu MakeContextMenu(DataGrid datagrid)
276297
{
277298
var parent = _commits.Find(x => x.SHA == commit.Parents[0]);
278299
if (parent != null && PopupHost.CanCreatePopup())
279-
PopupHost.ShowPopup(new Squash(_repo, commit, parent));
300+
PopupHost.ShowPopup(new Squash(_repo, parent, commit.SHA));
280301
}
281302

282303
e.Handled = true;

src/ViewModels/Squash.cs

Lines changed: 8 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -5,16 +5,9 @@ namespace SourceGit.ViewModels
55
{
66
public class Squash : Popup
77
{
8-
public Models.Commit Head
8+
public Models.Commit Target
99
{
10-
get;
11-
private set;
12-
}
13-
14-
public Models.Commit Parent
15-
{
16-
get;
17-
private set;
10+
get => _target;
1811
}
1912

2013
[Required(ErrorMessage = "Commit message is required!!!")]
@@ -24,13 +17,12 @@ public string Message
2417
set => SetProperty(ref _message, value, true);
2518
}
2619

27-
public Squash(Repository repo, Models.Commit head, Models.Commit parent)
20+
public Squash(Repository repo, Models.Commit target, string shaToGetPreferMessage)
2821
{
2922
_repo = repo;
30-
_message = new Commands.QueryCommitFullMessage(_repo.FullPath, head.SHA).Result();
31-
32-
Head = head;
33-
Parent = parent;
23+
_target = target;
24+
_message = new Commands.QueryCommitFullMessage(_repo.FullPath, shaToGetPreferMessage).Result();
25+
3426
View = new Views.Squash() { DataContext = this };
3527
}
3628

@@ -41,7 +33,7 @@ public override Task<bool> Sure()
4133

4234
return Task.Run(() =>
4335
{
44-
var succ = new Commands.Reset(_repo.FullPath, Parent.SHA, "--soft").Exec();
36+
var succ = new Commands.Reset(_repo.FullPath, Target.SHA, "--soft").Exec();
4537
if (succ)
4638
succ = new Commands.Commit(_repo.FullPath, _message, true).Exec();
4739
CallUIThread(() => _repo.SetWatcherEnabled(true));
@@ -50,6 +42,7 @@ public override Task<bool> Sure()
5042
}
5143

5244
private readonly Repository _repo;
45+
private Models.Commit _target;
5346
private string _message;
5447
}
5548
}

src/Views/Squash.axaml

Lines changed: 6 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -13,30 +13,17 @@
1313
Classes="bold"
1414
Text="{DynamicResource Text.Squash}"/>
1515

16-
<Grid Margin="0,18,0,0" ColumnDefinitions="Auto,Auto,Auto,Auto,*">
17-
<Border Grid.Column="0" Background="{DynamicResource Brush.Accent}" CornerRadius="4">
18-
<TextBlock Text="HEAD" Classes="primary" Margin="4,0" Foreground="#FFDDDDDD"/>
19-
</Border>
20-
21-
<Path Grid.Column="1"
22-
Width="14" Height="14"
23-
Margin="12,0,0,0"
24-
Fill="{DynamicResource Brush.FG1}"
25-
Data="{StaticResource Icons.Down}"
26-
VerticalAlignment="Center"
27-
RenderTransformOrigin="50%,50%"
28-
RenderTransform="rotate(270deg)"/>
29-
30-
<Path Grid.Column="2"
31-
Margin="6,6,8,0"
16+
<Grid Margin="0,18,0,0" ColumnDefinitions="Auto,Auto,*">
17+
<Path Grid.Column="0"
18+
Margin="2,6,8,0"
3219
Width="14" Height="14"
3320
Fill="{DynamicResource Brush.FG1}"
3421
Data="{StaticResource Icons.Commit}"/>
35-
<TextBlock Grid.Column="3"
22+
<TextBlock Grid.Column="1"
3623
Classes="primary"
37-
Text="{Binding Parent.SHA, Converter={x:Static c:StringConverters.ToShortSHA}}"
24+
Text="{Binding Target.SHA, Converter={x:Static c:StringConverters.ToShortSHA}}"
3825
Foreground="DarkOrange"/>
39-
<TextBlock Grid.Column="4" Margin="8,0,0,0" Text="{Binding Parent.Subject}" TextTrimming="CharacterEllipsis"/>
26+
<TextBlock Grid.Column="2" Margin="8,0,0,0" Text="{Binding Target.Subject}" TextTrimming="CharacterEllipsis"/>
4027
</Grid>
4128

4229
<v:CommitMessageTextBox Height="120" Margin="0,4,0,0" Text="{Binding Message, Mode=TwoWay}"/>

0 commit comments

Comments
 (0)