-
Notifications
You must be signed in to change notification settings - Fork 385
Expand file tree
/
Copy pathDeleteBranch.cs
More file actions
95 lines (81 loc) · 3.04 KB
/
DeleteBranch.cs
File metadata and controls
95 lines (81 loc) · 3.04 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
using System.Threading.Tasks;
namespace SourceGit.ViewModels
{
public class DeleteBranch : Popup
{
public Models.Branch Target
{
get;
}
public Models.Branch TrackingRemoteBranch
{
get;
}
public string DeleteTrackingRemoteTip
{
get;
private set;
}
public bool AlsoDeleteTrackingRemote
{
get => _alsoDeleteTrackingRemote;
set => SetProperty(ref _alsoDeleteTrackingRemote, value);
}
public DeleteBranch(Repository repo, Models.Branch branch)
{
_repo = repo;
Target = branch;
if (branch.IsLocal && !string.IsNullOrEmpty(branch.Upstream))
{
TrackingRemoteBranch = repo.Branches.Find(x => x.FullName == branch.Upstream);
if (TrackingRemoteBranch != null)
DeleteTrackingRemoteTip = App.Text("DeleteBranch.WithTrackingRemote", TrackingRemoteBranch.FriendlyName);
}
}
public override async Task<bool> Sure()
{
using var lockWatcher = _repo.LockWatcher();
ProgressDescription = "Deleting branch...";
var log = _repo.CreateLog("Delete Branch");
Use(log);
if (Target.IsLocal)
{
await new Commands.Branch(_repo.FullPath, Target.Name)
.Use(log)
.DeleteLocalAsync();
_repo.UIStates.RemoveHistoryFilter(Target.FullName, Models.FilterType.LocalBranch);
if (_alsoDeleteTrackingRemote && TrackingRemoteBranch != null)
{
await DeleteRemoteBranchAsync(TrackingRemoteBranch, log);
_repo.UIStates.RemoveHistoryFilter(TrackingRemoteBranch.FullName, Models.FilterType.RemoteBranch);
}
}
else
{
await DeleteRemoteBranchAsync(Target, log);
_repo.UIStates.RemoveHistoryFilter(Target.FullName, Models.FilterType.RemoteBranch);
}
log.Complete();
_repo.MarkBranchesDirtyManually();
return true;
}
private async Task DeleteRemoteBranchAsync(Models.Branch branch, CommandLog log)
{
var exists = await new Commands.Remote(_repo.FullPath)
.HasBranchAsync(branch.Remote, branch.Name)
.ConfigureAwait(false);
if (exists)
await new Commands.Push(_repo.FullPath, branch.Remote, $"refs/heads/{branch.Name}", true)
.Use(log)
.RunAsync()
.ConfigureAwait(false);
else
await new Commands.Branch(_repo.FullPath, branch.Name)
.Use(log)
.DeleteRemoteAsync(branch.Remote)
.ConfigureAwait(false);
}
private readonly Repository _repo = null;
private bool _alsoDeleteTrackingRemote = false;
}
}