Skip to content

Commit 4522860

Browse files
authored
feature: async (#1492)
* Async command methods * Async `Task.Run` where possible * Remove redundant `Task.Run` in `Sure` methods * Remove leftover braces and reformat * Async event handlers as needed
1 parent 501bf03 commit 4522860

File tree

134 files changed

+2315
-1531
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

134 files changed

+2315
-1531
lines changed

src/Commands/Blame.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using System;
22
using System.Text;
33
using System.Text.RegularExpressions;
4+
using System.Threading.Tasks;
45

56
namespace SourceGit.Commands
67
{
@@ -19,9 +20,9 @@ public Blame(string repo, string file, string revision)
1920
_result.File = file;
2021
}
2122

22-
public Models.BlameData Result()
23+
public async Task<Models.BlameData> ResultAsync()
2324
{
24-
var rs = ReadToEnd();
25+
var rs = await ReadToEndAsync();
2526
if (!rs.IsSuccess)
2627
return _result;
2728

src/Commands/Branch.cs

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

34
namespace SourceGit.Commands
45
{
@@ -13,7 +14,16 @@ public static string ShowCurrent(string repo)
1314
return cmd.ReadToEnd().StdOut.Trim();
1415
}
1516

16-
public static bool Create(string repo, string name, string basedOn, bool force, Models.ICommandLog log)
17+
public static async Task<string> ShowCurrentAsync(string repo)
18+
{
19+
var cmd = new Command();
20+
cmd.WorkingDirectory = repo;
21+
cmd.Context = repo;
22+
cmd.Args = "branch --show-current";
23+
return (await cmd.ReadToEndAsync()).StdOut.Trim();
24+
}
25+
26+
public static async Task<bool> CreateAsync(string repo, string name, string basedOn, bool force, Models.ICommandLog log)
1727
{
1828
var builder = new StringBuilder();
1929
builder.Append("branch ");
@@ -28,20 +38,20 @@ public static bool Create(string repo, string name, string basedOn, bool force,
2838
cmd.Context = repo;
2939
cmd.Args = builder.ToString();
3040
cmd.Log = log;
31-
return cmd.Exec();
41+
return await cmd.ExecAsync();
3242
}
3343

34-
public static bool Rename(string repo, string name, string to, Models.ICommandLog log)
44+
public static async Task<bool> RenameAsync(string repo, string name, string to, Models.ICommandLog log)
3545
{
3646
var cmd = new Command();
3747
cmd.WorkingDirectory = repo;
3848
cmd.Context = repo;
3949
cmd.Args = $"branch -M {name} {to}";
4050
cmd.Log = log;
41-
return cmd.Exec();
51+
return await cmd.ExecAsync();
4252
}
4353

44-
public static bool SetUpstream(string repo, string name, string upstream, Models.ICommandLog log)
54+
public static async Task<bool> SetUpstreamAsync(string repo, string name, string upstream, Models.ICommandLog log)
4555
{
4656
var cmd = new Command();
4757
cmd.WorkingDirectory = repo;
@@ -53,31 +63,31 @@ public static bool SetUpstream(string repo, string name, string upstream, Models
5363
else
5464
cmd.Args = $"branch {name} -u {upstream}";
5565

56-
return cmd.Exec();
66+
return await cmd.ExecAsync();
5767
}
5868

59-
public static bool DeleteLocal(string repo, string name, Models.ICommandLog log)
69+
public static async Task<bool> DeleteLocalAsync(string repo, string name, Models.ICommandLog log)
6070
{
6171
var cmd = new Command();
6272
cmd.WorkingDirectory = repo;
6373
cmd.Context = repo;
6474
cmd.Args = $"branch -D {name}";
6575
cmd.Log = log;
66-
return cmd.Exec();
76+
return await cmd.ExecAsync();
6777
}
6878

69-
public static bool DeleteRemote(string repo, string remote, string name, Models.ICommandLog log)
79+
public static async Task<bool> DeleteRemoteAsync(string repo, string remote, string name, Models.ICommandLog log)
7080
{
71-
bool exists = new Remote(repo).HasBranch(remote, name);
81+
bool exists = await new Remote(repo).HasBranchAsync(remote, name);
7282
if (exists)
73-
return new Push(repo, remote, $"refs/heads/{name}", true) { Log = log }.Exec();
83+
return await new Push(repo, remote, $"refs/heads/{name}", true) { Log = log }.ExecAsync();
7484

7585
var cmd = new Command();
7686
cmd.WorkingDirectory = repo;
7787
cmd.Context = repo;
7888
cmd.Args = $"branch -D -r {remote}/{name}";
7989
cmd.Log = log;
80-
return cmd.Exec();
90+
return await cmd.ExecAsync();
8191
}
8292
}
8393
}

src/Commands/Checkout.cs

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using System.Collections.Generic;
22
using System.Text;
3+
using System.Threading.Tasks;
34

45
namespace SourceGit.Commands
56
{
@@ -11,7 +12,7 @@ public Checkout(string repo)
1112
Context = repo;
1213
}
1314

14-
public bool Branch(string branch, bool force)
15+
public async Task<bool> BranchAsync(string branch, bool force)
1516
{
1617
var builder = new StringBuilder();
1718
builder.Append("checkout --progress ");
@@ -20,10 +21,10 @@ public bool Branch(string branch, bool force)
2021
builder.Append(branch);
2122

2223
Args = builder.ToString();
23-
return Exec();
24+
return await ExecAsync();
2425
}
2526

26-
public bool Branch(string branch, string basedOn, bool force, bool allowOverwrite)
27+
public async Task<bool> BranchAsync(string branch, string basedOn, bool force, bool allowOverwrite)
2728
{
2829
var builder = new StringBuilder();
2930
builder.Append("checkout --progress ");
@@ -35,17 +36,17 @@ public bool Branch(string branch, string basedOn, bool force, bool allowOverwrit
3536
builder.Append(basedOn);
3637

3738
Args = builder.ToString();
38-
return Exec();
39+
return await ExecAsync();
3940
}
4041

41-
public bool Commit(string commitId, bool force)
42+
public async Task<bool> CommitAsync(string commitId, bool force)
4243
{
4344
var option = force ? "--force" : string.Empty;
4445
Args = $"checkout {option} --detach --progress {commitId}";
45-
return Exec();
46+
return await ExecAsync();
4647
}
4748

48-
public bool UseTheirs(List<string> files)
49+
public async Task<bool> UseTheirsAsync(List<string> files)
4950
{
5051
var builder = new StringBuilder();
5152
builder.Append("checkout --theirs --");
@@ -56,10 +57,10 @@ public bool UseTheirs(List<string> files)
5657
builder.Append("\"");
5758
}
5859
Args = builder.ToString();
59-
return Exec();
60+
return await ExecAsync();
6061
}
6162

62-
public bool UseMine(List<string> files)
63+
public async Task<bool> UseMineAsync(List<string> files)
6364
{
6465
var builder = new StringBuilder();
6566
builder.Append("checkout --ours --");
@@ -69,14 +70,15 @@ public bool UseMine(List<string> files)
6970
builder.Append(f);
7071
builder.Append("\"");
7172
}
73+
7274
Args = builder.ToString();
73-
return Exec();
75+
return await ExecAsync();
7476
}
7577

76-
public bool FileWithRevision(string file, string revision)
78+
public async Task<bool> FileWithRevisionAsync(string file, string revision)
7779
{
7880
Args = $"checkout --no-overlay {revision} -- \"{file}\"";
79-
return Exec();
81+
return await ExecAsync();
8082
}
8183
}
8284
}

