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); }