11using System ;
22using System . Collections . Generic ;
33using System . Linq ;
4+ using System . Threading ;
45using System . Threading . Tasks ;
56
67namespace GitHub . Unity
@@ -168,64 +169,62 @@ public int WaitForEvents()
168169
169170 public ITask CommitAllFiles ( string message , string body )
170171 {
171- var add = GitClient . AddAll ( ) ;
172- add . OnStart += t => IsBusy = true ;
173- return add
174- . Then ( GitClient . Commit ( message , body ) )
175- . Finally ( ( ) => IsBusy = false ) ;
172+ var task = GitClient
173+ . AddAll ( )
174+ . Then ( GitClient . Commit ( message , body ) ) ;
175+
176+ return HookupHandlers ( task , true , true ) ;
176177 }
177178
178179 public ITask CommitFiles ( List < string > files , string message , string body )
179180 {
180- var add = GitClient . Add ( files ) ;
181- add . OnStart += t => IsBusy = true ;
182- return add
183- . Then ( GitClient . Commit ( message , body ) )
184- . Finally ( ( ) => IsBusy = false ) ;
181+ var task = GitClient
182+ . Add ( files )
183+ . Then ( GitClient . Commit ( message , body ) ) ;
184+
185+ return HookupHandlers ( task , true , true ) ;
185186 }
186187
187188 public ITask < List < GitLogEntry > > Log ( )
188189 {
189190 var task = GitClient . Log ( ) ;
190- HookupHandlers ( task ) ;
191- return task ;
191+ return HookupHandlers ( task , false , false ) ;
192192 }
193193
194194 public ITask < GitStatus > Status ( )
195195 {
196196 var task = GitClient . Status ( ) ;
197- HookupHandlers ( task ) ;
198- return task ;
197+ return HookupHandlers ( task , true , false ) ;
199198 }
200199
201200 public ITask Fetch ( string remote )
202201 {
203202 var task = GitClient . Fetch ( remote ) ;
204- return HookupHandlers ( task ) ;
203+ return HookupHandlers ( task , true , false ) ;
205204 }
206205
207206 public ITask Pull ( string remote , string branch )
208207 {
209208 var task = GitClient . Pull ( remote , branch ) ;
210- return HookupHandlers ( task , true ) ;
209+ return HookupHandlers ( task , true , true ) ;
211210 }
212211
213212 public ITask Push ( string remote , string branch )
214213 {
215214 var task = GitClient . Push ( remote , branch ) ;
216- return HookupHandlers ( task ) ;
215+ return HookupHandlers ( task , true , false ) ;
217216 }
218217
219218 public ITask Revert ( string changeset )
220219 {
221220 var task = GitClient . Revert ( changeset ) ;
222- return HookupHandlers ( task ) ;
221+ return HookupHandlers ( task , true , true ) ;
223222 }
224223
225224 public ITask RemoteAdd ( string remote , string url )
226225 {
227226 var task = GitClient . RemoteAdd ( remote , url ) ;
228- HookupHandlers ( task ) ;
227+ task = HookupHandlers ( task , true , false ) ;
229228 if ( ! platform . Environment . IsWindows )
230229 {
231230 task . Then ( _ => {
@@ -238,7 +237,7 @@ public ITask RemoteAdd(string remote, string url)
238237 public ITask RemoteRemove ( string remote )
239238 {
240239 var task = GitClient . RemoteRemove ( remote ) ;
241- HookupHandlers ( task ) ;
240+ task = HookupHandlers ( task , true , false ) ;
242241 if ( ! platform . Environment . IsWindows )
243242 {
244243 task . Then ( _ => {
@@ -251,44 +250,44 @@ public ITask RemoteRemove(string remote)
251250 public ITask RemoteChange ( string remote , string url )
252251 {
253252 var task = GitClient . RemoteChange ( remote , url ) ;
254- return HookupHandlers ( task ) ;
253+ return HookupHandlers ( task , true , false ) ;
255254 }
256255
257256 public ITask SwitchBranch ( string branch )
258257 {
259258 var task = GitClient . SwitchBranch ( branch ) ;
260- return HookupHandlers ( task , true ) ;
259+ return HookupHandlers ( task , true , true ) ;
261260 }
262261
263262 public ITask DeleteBranch ( string branch , bool deleteUnmerged = false )
264263 {
265264 var task = GitClient . DeleteBranch ( branch , deleteUnmerged ) ;
266- return HookupHandlers ( task ) ;
265+ return HookupHandlers ( task , true , false ) ;
267266 }
268267
269268 public ITask CreateBranch ( string branch , string baseBranch )
270269 {
271270 var task = GitClient . CreateBranch ( branch , baseBranch ) ;
272- return HookupHandlers ( task ) ;
271+ return HookupHandlers ( task , true , false ) ;
273272 }
274273
275274 public ITask < List < GitLock > > ListLocks ( bool local )
276275 {
277276 var task = GitClient . ListLocks ( local ) ;
278- HookupHandlers ( task ) ;
277+ HookupHandlers ( task , false , false ) ;
279278 return task ;
280279 }
281280
282281 public ITask LockFile ( string file )
283282 {
284283 var task = GitClient . Lock ( file ) ;
285- return HookupHandlers ( task ) ;
284+ return HookupHandlers ( task , true , false ) ;
286285 }
287286
288287 public ITask UnlockFile ( string file , bool force )
289288 {
290289 var task = GitClient . Unlock ( file , force ) ;
291- return HookupHandlers ( task ) ;
290+ return HookupHandlers ( task , true , false ) ;
292291 }
293292
294293 private void SetupWatcher ( )
@@ -311,29 +310,42 @@ private void UpdateHead()
311310 UpdateCurrentBranchAndRemote ( head ) ;
312311 }
313312
314- private ITask HookupHandlers ( ITask task , bool disableWatcher = false )
313+ private ITask < T > HookupHandlers < T > ( ITask < T > task , bool isExclusive , bool filesystemChangesExpected )
315314 {
316- task . OnStart += t => {
317- Logger . Trace ( "Start " + task . Name ) ;
318- IsBusy = true ;
315+ return new ActionTask ( CancellationToken . None , ( ) => {
316+ if ( isExclusive )
317+ {
318+ Logger . Trace ( "Starting Operation - Setting Busy Flag" ) ;
319+ IsBusy = true ;
320+ }
319321
320- if ( disableWatcher )
321- {
322- watcher . Stop ( ) ;
323- }
324- } ;
322+ if ( filesystemChangesExpected )
323+ {
324+ Logger . Trace ( "Starting Operation - Disable Watcher" ) ;
325+ watcher . Stop ( ) ;
326+ }
327+ } )
328+ . Then ( task )
329+ . Finally ( ( success , exception , result ) => {
330+ if ( filesystemChangesExpected )
331+ {
332+ Logger . Trace ( "Ended Operation - Enable Watcher" ) ;
333+ watcher . Start ( ) ;
334+ }
325335
326- task . OnEnd += t => {
327- if ( disableWatcher )
328- {
329- watcher . Start ( ) ;
330- }
336+ if ( isExclusive )
337+ {
338+ Logger . Trace ( "Ended Operation - Clearing Busy Flag" ) ;
339+ IsBusy = false ;
340+ }
331341
332- IsBusy = false ;
342+ if ( success )
343+ {
344+ return result ;
345+ }
333346
334- Logger . Trace ( "Finish " + task . Name ) ;
335- } ;
336- return task ;
347+ throw exception ;
348+ } ) ;
337349 }
338350
339351 private void Watcher_OnRemoteBranchDeleted ( string remote , string name )
0 commit comments