Skip to content
This repository was archived by the owner on Dec 5, 2024. It is now read-only.

Commit 38f85a5

Browse files
committed
Remove the last traces of async/await in the codebase (excluding tests)
1 parent 2746d52 commit 38f85a5

File tree

11 files changed

+187
-207
lines changed

11 files changed

+187
-207
lines changed

src/GitHub.Api/Application/ApiClient.cs

Lines changed: 119 additions & 125 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
using System;
22
using System.Collections.Generic;
33
using System.Linq;
4-
using System.Threading.Tasks;
54
using GitHub.Logging;
65
using System.Runtime.Serialization;
76
using System.Text;
@@ -45,115 +44,17 @@ public ITask Logout(UriString host)
4544
return loginManager.Logout(host);
4645
}
4746

48-
public async Task CreateRepository(string name, string description, bool isPrivate, Action<GitHubRepository, Exception> callback, string organization = null)
47+
public void CreateRepository(string name, string description, bool isPrivate, Action<GitHubRepository, Exception> callback, string organization = null)
4948
{
5049
Guard.ArgumentNotNull(callback, "callback");
51-
try
52-
{
53-
var repository = await CreateRepositoryInternal(name, organization, description, isPrivate);
54-
callback(repository, null);
55-
}
56-
catch (Exception e)
57-
{
58-
callback(null, e);
59-
}
60-
}
61-
62-
public async Task GetOrganizations(Action<Organization[]> onSuccess, Action<Exception> onError = null)
63-
{
64-
Guard.ArgumentNotNull(onSuccess, nameof(onSuccess));
65-
await GetOrganizationInternal(onSuccess, onError);
66-
}
6750

