11using System ;
22using System . Collections . Generic ;
33using System . Linq ;
4- using System . Threading . Tasks ;
54using GitHub . Logging ;
65using System . Runtime . Serialization ;
76using 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 ] ;
0 commit comments