Skip to content

Commit 9bfc315

Browse files
committed
feature: allow to push revision where local branch is ahead of its upstream (#1394) (#1441)
Signed-off-by: leo <[email protected]>
1 parent 64ffbb1 commit 9bfc315

File tree

7 files changed

+147
-0
lines changed

7 files changed

+147
-0
lines changed

src/Resources/Locales/en_US.axaml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,7 @@
120120
<x:String x:Key="Text.CommitCM.InteractiveRebase" xml:space="preserve">Interactively Rebase ${0}$ on Here</x:String>
121121
<x:String x:Key="Text.CommitCM.Merge" xml:space="preserve">Merge to ${0}$</x:String>
122122
<x:String x:Key="Text.CommitCM.MergeMultiple" xml:space="preserve">Merge ...</x:String>
123+
<x:String x:Key="Text.CommitCM.PushRevision" xml:space="preserve">Push ${0}$ to ${1}$</x:String>
123124
<x:String x:Key="Text.CommitCM.Rebase" xml:space="preserve">Rebase ${0}$ on Here</x:String>
124125
<x:String x:Key="Text.CommitCM.Reset" xml:space="preserve">Reset ${0}$ to Here</x:String>
125126
<x:String x:Key="Text.CommitCM.Revert" xml:space="preserve">Revert Commit</x:String>
@@ -554,6 +555,8 @@
554555
<x:String x:Key="Text.Push.Force" xml:space="preserve">Force push</x:String>
555556
<x:String x:Key="Text.Push.Local" xml:space="preserve">Local Branch:</x:String>
556557
<x:String x:Key="Text.Push.Remote" xml:space="preserve">Remote:</x:String>
558+
<x:String x:Key="Text.Push.Revision" xml:space="preserve">Revision:</x:String>
559+
<x:String x:Key="Text.Push.Revision.Title" xml:space="preserve">Push Revision To Remote</x:String>
557560
<x:String x:Key="Text.Push.Title" xml:space="preserve">Push Changes To Remote</x:String>
558561
<x:String x:Key="Text.Push.To" xml:space="preserve">Remote Branch:</x:String>
559562
<x:String x:Key="Text.Push.Tracking" xml:space="preserve">Set as tracking branch</x:String>

src/Resources/Locales/zh_CN.axaml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,7 @@
124124
<x:String x:Key="Text.CommitCM.InteractiveRebase" xml:space="preserve">交互式变基(rebase -i) ${0}$ 到此处</x:String>
125125
<x:String x:Key="Text.CommitCM.Merge" xml:space="preserve">合并(merge)此提交至 ${0}$</x:String>
126126
<x:String x:Key="Text.CommitCM.MergeMultiple" xml:space="preserve">合并(merge)...</x:String>
127+
<x:String x:Key="Text.CommitCM.PushRevision" xml:space="preserve">推送(push) ${0}$ 到 ${1}$</x:String>
127128
<x:String x:Key="Text.CommitCM.Rebase" xml:space="preserve">变基(rebase) ${0}$ 到此处</x:String>
128129
<x:String x:Key="Text.CommitCM.Reset" xml:space="preserve">重置(reset) ${0}$ 到此处</x:String>
129130
<x:String x:Key="Text.CommitCM.Revert" xml:space="preserve">回滚此提交</x:String>
@@ -558,6 +559,8 @@
558559
<x:String x:Key="Text.Push.Force" xml:space="preserve">启用强制推送</x:String>
559560
<x:String x:Key="Text.Push.Local" xml:space="preserve">本地分支 :</x:String>
560561
<x:String x:Key="Text.Push.Remote" xml:space="preserve">远程仓库 :</x:String>
562+
<x:String x:Key="Text.Push.Revision" xml:space="preserve">修订 :</x:String>
563+
<x:String x:Key="Text.Push.Revision.Title" xml:space="preserve">推送指定修订到远程仓库</x:String>
561564
<x:String x:Key="Text.Push.Title" xml:space="preserve">推送到远程仓库</x:String>
562565
<x:String x:Key="Text.Push.To" xml:space="preserve">远程分支 :</x:String>
563566
<x:String x:Key="Text.Push.Tracking" xml:space="preserve">跟踪远程分支</x:String>

src/Resources/Locales/zh_TW.axaml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,7 @@
124124
<x:String x:Key="Text.CommitCM.InteractiveRebase" xml:space="preserve">互動式重定基底 (rebase -i) ${0}$ 到此處</x:String>
125125
<x:String x:Key="Text.CommitCM.Merge" xml:space="preserve">合併 (merge) 此提交到 ${0}$</x:String>
126126
<x:String x:Key="Text.CommitCM.MergeMultiple" xml:space="preserve">合併 (merge)...</x:String>
127+
<x:String x:Key="Text.CommitCM.PushRevision" xml:space="preserve">推送(push) ${0}$ 至 ${1}$</x:String>
127128
<x:String x:Key="Text.CommitCM.Rebase" xml:space="preserve">重定基底 (rebase) ${0}$ 到此處</x:String>
128129
<x:String x:Key="Text.CommitCM.Reset" xml:space="preserve">重設 (reset) ${0}$ 到此處</x:String>
129130
<x:String x:Key="Text.CommitCM.Revert" xml:space="preserve">復原此提交</x:String>
@@ -558,6 +559,8 @@
558559
<x:String x:Key="Text.Push.Force" xml:space="preserve">啟用強制推送</x:String>
559560
<x:String x:Key="Text.Push.Local" xml:space="preserve">本機分支:</x:String>
560561
<x:String x:Key="Text.Push.Remote" xml:space="preserve">遠端存放庫:</x:String>
562+
<x:String x:Key="Text.Push.Revision" xml:space="preserve">修訂:</x:String>
563+
<x:String x:Key="Text.Push.Revision.Title" xml:space="preserve">推送修訂到遠端存放庫</x:String>
561564
<x:String x:Key="Text.Push.Title" xml:space="preserve">推送到遠端存放庫</x:String>
562565
<x:String x:Key="Text.Push.To" xml:space="preserve">遠端分支:</x:String>
563566
<x:String x:Key="Text.Push.Tracking" xml:space="preserve">追蹤遠端分支</x:String>

src/ViewModels/Histories.cs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -666,6 +666,22 @@ public ContextMenu MakeContextMenu(ListBox list)
666666

667667
if (current.Head != commit.SHA)
668668
{
669+
if (current.TrackStatus.Ahead.Contains(commit.SHA))
670+
{
671+
var upstream = _repo.Branches.Find(x => x.FullName.Equals(current.Upstream, StringComparison.Ordinal));
672+
var pushRevision = new MenuItem();
673+
pushRevision.Header = App.Text("CommitCM.PushRevision", commit.SHA.Substring(0, 10), upstream.FriendlyName);
674+
pushRevision.Icon = App.CreateMenuIcon("Icons.Push");
675+
pushRevision.Click += (_, e) =>
676+
{
677+
if (_repo.CanCreatePopup())
678+
_repo.ShowPopup(new PushRevision(_repo, commit, upstream));
679+
e.Handled = true;
680+
};
681+
menu.Items.Add(pushRevision);
682+
menu.Items.Add(new MenuItem() { Header = "-" });
683+
}
684+
669685
var compareWithHead = new MenuItem();
670686
compareWithHead.Header = App.Text("CommitCM.CompareWithHead");
671687
compareWithHead.Icon = App.CreateMenuIcon("Icons.Compare");

src/ViewModels/PushRevision.cs

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
using System.Threading.Tasks;
2+
3+
namespace SourceGit.ViewModels
4+
{
5+
public class PushRevision : Popup
6+
{
7+
public Models.Commit Revision
8+
{
9+
get;
10+
}
11+
12+
public Models.Branch RemoteBranch
13+
{
14+
get;
15+
}
16+
17+
public bool Force
18+
{
19+
get;
20+
set;
21+
}
22+
23+
public PushRevision(Repository repo, Models.Commit revision, Models.Branch remoteBranch)
24+
{
25+
_repo = repo;
26+
Revision = revision;
27+
RemoteBranch = remoteBranch;
28+
Force = false;
29+
}
30+
31+
public override Task<bool> Sure()
32+
{
33+
_repo.SetWatcherEnabled(false);
34+
ProgressDescription = $"Push {Revision.SHA.Substring(0, 10)} -> {RemoteBranch.FriendlyName} ...";
35+
36+
var log = _repo.CreateLog("Push Revision");
37+
Use(log);
38+
39+
return Task.Run(() =>
40+
{
41+
var succ = new Commands.Push(
42+
_repo.FullPath,
43+
Revision.SHA,
44+
RemoteBranch.Remote,
45+
RemoteBranch.Name,
46+
false,
47+
false,
48+
false,
49+
Force).Use(log).Exec();
50+
51+
log.Complete();
52+
CallUIThread(() => _repo.SetWatcherEnabled(true));
53+
return succ;
54+
});
55+
}
56+
57+
private readonly Repository _repo;
58+
}
59+
}

src/Views/PushRevision.axaml

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
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.PushRevision"
10+
x:DataType="vm:PushRevision">
11+
<StackPanel Orientation="Vertical" Margin="8,0">
12+
<TextBlock FontSize="18"
13+
Classes="bold"
14+
Text="{DynamicResource Text.Push.Revision.Title}"/>
15+
16+
<Grid Margin="0,16,0,0" RowDefinitions="32,32,32" ColumnDefinitions="130,*">
17+
<TextBlock Grid.Row="0" Grid.Column="0"
18+
HorizontalAlignment="Right" VerticalAlignment="Center"
19+
Margin="0,0,8,0"
20+
Text="{DynamicResource Text.Push.Revision}"/>
21+
<Grid Grid.Row="0" Grid.Column="1" ColumnDefinitions="Auto,Auto,*">
22+
<Path Grid.Column="0" Width="14" Height="14" Data="{StaticResource Icons.Commit}"/>
23+
<TextBlock Grid.Column="1"
24+
Classes="primary"
25+
VerticalAlignment="Center"
26+
Text="{Binding Revision.SHA, Converter={x:Static c:StringConverters.ToShortSHA}}"
27+
Foreground="DarkOrange"
28+
Margin="8,0,0,0"/>
29+
<TextBlock Grid.Column="2"
30+
VerticalAlignment="Center"
31+
Text="{Binding Revision.Subject}"
32+
Margin="4,0,0,0"
33+
TextTrimming="CharacterEllipsis"/>
34+
</Grid>
35+
36+
<TextBlock Grid.Row="1" Grid.Column="0"
37+
HorizontalAlignment="Right" VerticalAlignment="Center"
38+
Margin="0,0,8,0"
39+
Text="{DynamicResource Text.Push.To}"/>
40+
<StackPanel Grid.Row="1" Grid.Column="1" Orientation="Horizontal">
41+
<Path Width="14" Height="14" Data="{StaticResource Icons.Branch}"/>
42+
<TextBlock VerticalAlignment="Center" Text="{Binding RemoteBranch.FriendlyName}" Margin="8,0,0,0"/>
43+
</StackPanel>
44+
45+
<CheckBox Grid.Row="2" Grid.Column="1"
46+
Content="{DynamicResource Text.Push.Force}"
47+
IsChecked="{Binding Force, Mode=TwoWay}"
48+
ToolTip.Tip="--force-with-lease"/>
49+
</Grid>
50+
</StackPanel>
51+
</UserControl>

src/Views/PushRevision.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 PushRevision : UserControl
6+
{
7+
public PushRevision()
8+
{
9+
InitializeComponent();
10+
}
11+
}
12+
}

0 commit comments

Comments
 (0)