68-
public async Task GetCurrentUser(Action<GitHubUser> onSuccess, Action<Exception> onError = null)
69-
{
70-
Guard.ArgumentNotNull(onSuccess, nameof(onSuccess));
71-
try
72-
{
73-
var user = await GetCurrentUser();
74-
onSuccess(user);
75-
}
76-
catch (Exception e)
51+
new FuncTask<GitHubRepository>(taskManager.Token, () =>
7752
{
78-
onError?.Invoke(e);
79-
}
80-
}
81-
82-
public async Task Login(string username, string password, Action<LoginResult> need2faCode, Action<bool, string> result)
83-
{
84-
Guard.ArgumentNotNull(need2faCode, "need2faCode");
85-
Guard.ArgumentNotNull(result, "result");
86-
87-
LoginResultData res = null;
88-
try
89-
{
90-
res = await loginManager.Login(OriginalUrl, username, password);
91-
}
92-
catch (Exception ex)
93-
{
94-
logger.Warning(ex);
95-
result(false, ex.Message);
96-
return;
97-
}
98-
99-
if (res.Code == LoginResultCodes.CodeRequired)
100-
{
101-
var resultCache = new LoginResult(res, result, need2faCode);
102-
need2faCode(resultCache);
103-
}
104-
else
105-
{
106-
result(res.Code == LoginResultCodes.Success, res.Message);
107-
}
108-
}
109-
110-
public async Task ContinueLogin(LoginResult loginResult, string code)
111-
{
112-
LoginResultData result = null;
113-
try
114-
{
115-
result = await loginManager.ContinueLogin(loginResult.Data, code);
116-
}
117-
catch (Exception ex)
118-
{
119-
loginResult.Callback(false, ex.Message);
120-
return;
121-
}
122-
if (result.Code == LoginResultCodes.CodeFailed)
123-
{
124-
loginResult.TwoFACallback(new LoginResult(result, loginResult.Callback, loginResult.TwoFACallback));
125-
}
126-
loginResult.Callback(result.Code == LoginResultCodes.Success, result.Message);
127-
}
128-
129-
private async Task<GitHubUser> GetCurrentUser()
130-
{
131-
//TODO: ONE_USER_LOGIN This assumes we only support one login
132-
var keychainConnection = keychain.Connections.FirstOrDefault();
133-
if (keychainConnection == null)
134-
throw new KeychainEmptyException();
135-
136-
var keychainAdapter = await GetValidatedKeychainAdapter(keychainConnection);
137-
138-
// we can't trust that the system keychain has the username filled out correctly.
139-
// if it doesn't, we need to grab the username from the server and check it
140-
// unfortunately this means that things will be slower when the keychain doesn't have all the info
141-
if (keychainConnection.User == null || keychainAdapter.Credential.Username != keychainConnection.Username)
142-
{
143-
keychainConnection.User = await GetValidatedGitHubUser(keychainConnection, keychainAdapter);
144-
}
145-
return keychainConnection.User;
146-
}
147-
148-
private async Task<GitHubRepository> CreateRepositoryInternal(string repositoryName, string organization, string description, bool isPrivate)
149-
{
150-
try
151-
{
152-
var user = await GetCurrentUser();
53+
var user = GetCurrentUser();
15354
var keychainAdapter = keychain.Connect(OriginalUrl);
15455

15556
var command = new StringBuilder("publish -r \"");
156-
command.Append(repositoryName);
57+
command.Append(name);
15758
command.Append("\"");
15859

15960
if (!string.IsNullOrEmpty(description))
@@ -176,10 +77,10 @@ private async Task<GitHubRepository> CreateRepositoryInternal(string repositoryN
17677
}
17778

17879
var octorunTask = new OctorunTask(taskManager.Token, nodeJsExecutablePath, octorunScriptPath, command.ToString(),
179-
user: user.Login, userToken: keychainAdapter.Credential.Token)
80+
user: user.Login, userToken: keychainAdapter.Credential.Token)
18081
.Configure(processManager);
18182

182-
var ret = await octorunTask.StartAwait();
83+
var ret = octorunTask.RunSynchronously();
18384
if (ret.IsSuccess && ret.Output.Length == 2)
18485
{
18586
return new GitHubRepository
@@ -190,26 +91,33 @@ private async Task<GitHubRepository> CreateRepositoryInternal(string repositoryN
19091
}
19192

19293
throw new ApiClientException(ret.GetApiErrorMessage() ?? "Publish failed");
193-
}
194-
catch (Exception ex)
94+
})
95+
.FinallyInUI((success, ex, repository) =>
19596
{
196-
logger.Error(ex, "Error Creating Repository");
197-
throw;
198-
}
97+
if (success)
98+
callback(repository, null);
99+
else
100+
{
101+
logger.Error(ex, "Error creating repository");
102+
callback(null, ex);
103+
}
104+
})
105+
.Start();
199106
}
200107

