1
1
using System ;
2
2
using System . Collections . Generic ;
3
3
using System . Linq ;
4
- using System . Threading . Tasks ;
5
4
using GitHub . Logging ;
6
5
using System . Runtime . Serialization ;
7
6
using System . Text ;
@@ -45,115 +44,17 @@ public ITask Logout(UriString host)
45
44
return loginManager . Logout ( host ) ;
46
45
}
47
46
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 )
49
48
{
50
49
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
- }
67
50
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 , ( ) =>
77
52
{
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 ( ) ;
153
54
var keychainAdapter = keychain . Connect ( OriginalUrl ) ;
154
55
155
56
var command = new StringBuilder ( "publish -r \" " ) ;
156
- command . Append ( repositoryName ) ;
57
+ command . Append ( name ) ;
157
58
command . Append ( "\" " ) ;
158
59
159
60
if ( ! string . IsNullOrEmpty ( description ) )
@@ -176,10 +77,10 @@ private async Task<GitHubRepository> CreateRepositoryInternal(string repositoryN
176
77
}
177
78
178
79
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 )
180
81
. Configure ( processManager ) ;
181
82
182
- var ret = await octorunTask . StartAwait ( ) ;
83
+ var ret = octorunTask . RunSynchronously ( ) ;
183
84
if ( ret . IsSuccess && ret . Output . Length == 2 )
184
85
{
185
86
return new GitHubRepository
@@ -190,26 +91,33 @@ private async Task<GitHubRepository> CreateRepositoryInternal(string repositoryN
190
91
}
191
92
192
93
throw new ApiClientException ( ret . GetApiErrorMessage ( ) ?? "Publish failed" ) ;
193
- }
194
- catch ( Exception ex )
94
+ } )
95
+ . FinallyInUI ( ( success , ex , repository ) =>
195
96
{
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 ( ) ;
199
106
}
200
107
201
- private async Task GetOrganizationInternal ( Action < Organization [ ] > onSuccess , Action < Exception > onError = null )
108
+ public void GetOrganizations ( Action < Organization [ ] > onSuccess , Action < Exception > onError = null )
202
109
{
203
- try
110
+ Guard . ArgumentNotNull ( onSuccess , nameof ( onSuccess ) ) ;
111
+ new FuncTask < Organization [ ] > ( taskManager . Token , ( ) =>
204
112
{
205
- var user = await GetCurrentUser ( ) ;
113
+ var user = GetCurrentUser ( ) ;
206
114
var keychainAdapter = keychain . Connect ( OriginalUrl ) ;
207
115
208
116
var octorunTask = new OctorunTask ( taskManager . Token , nodeJsExecutablePath , octorunScriptPath , "organizations" ,
209
117
user : user . Login , userToken : keychainAdapter . Credential . Token )
210
118
. Configure ( processManager ) ;
211
119
212
- var ret = await octorunTask . StartAsAsync ( ) ;
120
+ var ret = octorunTask . RunSynchronously ( ) ;
213
121
if ( ret . IsSuccess )
214
122
{
215
123
var organizations = new List < Organization > ( ) ;
@@ -221,23 +129,109 @@ private async Task GetOrganizationInternal(Action<Organization[]> onSuccess, Act
221
129
Login = ret . Output [ i + 1 ]
222
130
} ) ;
223
131
}
224
-
225
- onSuccess ( organizations . ToArray ( ) ) ;
226
- return ;
132
+ return organizations . ToArray ( ) ;
227
133
}
228
134
229
135
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 )
232
226
{
233
- logger . Error ( ex , "Error Getting Organizations" ) ;
234
- onError ? . Invoke ( ex ) ;
227
+ keychainConnection . User = GetValidatedGitHubUser ( keychainConnection , keychainAdapter ) ;
235
228
}
229
+ return keychainConnection . User ;
236
230
}
237
231
238
- private async Task < IKeychainAdapter > GetValidatedKeychainAdapter ( Connection keychainConnection )
232
+ private IKeychainAdapter GetValidatedKeychainAdapter ( Connection keychainConnection )
239
233
{
240
- var keychainAdapter = await keychain . Load ( keychainConnection . Host ) ;
234
+ var keychainAdapter = keychain . Load ( keychainConnection . Host ) ;
241
235
if ( keychainAdapter == null )
242
236
throw new KeychainEmptyException ( ) ;
243
237
@@ -255,15 +249,15 @@ private async Task<IKeychainAdapter> GetValidatedKeychainAdapter(Connection keyc
255
249
return keychainAdapter ;
256
250
}
257
251
258
- private async Task < GitHubUser > GetValidatedGitHubUser ( Connection keychainConnection , IKeychainAdapter keychainAdapter )
252
+ private GitHubUser GetValidatedGitHubUser ( Connection keychainConnection , IKeychainAdapter keychainAdapter )
259
253
{
260
254
try
261
255
{
262
256
var octorunTask = new OctorunTask ( taskManager . Token , nodeJsExecutablePath , octorunScriptPath , "validate" ,
263
257
user : keychainConnection . Username , userToken : keychainAdapter . Credential . Token )
264
258
. Configure ( processManager ) ;
265
259
266
- var ret = await octorunTask . StartAsAsync ( ) ;
260
+ var ret = octorunTask . RunSynchronously ( ) ;
267
261
if ( ret . IsSuccess )
268
262
{
269
263
var login = ret . Output [ 1 ] ;
0 commit comments