feature<Fast-Forward>: allow fast-forward on local branch that not checked out.

This commit is contained in:
leo 2023-08-18 13:29:44 +08:00
parent 12511007e3
commit 9d6ac9c449
4 changed files with 88 additions and 1 deletions

View file

@ -29,6 +29,22 @@ namespace SourceGit.Commands {
AutoFetch.MarkFetched(repo);
}
public Fetch(string repo, string remote, string localBranch, string remoteBranch, Action<string> outputHandler) {
Cwd = repo;
TraitErrorAsOutput = true;
var sshKey = new Config(repo).Get($"remote.{remote}.sshkey");
if (!string.IsNullOrEmpty(sshKey)) {
Envs.Add("GIT_SSH_COMMAND", $"ssh -i '{sshKey}'");
Args = "";
} else {
Args = "-c credential.helper=manager-core ";
}
Args += $"fetch --progress --verbose {remote} {remoteBranch}:{localBranch}";
handler = outputHandler;
}
public override void OnReadline(string line) {
handler?.Invoke(line);
}

View file

@ -0,0 +1,10 @@
<controls:PopupWidget
x:Class="SourceGit.Views.Popups.FastForwardWithoutCheckout"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:controls="clr-namespace:SourceGit.Views.Controls"
mc:Ignorable="d"
d:DesignWidth="500" Height="100">
</controls:PopupWidget>

View file

@ -0,0 +1,46 @@
using System.Threading.Tasks;
namespace SourceGit.Views.Popups {
/// <summary>
/// 对于不是当前分支的本地分支Fast-Forward
/// </summary>
public partial class FastForwardWithoutCheckout : Controls.PopupWidget {
private string repo = null;
private string remote = null;
private string localBranch = null;
private string remoteBranch = null;
private bool isValid = false;
public FastForwardWithoutCheckout(string repo, string branch, string upstream) {
int idx = upstream.IndexOf('/');
if (idx < 0 || idx == upstream.Length - 1) {
Models.Exception.Raise($"Invalid upstream: {upstream}");
return;
}
this.repo = repo;
this.remote = upstream.Substring(0, idx);
this.localBranch = branch;
this.remoteBranch = upstream.Substring(idx+1);
this.isValid = true;
InitializeComponent();
}
public override string GetTitle() {
return App.Text("Fetch.Title");
}
public override Task<bool> Start() {
return Task.Run(() => {
if (isValid) {
Models.Watcher.SetEnabled(repo, false);
new Commands.Fetch(repo, remote, localBranch, remoteBranch, UpdateProgress).Exec();
Models.Watcher.SetEnabled(repo, true);
}
return true;
});
}
}
}

View file

@ -654,7 +654,7 @@ namespace SourceGit.Views.Widgets {
var upstream = branch.Upstream.Substring(13);
var fastForward = new MenuItem();
fastForward.Header = App.Text("BranchCM.FastForward", upstream);
fastForward.IsEnabled = !string.IsNullOrEmpty(branch.UpstreamTrackStatus);
fastForward.IsEnabled = !string.IsNullOrEmpty(branch.UpstreamTrackStatus) && branch.UpstreamTrackStatus.IndexOf('↑') < 0;
fastForward.Click += (o, e) => {
new Popups.Merge(repo.Path, upstream, branch.Name).ShowAndStart();
e.Handled = true;
@ -683,6 +683,21 @@ namespace SourceGit.Views.Widgets {
e.Handled = true;
};
menu.Items.Add(checkout);
if (!string.IsNullOrEmpty(branch.Upstream)) {
var upstream = branch.Upstream.Substring(13);
var fastForward = new MenuItem();
fastForward.Header = App.Text("BranchCM.FastForward", upstream);
fastForward.IsEnabled = !string.IsNullOrEmpty(branch.UpstreamTrackStatus) && branch.UpstreamTrackStatus.IndexOf('↑') < 0;
fastForward.Click += (o, e) => {
new Popups.FastForwardWithoutCheckout(repo.Path, branch.Name, upstream).ShowAndStart();
e.Handled = true;
};
menu.Items.Add(new Separator());
menu.Items.Add(fastForward);
}
menu.Items.Add(new Separator());
menu.Items.Add(push);