Skip to content

Commit 77b0fde

Browse files
committed
feature: supports to drop HEAD commit (reset to its first parent) (#1832)
Signed-off-by: leo <[email protected]>
1 parent 93edb8e commit 77b0fde

File tree

8 files changed

+147
-1
lines changed

8 files changed

+147
-1
lines changed

src/Resources/Locales/en_US.axaml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,7 @@
135135
<x:String x:Key="Text.CommitCM.CopySHA" xml:space="preserve">SHA</x:String>
136136
<x:String x:Key="Text.CommitCM.CopySubject" xml:space="preserve">Subject</x:String>
137137
<x:String x:Key="Text.CommitCM.CustomAction" xml:space="preserve">Custom Action</x:String>
138+
<x:String x:Key="Text.CommitCM.Drop" xml:space="preserve">Drop Commit</x:String>
138139
<x:String x:Key="Text.CommitCM.InteractiveRebase" xml:space="preserve">Interactive Rebase</x:String>
139140
<x:String x:Key="Text.CommitCM.InteractiveRebase.Drop" xml:space="preserve">Drop...</x:String>
140141
<x:String x:Key="Text.CommitCM.InteractiveRebase.Edit" xml:space="preserve">Edit...</x:String>
@@ -355,6 +356,9 @@
355356
<x:String x:Key="Text.Discard.IncludeUntracked" xml:space="preserve">Include untracked files</x:String>
356357
<x:String x:Key="Text.Discard.Total" xml:space="preserve">{0} changes will be discarded</x:String>
357358
<x:String x:Key="Text.Discard.Warning" xml:space="preserve">You can't undo this action!!!</x:String>
359+
<x:String x:Key="Text.DropHead" xml:space="preserve">Drop Commit</x:String>
360+
<x:String x:Key="Text.DropHead.Commit" xml:space="preserve">Commit:</x:String>
361+
<x:String x:Key="Text.DropHead.NewHead" xml:space="preserve">New HEAD:</x:String>
358362
<x:String x:Key="Text.EditRepositoryNode.Bookmark" xml:space="preserve">Bookmark:</x:String>
359363
<x:String x:Key="Text.EditRepositoryNode.Name" xml:space="preserve">New Name:</x:String>
360364
<x:String x:Key="Text.EditRepositoryNode.Target" xml:space="preserve">Target:</x:String>

src/Resources/Locales/zh_CN.axaml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,7 @@
139139
<x:String x:Key="Text.CommitCM.CopySHA" xml:space="preserve">提交指纹</x:String>
140140
<x:String x:Key="Text.CommitCM.CopySubject" xml:space="preserve">主题</x:String>
141141
<x:String x:Key="Text.CommitCM.CustomAction" xml:space="preserve">自定义操作</x:String>
142+
<x:String x:Key="Text.CommitCM.Drop" xml:space="preserve">丢弃此提交</x:String>
142143
<x:String x:Key="Text.CommitCM.InteractiveRebase" xml:space="preserve">交互式变基(rebase -i)</x:String>
143144
<x:String x:Key="Text.CommitCM.InteractiveRebase.Drop" xml:space="preserve">丢弃...</x:String>
144145
<x:String x:Key="Text.CommitCM.InteractiveRebase.Edit" xml:space="preserve">编辑...</x:String>
@@ -359,6 +360,9 @@
359360
<x:String x:Key="Text.Discard.IncludeUntracked" xml:space="preserve">包括未跟踪的文件</x:String>
360361
<x:String x:Key="Text.Discard.Total" xml:space="preserve">总计{0}项选中更改</x:String>
361362
<x:String x:Key="Text.Discard.Warning" xml:space="preserve">本操作不支持回退,请确认后继续!!!</x:String>
363+
<x:String x:Key="Text.DropHead" xml:space="preserve">丢弃提交</x:String>
364+
<x:String x:Key="Text.DropHead.Commit" xml:space="preserve">提交 :</x:String>
365+
<x:String x:Key="Text.DropHead.NewHead" xml:space="preserve">丢弃后 HEAD :</x:String>
362366
<x:String x:Key="Text.EditRepositoryNode.Bookmark" xml:space="preserve">书签 :</x:String>
363367
<x:String x:Key="Text.EditRepositoryNode.Name" xml:space="preserve">名称 :</x:String>
364368
<x:String x:Key="Text.EditRepositoryNode.Target" xml:space="preserve">目标 :</x:String>

src/Resources/Locales/zh_TW.axaml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,7 @@
139139
<x:String x:Key="Text.CommitCM.CopySHA" xml:space="preserve">提交編號</x:String>
140140
<x:String x:Key="Text.CommitCM.CopySubject" xml:space="preserve">標題</x:String>
141141
<x:String x:Key="Text.CommitCM.CustomAction" xml:space="preserve">自訂動作</x:String>
142+
<x:String x:Key="Text.CommitCM.Drop" xml:space="preserve">捨棄此提交</x:String>
142143
<x:String x:Key="Text.CommitCM.InteractiveRebase" xml:space="preserve">互動式重定基底 (rebase -i)</x:String>
143144
<x:String x:Key="Text.CommitCM.InteractiveRebase.Drop" xml:space="preserve">捨棄...</x:String>
144145
<x:String x:Key="Text.CommitCM.InteractiveRebase.Edit" xml:space="preserve">編輯...</x:String>
@@ -359,6 +360,9 @@
359360
<x:String x:Key="Text.Discard.IncludeUntracked" xml:space="preserve">包含未追蹤檔案</x:String>
360361
<x:String x:Key="Text.Discard.Total" xml:space="preserve">將捨棄總計 {0} 項已選取的變更</x:String>
361362
<x:String x:Key="Text.Discard.Warning" xml:space="preserve">您無法復原此操作,請確認後再繼續!</x:String>
363+
<x:String x:Key="Text.DropHead" xml:space="preserve">捨棄提交</x:String>
364+
<x:String x:Key="Text.DropHead.Commit" xml:space="preserve">提交 :</x:String>
365+
<x:String x:Key="Text.DropHead.NewHead" xml:space="preserve">捨棄後新的 HEAD :</x:String>
362366
<x:String x:Key="Text.EditRepositoryNode.Bookmark" xml:space="preserve">書籤:</x:String>
363367
<x:String x:Key="Text.EditRepositoryNode.Name" xml:space="preserve">名稱:</x:String>
364368
<x:String x:Key="Text.EditRepositoryNode.Target" xml:space="preserve">目標:</x:String>

src/ViewModels/DropHead.cs

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
using System.Threading.Tasks;
2+
3+
namespace SourceGit.ViewModels
4+
{
5+
public class DropHead : Popup
6+
{
7+
public Models.Commit Target
8+
{
9+
get;
10+
}
11+
12+
public Models.Commit NewHead
13+
{
14+
get;
15+
}
16+
17+
public DropHead(Repository repo, Models.Commit target, Models.Commit parent)
18+
{
19+
_repo = repo;
20+
Target = target;
21+
NewHead = parent;
22+
}
23+
24+
public override async Task<bool> Sure()
25+
{
26+
using var lockWatcher = _repo.LockWatcher();
27+
ProgressDescription = $"Drop HEAD '{Target.SHA}' ...";
28+
29+
var log = _repo.CreateLog($"Drop '{Target.SHA}'");
30+
Use(log);
31+
32+
var changes = await new Commands.QueryLocalChanges(_repo.FullPath, true).GetResultAsync();
33+
var needAutoStash = changes.Count > 0;
34+
var succ = false;
35+
36+
if (needAutoStash)
37+
{
38+
succ = await new Commands.Stash(_repo.FullPath)
39+
.Use(log)
40+
.PushAsync("DROP_HEAD_AUTO_STASH", true);
41+
if (!succ)
42+
{
43+
log.Complete();
44+
return false;
45+
}
46+
}
47+
48+
succ = await new Commands.Reset(_repo.FullPath, NewHead.SHA, "--hard")
49+
.Use(log)
50+
.ExecAsync();
51+
52+
if (succ && needAutoStash)
53+
await new Commands.Stash(_repo.FullPath)
54+
.Use(log)
55+
.PopAsync("stash@{0}");
56+
57+
log.Complete();
58+
return succ;
59+
}
60+
61+
private readonly Repository _repo;
62+
}
63+
}

src/ViewModels/Histories.cs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -332,6 +332,16 @@ public async Task SquashHeadAsync(Models.Commit head)
332332
}
333333
}
334334