src/Commands/Command.cs

Lines changed: 39 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
using System.Text;
55
using System.Text.RegularExpressions;
66
using System.Threading;
7+
using System.Threading.Tasks;
78

89
namespace SourceGit.Commands
910
{
@@ -32,7 +33,39 @@ public enum EditorType
3233
public bool RaiseError { get; set; } = true;
3334
public Models.ICommandLog Log { get; set; } = null;
3435

35-
public bool Exec()
36+
public ReadToEndResult ReadToEnd()
37+
{
38+
var start = CreateGitStartInfo();
39+
var proc = new Process() { StartInfo = start };
40+
41+
try
42+
{
43+
proc.Start();
44+
}
45+
catch (Exception e)
46+
{
47+
return new ReadToEndResult()
48+
{
49+
IsSuccess = false,
50+
StdOut = string.Empty,
51+
StdErr = e.Message,
52+
};
53+
}
54+
55+
var rs = new ReadToEndResult()
56+
{
57+
StdOut = proc.StandardOutput.ReadToEnd(),
58+
StdErr = proc.StandardError.ReadToEnd(),
59+
};
60+
61+
proc.WaitForExit();
62+
rs.IsSuccess = proc.ExitCode == 0;
63+
proc.Close();
64+
65+
return rs;
66+
}
67+
68+
public async Task<bool> ExecAsync()
3669
{
3770
Log?.AppendLine($"$ git {Args}\n");
3871

@@ -74,7 +107,7 @@ public bool Exec()
74107

75108
proc.BeginOutputReadLine();
76109
proc.BeginErrorReadLine();
77-
proc.WaitForExit();
110+
await proc.WaitForExitAsync(CancellationToken);
78111

79112
if (dummy != null)
80113
{
@@ -103,7 +136,7 @@ public bool Exec()
103136
return true;
104137
}
105138

106-
public ReadToEndResult ReadToEnd()
139+
public async Task<ReadToEndResult> ReadToEndAsync()
107140
{
108141
var start = CreateGitStartInfo();
109142
var proc = new Process() { StartInfo = start };
@@ -124,11 +157,11 @@ public ReadToEndResult ReadToEnd()
124157

125158
var rs = new ReadToEndResult()
126159
{
127-
StdOut = proc.StandardOutput.ReadToEnd(),
128-
StdErr = proc.StandardError.ReadToEnd(),
160+
StdOut = await proc.StandardOutput.ReadToEndAsync(CancellationToken),
161+
StdErr = await proc.StandardError.ReadToEndAsync(CancellationToken),
129162
};
130163

131-
proc.WaitForExit();
164+
await proc.WaitForExitAsync(CancellationToken);
132165
rs.IsSuccess = proc.ExitCode == 0;
133166
proc.Close();
134167

src/Commands/Commit.cs

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

34
namespace SourceGit.Commands
45
{
@@ -18,9 +19,9 @@ public Commit(string repo, string message, bool signOff, bool amend, bool resetA
1819
Args += resetAuthor ? " --amend --reset-author --no-edit" : " --amend --no-edit";
1920
}
2021

21-
public bool Run()
22+
public async Task<bool> RunAsync()
2223
{
23-
var succ = Exec();
24+
var succ = await ExecAsync();
2425

2526
try
2627
{

src/Commands/CompareRevisions.cs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using System;
22
using System.Collections.Generic;
33
using System.Text.RegularExpressions;
4+
using System.Threading.Tasks;
45

56
namespace SourceGit.Commands
67
{
@@ -43,6 +44,20 @@ public CompareRevisions(string repo, string start, string end, string path)
4344
return _changes;
4445
}
4546

47+
public async Task<List<Models.Change>> ResultAsync()
48+
{
49+
var rs = await ReadToEndAsync();
50+
if (!rs.IsSuccess)
51+
return _changes;
52+
53+
var lines = rs.StdOut.Split(['\r', '\n'], StringSplitOptions.RemoveEmptyEntries);
54+
foreach (var line in lines)
55+
ParseLine(line);
56+
57+
_changes.Sort((l, r) => Models.NumericSort.Compare(l.Path, r.Path));
58+
return _changes;
59+
}
60+
4661
private void ParseLine(string line)
4762
{
4863
var match = REG_FORMAT().Match(line);

src/Commands/Config.cs

Lines changed: 33 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using System;
22
using System.Collections.Generic;
3+
using System.Threading.Tasks;
34

45
namespace SourceGit.Commands
56
{
@@ -51,7 +52,37 @@ public string Get(string key)
5152
return ReadToEnd().StdOut.Trim();
5253
}
5354

54-
public bool Set(string key, string value, bool allowEmpty = false)
55+
public async Task<Dictionary<string, string>> ListAllAsync()
56+
{
57+
Args = "config -l";
58+
59+
var output = await ReadToEndAsync();
60+
var rs = new Dictionary<string, string>();
61+
if (output.IsSuccess)
62+
{
63+
var lines = output.StdOut.Split(['\r', '\n'], StringSplitOptions.RemoveEmptyEntries);
64+
foreach (var line in lines)
65+
{
66+
var idx = line.IndexOf('=', StringComparison.Ordinal);
67+
if (idx != -1)
68+
{
69+
var key = line.Substring(0, idx).Trim();
70+
var val = line.Substring(idx + 1).Trim();
71+
rs[key] = val;
72+
}
73+
}
74+
}
75+
76+
return rs;
77+
}
78+
79+
public async Task<string> GetAsync(string key)
80+
{
81+
Args = $"config {key}";
82+
return (await ReadToEndAsync()).StdOut.Trim();
83+
}
84+
85+
public async Task<bool> SetAsync(string key, string value, bool allowEmpty = false)
5586
{
5687
var scope = _isLocal ? "--local" : "--global";
5788

@@ -60,7 +91,7 @@ public bool Set(string key, string value, bool allowEmpty = false)
6091
else
6192
Args = $"config {scope} {key} \"{value}\"";
6293

63-
return Exec();
94+
return await ExecAsync();
6495
}
6596

6697
private bool _isLocal = false;

src/Commands/CountLocalChangesWithoutUntracked.cs

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

34
namespace SourceGit.Commands
45
{
@@ -11,9 +12,9 @@ public CountLocalChangesWithoutUntracked(string repo)
1112
Args = "--no-optional-locks status -uno --ignore-submodules=all --porcelain";
1213
}
1314

14-
public int Result()
15+
public async Task<int> ResultAsync()
1516
{
16-
var rs = ReadToEnd();
17+
var rs = await ReadToEndAsync();
1718
if (rs.IsSuccess)
1819
{
1920
var lines = rs.StdOut.Split(['\r', '\n'], StringSplitOptions.RemoveEmptyEntries);

0 commit comments

Comments
 (0)