201-
private async Task GetOrganizationInternal(Action<Organization[]> onSuccess, Action<Exception> onError = null)
108+
public void GetOrganizations(Action<Organization[]> onSuccess, Action<Exception> onError = null)
202109
{
203-
try
110+
Guard.ArgumentNotNull(onSuccess, nameof(onSuccess));
111+
new FuncTask<Organization[]>(taskManager.Token, () =>
204112
{
205-
var user = await GetCurrentUser();
113+
var user = GetCurrentUser();
206114
var keychainAdapter = keychain.Connect(OriginalUrl);
207115

208116
var octorunTask = new OctorunTask(taskManager.Token, nodeJsExecutablePath, octorunScriptPath, "organizations",
209117
user: user.Login, userToken: keychainAdapter.Credential.Token)
210118
.Configure(processManager);
211119

212-
var ret = await octorunTask.StartAsAsync();
120+
var ret = octorunTask.RunSynchronously();
213121
if (ret.IsSuccess)
214122
{
215123
var organizations = new List<Organization>();
@@ -221,23 +129,109 @@ private async Task GetOrganizationInternal(Action<Organization[]> onSuccess, Act
221129
Login = ret.Output[i + 1]
222130
});
223131
}
224-
225-
onSuccess(organizations.ToArray());
226-
return;
132+
return organizations.ToArray();
227133
}
228134

229135
throw new ApiClientException(ret.GetApiErrorMessage() ?? "Error getting organizations");
230-
}
231-
catch (Exception ex)
136+
})
137+
.FinallyInUI((success, ex, orgs) =>
138+
{
139+
if (success)
140+
onSuccess(orgs);
141+
else
142+
{
143+
logger.Error(ex, "Error Getting Organizations");
144+
onError?.Invoke(ex);
145+
}
146+
})
147+
.Start();
148+
}
149+
150+
public void GetCurrentUser(Action<GitHubUser> onSuccess, Action<Exception> onError = null)
151+
{
152+
Guard.ArgumentNotNull(onSuccess, nameof(onSuccess));
153+
new FuncTask<GitHubUser>(taskManager.Token, GetCurrentUser)
154+
.FinallyInUI((success, ex, user) =>
155+
{
156+
if (success)
157+
onSuccess(user);
158+
else
159+
onError?.Invoke(ex);
160+
})
161+
.Start();
162+
}
163+
164+
public void Login(string username, string password, Action<LoginResult> need2faCode, Action<bool, string> result)
165+
{
166+
Guard.ArgumentNotNull(need2faCode, "need2faCode");
167+
Guard.ArgumentNotNull(result, "result");
168+
169+
new FuncTask<LoginResultData>(taskManager.Token,
170+
() => loginManager.Login(OriginalUrl, username, password))
171+
.FinallyInUI((success, ex, res) =>
172+
{
173+
if (!success)
174+
{
175+
logger.Warning(ex);
176+
result(false, ex.Message);
177+
return;
178+
}
179+
180+
if (res.Code == LoginResultCodes.CodeRequired)
181+
{
182+
var resultCache = new LoginResult(res, result, need2faCode);
183+
need2faCode(resultCache);
184+
}
185+
else
186+
{
187+
result(res.Code == LoginResultCodes.Success, res.Message);
188+
}
189+
})
190+
.Start();
191+
}
192+
193+
public void ContinueLogin(LoginResult loginResult, string code)
194+
{
195+
new FuncTask<LoginResultData>(taskManager.Token,
196+
() => loginManager.ContinueLogin(loginResult.Data, code))
197+
.FinallyInUI((success, ex, result) =>
198+
{
199+
if (!success)
200+
{
201+
loginResult.Callback(false, ex.Message);
202+
return;
203+
}
204+
if (result.Code == LoginResultCodes.CodeFailed)
205+
{
206+
loginResult.TwoFACallback(new LoginResult(result, loginResult.Callback, loginResult.TwoFACallback));
207+
}
208+
loginResult.Callback(result.Code == LoginResultCodes.Success, result.Message);
209+
})
210+
.Start();
211+
}
212+
213+
private GitHubUser GetCurrentUser()
214+
{
215+
//TODO: ONE_USER_LOGIN This assumes we only support one login
216+
var keychainConnection = keychain.Connections.FirstOrDefault();
217+
if (keychainConnection == null)
218+
throw new KeychainEmptyException();
219+
220+
var keychainAdapter = GetValidatedKeychainAdapter(keychainConnection);
221+
222+
// we can't trust that the system keychain has the username filled out correctly.
223+
// if it doesn't, we need to grab the username from the server and check it
224+
// unfortunately this means that things will be slower when the keychain doesn't have all the info
225+
if (keychainConnection.User == null || keychainAdapter.Credential.Username != keychainConnection.Username)
232226
{
233-
logger.Error(ex, "Error Getting Organizations");
234-
onError?.Invoke(ex);
227+
keychainConnection.User = GetValidatedGitHubUser(keychainConnection, keychainAdapter);
235228
}
229+
return keychainConnection.User;
236230
}
237231