335+
public async Task DropHeadAsync(Models.Commit head)
336+
{
337+
var parent = _commits.Find(x => x.SHA.Equals(head.Parents[0]));
338+
if (parent == null)
339+
parent = await new Commands.QuerySingleCommit(_repo.FullPath, head.Parents[0]).GetResultAsync();
340+
341+
if (parent != null && _repo.CanCreatePopup())
342+
_repo.ShowPopup(new DropHead(_repo, head, parent));
343+
}
344+
335345
public async Task InteractiveRebaseAsync(Models.Commit commit, Models.InteractiveRebaseAction act)
336346
{
337347
var prefill = new InteractiveRebasePrefill(commit.SHA, act);

src/Views/DropHead.axaml

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
<UserControl xmlns="https://github.com/avaloniaui"
2+
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
3+
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
4+
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
5+
xmlns:m="using:SourceGit.Models"
6+
xmlns:vm="using:SourceGit.ViewModels"
7+
xmlns:c="using:SourceGit.Converters"
8+
mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
9+
x:Class="SourceGit.Views.DropHead"
10+
x:DataType="vm:DropHead">
11+
<StackPanel Orientation="Vertical" Margin="8,0">
12+
<TextBlock FontSize="18"
13+
Classes="bold"
14+
Text="{DynamicResource Text.DropHead}"/>
15+
<Grid Margin="0,16,0,0" RowDefinitions="32,24" ColumnDefinitions="140,*">
16+
<TextBlock Grid.Row="0" Grid.Column="0"
17+
HorizontalAlignment="Right" VerticalAlignment="Center"
18+
Margin="0,0,8,0"
19+
Text="{DynamicResource Text.DropHead.Commit}"/>
20+
<Grid Grid.Row="0" Grid.Column="1" ColumnDefinitions="Auto,Auto,*" Height="20" VerticalAlignment="Center">
21+
<Path Grid.Column="0" Margin="0,0,8,0" Width="14" Height="14" Fill="{DynamicResource Brush.FG1}" Data="{StaticResource Icons.Commit}"/>
22+
<TextBlock Grid.Column="1" Classes="primary" Text="{Binding Target.SHA, Converter={x:Static c:StringConverters.ToShortSHA}}" Foreground="DarkOrange"/>
23+
<TextBlock Grid.Column="2" Text="{Binding Target.Subject}" Margin="8,0,0,0" TextTrimming="CharacterEllipsis"/>
24+
</Grid>
25+
26+
<TextBlock Grid.Row="1" Grid.Column="0"
27+
HorizontalAlignment="Right" VerticalAlignment="Center"
28+
Margin="0,0,8,0"
29+
Text="{DynamicResource Text.DropHead.NewHead}"/>
30+
<Grid Grid.Row="1" Grid.Column="1" ColumnDefinitions="Auto,Auto,*" Height="20" VerticalAlignment="Center">
31+
<Path Grid.Column="0" Margin="0,0,8,0" Width="14" Height="14" Fill="{DynamicResource Brush.FG1}" Data="{StaticResource Icons.Commit}"/>
32+
<TextBlock Grid.Column="1" Classes="primary" Text="{Binding NewHead.SHA, Converter={x:Static c:StringConverters.ToShortSHA}}" Foreground="DarkOrange"/>
33+
<TextBlock Grid.Column="2" Text="{Binding NewHead.Subject}" Margin="8,0,0,0" TextTrimming="CharacterEllipsis"/>
34+
</Grid>
35+
</Grid>
36+
</StackPanel>
37+
</UserControl>

src/Views/DropHead.axaml.cs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
using Avalonia.Controls;
2+
3+
namespace SourceGit.Views
4+
{
5+
public partial class DropHead : UserControl
6+
{
7+
public DropHead()
8+
{
9+
InitializeComponent();
10+
}
11+
}
12+
}

src/Views/Histories.axaml.cs

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -610,7 +610,19 @@ private ContextMenu CreateContextMenuForSingleCommit(ViewModels.Repository repo,
610610
};
611611
menu.Items.Add(revert);
612612

613-
if (!isHead)
613+
if (isHead)
614+
{
615+
var dropHead = new MenuItem();
616+
dropHead.Header = App.Text("CommitCM.Drop");
617+
dropHead.Icon = App.CreateMenuIcon("Icons.Clear");
618+
dropHead.Click += async (_, e) =>
619+
{
620+
await vm.DropHeadAsync(commit);
621+
e.Handled = true;
622+
};
623+
menu.Items.Add(dropHead);
624+
}
625+
else
614626
{
615627
var checkoutCommit = new MenuItem();
616628
checkoutCommit.Header = App.Text("CommitCM.Checkout");

0 commit comments

Comments
 (0)