From 67e3128c807f95db3b90e4dc681364c606b84133 Mon Sep 17 00:00:00 2001 From: adelacruz Date: Tue, 12 Nov 2024 20:12:49 +0100 Subject: [PATCH 1/2] 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. --- src/Commands/Branch.cs | 22 ++++++++++++++++++++++ src/ViewModels/DeleteBranch.cs | 15 ++++++++++++--- 2 files changed, 34 insertions(+), 3 deletions(-) diff --git a/src/Commands/Branch.cs b/src/Commands/Branch.cs index 890b54ee3..30e216e4a 100644 --- a/src/Commands/Branch.cs +++ b/src/Commands/Branch.cs @@ -52,5 +52,27 @@ public static bool DeleteRemote(string repo, string remote, string name) 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 ba1aa8393..86addf287 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,20 @@ public override Task Sure() if (_alsoDeleteTrackingRemote && TrackingRemoteBranch != null) { - SetProgressDescription("Deleting tracking remote branch..."); + SetProgressDescription("Deleting remote-tracking branch..."); Commands.Branch.DeleteRemote(_repo.FullPath, TrackingRemoteBranch.Remote, TrackingRemoteBranch.Name); } } - 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); } From ec2057dca77de1a02b463cdb04d73ca37277d1e5 Mon Sep 17 00:00:00 2001 From: adelacruz Date: Tue, 12 Nov 2024 20:37:46 +0100 Subject: [PATCH 2/2] 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/ViewModels/DeleteBranch.cs | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/src/ViewModels/DeleteBranch.cs b/src/ViewModels/DeleteBranch.cs index 86addf287..27e60bbd1 100644 --- a/src/ViewModels/DeleteBranch.cs +++ b/src/ViewModels/DeleteBranch.cs @@ -57,8 +57,22 @@ public override Task Sure() if (_alsoDeleteTrackingRemote && TrackingRemoteBranch != null) { - SetProgressDescription("Deleting remote-tracking 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 if(!Commands.Branch.HasRemote(_repo.FullPath, Target.Remote, Target.Name))