From 8935bdd4c94b9aa1111affd29fdb1668a9e04051 Mon Sep 17 00:00:00 2001 From: Alberto de la Cruz <32411964+albertodlc@users.noreply.github.com> Date: Wed, 13 Nov 2024 02:33:35 +0100 Subject: [PATCH] feat: delete orphan remote tracking branches (#692) * 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. * fix: delete both case (local & remote-tracking) - We have local and remote-tracking but not a remote branch. We need to remove both or only the tracking based on the checkbox and on the 'hasRemote' condition --- src/Commands/Branch.cs | 22 ++++++++++++++++++++++ src/ViewModels/DeleteBranch.cs | 31 +++++++++++++++++++++++++++---- 2 files changed, 49 insertions(+), 4 deletions(-) diff --git a/src/Commands/Branch.cs b/src/Commands/Branch.cs index 890b54ee..30e216e4 100644 --- a/src/Commands/Branch.cs +++ b/src/Commands/Branch.cs @@ -52,5 +52,27 @@ cmd.Args = $"push {remote} --delete {name}"; 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; + } } } diff --git a/src/ViewModels/DeleteBranch.cs b/src/ViewModels/DeleteBranch.cs index ba1aa839..27e60bbd 100644 --- a/src/ViewModels/DeleteBranch.cs +++ b/src/ViewModels/DeleteBranch.cs @@ -1,4 +1,5 @@ -using System.Threading.Tasks; +using System; +using System.Threading.Tasks; namespace SourceGit.ViewModels { @@ -56,12 +57,34 @@ namespace SourceGit.ViewModels if (_alsoDeleteTrackingRemote && TrackingRemoteBranch != null) { - SetProgressDescription("Deleting tracking remote branch..."); - Commands.Branch.DeleteRemote(_repo.FullPath, TrackingRemoteBranch.Remote, TrackingRemoteBranch.Name); + + if (Commands.Branch.HasRemote(_repo.FullPath, TrackingRemoteBranch.Remote, TrackingRemoteBranch.Name)) + { + SetProgressDescription("Deleting remote-tracking branch and remote branch..."); + + Commands.Branch.DeleteRemote(_repo.FullPath, TrackingRemoteBranch.Remote, TrackingRemoteBranch.Name); + } + else + { + SetProgressDescription("Deleting remote-tracking branch..."); + + var remoteTrackingBranch = $"{TrackingRemoteBranch.Remote}/{TrackingRemoteBranch.Name}"; + + Commands.Branch.DeleteRemoteTracking(_repo.FullPath, remoteTrackingBranch); + } + } } - else + 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 + { + SetProgressDescription("Deleting remote-tracking branch..."); Commands.Branch.DeleteRemote(_repo.FullPath, Target.Remote, Target.Name); }