Skip to content

Commit f7b2063

Browse files
committed
refactor: rewrite integration for git branch command
Signed-off-by: leo <[email protected]>
1 parent b2aac68 commit f7b2063

File tree

8 files changed

+83
-55
lines changed

8 files changed

+83
-55
lines changed

src/Commands/Branch.cs

Lines changed: 23 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,15 @@
33

44
namespace SourceGit.Commands
55
{
6-
public static class Branch
6+
public class Branch : Command
77
{
8-
public static async Task<bool> CreateAsync(string repo, string name, string basedOn, bool force, Models.ICommandLog log)
8+
public Branch(string repo)
9+
{
10+
WorkingDirectory = repo;
11+
Context = repo;
12+
}
13+
14+
public async Task<bool> CreateAsync(string name, string basedOn, bool force)
915
{
1016
var builder = new StringBuilder();
1117
builder.Append("branch ");
@@ -15,61 +21,36 @@ public static async Task<bool> CreateAsync(string repo, string name, string base
1521
builder.Append(" ");
1622
builder.Append(basedOn);
1723

18-
var cmd = new Command();
19-
cmd.WorkingDirectory = repo;
20-
cmd.Context = repo;
21-
cmd.Args = builder.ToString();
22-
cmd.Log = log;
23-
return await cmd.ExecAsync().ConfigureAwait(false);
24+
Args = builder.ToString();
25+
return await ExecAsync().ConfigureAwait(false);
2426
}
2527

26-
public static async Task<bool> RenameAsync(string repo, string name, string to, Models.ICommandLog log)
28+
public async Task<bool> RenameAsync(string name, string to)
2729
{
28-
var cmd = new Command();
29-
cmd.WorkingDirectory = repo;
30-
cmd.Context = repo;
31-
cmd.Args = $"branch -M {name} {to}";
32-
cmd.Log = log;
33-
return await cmd.ExecAsync().ConfigureAwait(false);
30+
Args = $"branch -M {name} {to}";
31+
return await ExecAsync().ConfigureAwait(false);
3432
}
3533

36-
public static async Task<bool> SetUpstreamAsync(string repo, string name, string upstream, Models.ICommandLog log)
34+
public async Task<bool> SetUpstreamAsync(string name, string upstream)
3735
{
38-
var cmd = new Command();
39-
cmd.WorkingDirectory = repo;
40-
cmd.Context = repo;
41-
cmd.Log = log;
42-
4336
if (string.IsNullOrEmpty(upstream))
44-
cmd.Args = $"branch {name} --unset-upstream";
37+
Args = $"branch {name} --unset-upstream";
4538
else
46-
cmd.Args = $"branch {name} -u {upstream}";
39+
Args = $"branch {name} -u {upstream}";
4740

48-
return await cmd.ExecAsync().ConfigureAwait(false);
41+
return await ExecAsync().ConfigureAwait(false);
4942
}
5043

51-
public static async Task<bool> DeleteLocalAsync(string repo, string name, Models.ICommandLog log)
44+
public async Task<bool> DeleteLocalAsync(string name)
5245
{
53-
var cmd = new Command();
54-
cmd.WorkingDirectory = repo;
55-
cmd.Context = repo;
56-
cmd.Args = $"branch -D {name}";
57-
cmd.Log = log;
58-
return await cmd.ExecAsync().ConfigureAwait(false);
46+
Args = $"branch -D {name}";
47+
return await ExecAsync().ConfigureAwait(false);
5948
}
6049

61-
public static async Task<bool> DeleteRemoteAsync(string repo, string remote, string name, Models.ICommandLog log)
50+
public async Task<bool> DeleteRemoteAsync(string remote, string name)
6251
{
63-
bool exists = await new Remote(repo).HasBranchAsync(remote, name).ConfigureAwait(false);
64-
if (exists)
65-
return await new Push(repo, remote, $"refs/heads/{name}", true) { Log = log }.RunAsync().ConfigureAwait(false);
66-
67-
var cmd = new Command();
68-
cmd.WorkingDirectory = repo;
69-
cmd.Context = repo;
70-
cmd.Args = $"branch -D -r {remote}/{name}";
71-
cmd.Log = log;
72-
return await cmd.ExecAsync().ConfigureAwait(false);
52+
Args = $"branch -D -r {remote}/{name}";
53+
return await ExecAsync().ConfigureAwait(false);
7354
}
7455
}
7556
}

src/ViewModels/CreateBranch.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -187,7 +187,9 @@ public override async Task<bool> Sure()
187187
}
188188
else
189189
{
190-
succ = await Commands.Branch.CreateAsync(_repo.FullPath, fixedName, _baseOnRevision, _allowOverwrite, log);
190+
succ = await new Commands.Branch(_repo.FullPath)
191+
.Use(log)
192+
.CreateAsync(fixedName, _baseOnRevision, _allowOverwrite);
191193
}
192194

193195
log.Complete();

src/ViewModels/DeleteBranch.cs

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -49,22 +49,42 @@ public override async Task<bool> Sure()
4949

5050
if (Target.IsLocal)
5151
{
52-
await Commands.Branch.DeleteLocalAsync(_repo.FullPath, Target.Name, log);
52+
await new Commands.Branch(_repo.FullPath)
53+
.Use(log)
54+
.DeleteLocalAsync(Target.Name);
55+
5356
if (_alsoDeleteTrackingRemote && TrackingRemoteBranch != null)
54-
await Commands.Branch.DeleteRemoteAsync(_repo.FullPath, TrackingRemoteBranch.Remote, TrackingRemoteBranch.Name, log);
57+
await DeleteRemoteBranchAsync(TrackingRemoteBranch, log);
5558
}
5659
else
5760
{
58-
await Commands.Branch.DeleteRemoteAsync(_repo.FullPath, Target.Remote, Target.Name, log);
61+
await DeleteRemoteBranchAsync(Target, log);
5962
}
6063