238-
private async Task<IKeychainAdapter> GetValidatedKeychainAdapter(Connection keychainConnection)
232+
private IKeychainAdapter GetValidatedKeychainAdapter(Connection keychainConnection)
239233
{
240-
var keychainAdapter = await keychain.Load(keychainConnection.Host);
234+
var keychainAdapter = keychain.Load(keychainConnection.Host);
241235
if (keychainAdapter == null)
242236
throw new KeychainEmptyException();
243237

@@ -255,15 +249,15 @@ private async Task<IKeychainAdapter> GetValidatedKeychainAdapter(Connection keyc
255249
return keychainAdapter;
256250
}
257251

258-
private async Task<GitHubUser> GetValidatedGitHubUser(Connection keychainConnection, IKeychainAdapter keychainAdapter)
252+
private GitHubUser GetValidatedGitHubUser(Connection keychainConnection, IKeychainAdapter keychainAdapter)
259253
{
260254
try
261255
{
262256
var octorunTask = new OctorunTask(taskManager.Token, nodeJsExecutablePath, octorunScriptPath, "validate",
263257
user: keychainConnection.Username, userToken: keychainAdapter.Credential.Token)
264258
.Configure(processManager);
265259

266-
var ret = await octorunTask.StartAsAsync();
260+
var ret = octorunTask.RunSynchronously();
267261
if (ret.IsSuccess)
268262
{
269263
var login = ret.Output[1];
Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,17 @@
1-
using System.Threading.Tasks;
2-
using System;
1+
using System;
32

43
namespace GitHub.Unity
54
{
65
interface IApiClient
76
{
87
HostAddress HostAddress { get; }
98
UriString OriginalUrl { get; }
10-
Task CreateRepository(string name, string description, bool isPrivate,
9+
void CreateRepository(string name, string description, bool isPrivate,
1110
Action<GitHubRepository, Exception> callback, string organization = null);
12-
Task GetOrganizations(Action<Organization[]> onSuccess, Action<Exception> onError = null);
13-
Task Login(string username, string password, Action<LoginResult> need2faCode, Action<bool, string> result);
14-
Task ContinueLogin(LoginResult loginResult, string code);
11+
void GetOrganizations(Action<Organization[]> onSuccess, Action<Exception> onError = null);
12+
void Login(string username, string password, Action<LoginResult> need2faCode, Action<bool, string> result);
13+
void ContinueLogin(LoginResult loginResult, string code);
1514
ITask Logout(UriString host);
16-
Task GetCurrentUser(Action<GitHubUser> onSuccess, Action<Exception> onError = null);
15+
void GetCurrentUser(Action<GitHubUser> onSuccess, Action<Exception> onError = null);
1716
}
1817
}

src/GitHub.Api/Authentication/ICredentialManager.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,10 @@ public interface ICredential : IDisposable
1313

1414
public interface ICredentialManager
1515
{
16-
Task<ICredential> Load(UriString host);
17-
Task Save(ICredential cred);
18-
Task Delete(UriString host);
16+
ICredential Load(UriString host);
17+
void Save(ICredential cred);
18+
void Delete(UriString host);
1919
bool HasCredentials();
2020
ICredential CachedCredentials { get; }
2121
}
22-
}
22+
}
Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,14 @@
11
using System;
22
using System.Collections.Generic;
3-
using System.Threading.Tasks;
43

54
namespace GitHub.Unity
65
{
76
public interface IKeychain
87
{
98
IKeychainAdapter Connect(UriString host);
10-
Task<IKeychainAdapter> Load(UriString host);
11-
Task Clear(UriString host, bool deleteFromCredentialManager);
12-
Task Save(UriString host);
9+
IKeychainAdapter Load(UriString host);
10+
void Clear(UriString host, bool deleteFromCredentialManager);
11+
void Save(UriString host);
1312
void SetCredentials(ICredential credential);
1413
void Initialize();
1514
Connection[] Connections { get; }
@@ -19,4 +18,4 @@ public interface IKeychain
1918

2019
event Action ConnectionsChanged;
2120
}
22-
}
21+
}

0 commit comments

Comments
 (0)