Skip to content

Commit 8935bdd

Browse files
authored
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
1 parent c16a412 commit 8935bdd

File tree

2 files changed

+49
-4
lines changed

2 files changed

+49
-4
lines changed

src/Commands/Branch.cs

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,5 +52,27 @@ public static bool DeleteRemote(string repo, string remote, string name)
5252
cmd.Args = $"push {remote} --delete {name}";
5353
return cmd.Exec();
5454
}
55+
56+
public static bool DeleteRemoteTracking(string repo, string name)
57+
{
58+
var cmd = new Command();
59+
cmd.WorkingDirectory = repo;
60+
cmd.Context = repo;
61+
cmd.Args = $"branch -D -r {name}";
62+
return cmd.Exec();
63+
}
64+
65+
public static bool HasRemote(string repo, string remote, string name)
66+
{
67+
var cmd = new Command();
68+
cmd.WorkingDirectory = repo;
69+
cmd.Context = repo;
70+
cmd.SSHKey = new Config(repo).Get($"remote.{remote}.sshkey");
71+
cmd.Args = $"ls-remote {remote} {name}";
72+
73+
var rs = cmd.ReadToEnd();
74+
75+
return rs.StdOut.Length > 0;
76+
}
5577
}
5678
}

src/ViewModels/DeleteBranch.cs

Lines changed: 27 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
using System.Threading.Tasks;
1+
using System;
2+
using System.Threading.Tasks;
23

34
namespace SourceGit.ViewModels
45
{
@@ -56,12 +57,34 @@ public override Task<bool> Sure()
5657

5758
if (_alsoDeleteTrackingRemote && TrackingRemoteBranch != null)
5859
{
59-
SetProgressDescription("Deleting tracking remote branch...");
60-
Commands.Branch.DeleteRemote(_repo.FullPath, TrackingRemoteBranch.Remote, TrackingRemoteBranch.Name);
60+
61+
if (Commands.Branch.HasRemote(_repo.FullPath, TrackingRemoteBranch.Remote, TrackingRemoteBranch.Name))
62+
{
63+
SetProgressDescription("Deleting remote-tracking branch and remote branch...");
64+
65+
Commands.Branch.DeleteRemote(_repo.FullPath, TrackingRemoteBranch.Remote, TrackingRemoteBranch.Name);
66+
}
67+
else
68+
{
69+
SetProgressDescription("Deleting remote-tracking branch...");
70+
71+
var remoteTrackingBranch = $"{TrackingRemoteBranch.Remote}/{TrackingRemoteBranch.Name}";
72+
73+
Commands.Branch.DeleteRemoteTracking(_repo.FullPath, remoteTrackingBranch);
74+
}
75+
6176
}
6277
}
63-
else
78+
else if(!Commands.Branch.HasRemote(_repo.FullPath, Target.Remote, Target.Name))
79+
{
80+
SetProgressDescription("Remote branch not found. Deleting remote-tracking branch...");
81+
var remoteTrackingBranch = $"{Target.Remote}/{Target.Name}";
82+
83+
Commands.Branch.DeleteRemoteTracking(_repo.FullPath, remoteTrackingBranch);
84+
}
85+
else
6486
{
87+
SetProgressDescription("Deleting remote-tracking branch...");
6588
Commands.Branch.DeleteRemote(_repo.FullPath, Target.Remote, Target.Name);
6689
}
6790

0 commit comments

Comments
 (0)