feat: remove orphan remote-tracking branches

- Allow user remove local remote-tracking branches without remotes (ie. remote was removed on merge request).
- Included 'DeleteRemoteTracking' and 'HasRemote' util methods to handle this case.
This commit is contained in:
adelacruz 2024-11-12 20:12:49 +01:00
parent c16a412aa3
commit 67e3128c80
2 changed files with 34 additions and 3 deletions

View file

@ -52,5 +52,27 @@
cmd.Args = $"push {remote} --delete {name}"; cmd.Args = $"push {remote} --delete {name}";
return cmd.Exec(); return cmd.Exec();
} }
public static bool DeleteRemoteTracking(string repo, string name)
{
var cmd = new Command();
cmd.WorkingDirectory = repo;
cmd.Context = repo;
cmd.Args = $"branch -D -r {name}";
return cmd.Exec();
}
public static bool HasRemote(string repo, string remote, string name)
{
var cmd = new Command();
cmd.WorkingDirectory = repo;
cmd.Context = repo;
cmd.SSHKey = new Config(repo).Get($"remote.{remote}.sshkey");
cmd.Args = $"ls-remote {remote} {name}";
var rs = cmd.ReadToEnd();
return rs.StdOut.Length > 0;
}
} }
} }

View file

@ -1,4 +1,5 @@
using System.Threading.Tasks; using System;
using System.Threading.Tasks;
namespace SourceGit.ViewModels namespace SourceGit.ViewModels
{ {
@ -56,12 +57,20 @@ namespace SourceGit.ViewModels
if (_alsoDeleteTrackingRemote && TrackingRemoteBranch != null) if (_alsoDeleteTrackingRemote && TrackingRemoteBranch != null)
{ {
SetProgressDescription("Deleting tracking remote branch..."); SetProgressDescription("Deleting remote-tracking branch...");
Commands.Branch.DeleteRemote(_repo.FullPath, TrackingRemoteBranch.Remote, TrackingRemoteBranch.Name); Commands.Branch.DeleteRemote(_repo.FullPath, TrackingRemoteBranch.Remote, TrackingRemoteBranch.Name);
} }
} }
else if(!Commands.Branch.HasRemote(_repo.FullPath, Target.Remote, Target.Name))
{
SetProgressDescription("Remote branch not found. Deleting remote-tracking branch...");
var remoteTrackingBranch = $"{Target.Remote}/{Target.Name}";
Commands.Branch.DeleteRemoteTracking(_repo.FullPath, remoteTrackingBranch);
}
else else
{ {
SetProgressDescription("Deleting remote-tracking branch...");
Commands.Branch.DeleteRemote(_repo.FullPath, Target.Remote, Target.Name); Commands.Branch.DeleteRemote(_repo.FullPath, Target.Remote, Target.Name);
} }