6164
log.Complete();
62-
6365
_repo.MarkBranchesDirtyManually();
6466
_repo.SetWatcherEnabled(true);
6567
return true;
6668
}
6769

70+
private async Task DeleteRemoteBranchAsync(Models.Branch branch, CommandLog log)
71+
{
72+
var exists = await new Commands.Remote(_repo.FullPath)
73+
.HasBranchAsync(branch.Remote, branch.Name)
74+
.ConfigureAwait(false);
75+
76+
if (exists)
77+
await new Commands.Push(_repo.FullPath, branch.Remote, $"refs/heads/{branch.Name}", true)
78+
.Use(log)
79+
.RunAsync()
80+
.ConfigureAwait(false);
81+
else
82+
await new Commands.Branch(_repo.FullPath)
83+
.Use(log)
84+
.DeleteRemoteAsync(branch.Remote, branch.Name)
85+
.ConfigureAwait(false);
86+
}
87+
6888
private readonly Repository _repo = null;
6989
private bool _alsoDeleteTrackingRemote = false;
7090
}

src/ViewModels/DeleteMultipleBranches.cs

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,12 +28,24 @@ public override async Task<bool> Sure()
2828
if (_isLocal)
2929
{
3030
foreach (var target in Targets)
31-
await Commands.Branch.DeleteLocalAsync(_repo.FullPath, target.Name, log);
31+
await new Commands.Branch(_repo.FullPath)
32+
.Use(log)
33+
.DeleteLocalAsync(target.Name);
3234
}
3335
else
3436
{
3537
foreach (var target in Targets)
36-
await Commands.Branch.DeleteRemoteAsync(_repo.FullPath, target.Remote, target.Name, log);
38+
{
39+
var exists = await new Commands.Remote(_repo.FullPath).HasBranchAsync(target.Remote, target.Name);
40+
if (exists)
41+
await new Commands.Push(_repo.FullPath, target.Remote, $"refs/heads/{target.Name}", true)
42+
.Use(log)
43+
.RunAsync();
44+
else
45+
await new Commands.Branch(_repo.FullPath)
46+
.Use(log)
47+
.DeleteRemoteAsync(target.Remote, target.Name);
48+
}
3749
}
3850

3951
log.Complete();

src/ViewModels/InitGitFlow.cs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,9 @@ public override async Task<bool> Sure()
114114
var masterBranch = _repo.Branches.Find(x => x.IsLocal && x.Name.Equals(_master, StringComparison.Ordinal));
115115
if (masterBranch == null)
116116
{
117-
succ = await Commands.Branch.CreateAsync(_repo.FullPath, _master, current.Head, true, log);
117+
succ = await new Commands.Branch(_repo.FullPath)
118+
.Use(log)
119+
.CreateAsync(_master, current.Head, true);
118120
if (!succ)
119121
{
120122
log.Complete();
@@ -126,7 +128,9 @@ public override async Task<bool> Sure()
126128
var developBranch = _repo.Branches.Find(x => x.IsLocal && x.Name.Equals(_develop, StringComparison.Ordinal));
127129
if (developBranch == null)
128130
{
129-
succ = await Commands.Branch.CreateAsync(_repo.FullPath, _develop, current.Head, true, log);
131+
succ = await new Commands.Branch(_repo.FullPath)
132+
.Use(log)
133+
.CreateAsync(_develop, current.Head, true);
130134
if (!succ)
131135
{
132136
log.Complete();

src/ViewModels/RenameBranch.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,10 @@ public override async Task<bool> Sure()
5757
var isCurrent = Target.IsCurrent;
5858
var oldName = Target.FullName;
5959

60-
var succ = await Commands.Branch.RenameAsync(_repo.FullPath, Target.Name, fixedName, log);
60+
var succ = await new Commands.Branch(_repo.FullPath)
61+
.Use(log)
62+
.RenameAsync(Target.Name, fixedName);
63+
6164
if (succ)
6265
{
6366
foreach (var filter in _repo.Settings.HistoriesFilters)

src/ViewModels/ResetWithoutCheckout.cs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,12 @@ public override async Task<bool> Sure()
3838
var log = _repo.CreateLog($"Reset '{Target.Name}' to '{_revision}'");
3939
Use(log);
4040

41-
var succ = await Commands.Branch.CreateAsync(_repo.FullPath, Target.Name, _revision, true, log);
41+
var succ = await new Commands.Branch(_repo.FullPath)
42+
.Use(log)
43+
.CreateAsync(Target.Name, _revision, true);
44+
4245
log.Complete();
46+
_repo.MarkBranchesDirtyManually();
4347
_repo.SetWatcherEnabled(true);
4448
return succ;
4549
}

src/ViewModels/SetUpstream.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,9 +61,11 @@ public override async Task<bool> Sure()
6161
var log = _repo.CreateLog("Set Upstream");
6262
Use(log);
6363

64-
var succ = await Commands.Branch.SetUpstreamAsync(_repo.FullPath, Local.Name, upstream.Replace("refs/remotes/", ""), log);
65-
log.Complete();
64+
var succ = await new Commands.Branch(_repo.FullPath)
65+
.Use(log)
66+
.SetUpstreamAsync(Local.Name, upstream.Replace("refs/remotes/", ""));
6667

68+
log.Complete();
6769
if (succ)
6870
_repo.MarkBranchesDirtyManually();
6971
return true;

0 commit comments

Comments
 (0)