@@ -183,7 +183,7 @@ public ITask CommitAllFiles(string message, string body)
183
183
. AddAll ( )
184
184
. Then ( GitClient . Commit ( message , body ) ) ;
185
185
186
- return HookupHandlers ( task , true , true ) ;
186
+ return HookupHandlers ( task , true ) ;
187
187
}
188
188
189
189
public ITask CommitFiles ( List < string > files , string message , string body )
@@ -192,79 +192,79 @@ public ITask CommitFiles(List<string> files, string message, string body)
192
192
. Add ( files )
193
193
. Then ( GitClient . Commit ( message , body ) ) ;
194
194
195
- return HookupHandlers ( task , true , true ) ;
195
+ return HookupHandlers ( task , true ) ;
196
196
}
197
197
198
198
public ITask Fetch ( string remote )
199
199
{
200
200
var task = GitClient . Fetch ( remote ) ;
201
- return HookupHandlers ( task , true , false ) ;
201
+ return HookupHandlers ( task , false ) ;
202
202
}
203
203
204
204
public ITask Pull ( string remote , string branch )
205
205
{
206
206
var task = GitClient . Pull ( remote , branch ) ;
207
- return HookupHandlers ( task , true , true ) ;
207
+ return HookupHandlers ( task , true ) ;
208
208
}
209
209
210
210
public ITask Push ( string remote , string branch )
211
211
{
212
212
var task = GitClient . Push ( remote , branch ) ;
213
- return HookupHandlers ( task , true , false ) ;
213
+ return HookupHandlers ( task , false ) ;
214
214
}
215
215
216
216
public ITask Revert ( string changeset )
217
217
{
218
218
var task = GitClient . Revert ( changeset ) ;
219
- return HookupHandlers ( task , true , true ) ;
219
+ return HookupHandlers ( task , true ) ;
220
220
}
221
221
222
222
public ITask RemoteAdd ( string remote , string url )
223
223
{
224
224
var task = GitClient . RemoteAdd ( remote , url ) ;
225
- return HookupHandlers ( task , true , false ) ;
225
+ return HookupHandlers ( task , false ) ;
226
226
}
227
227
228
228
public ITask RemoteRemove ( string remote )
229
229
{
230
230
var task = GitClient . RemoteRemove ( remote ) ;
231
- return HookupHandlers ( task , true , false ) ;
231
+ return HookupHandlers ( task , false ) ;
232
232
}
233
233
234
234
public ITask RemoteChange ( string remote , string url )
235
235
{
236
236
var task = GitClient . RemoteChange ( remote , url ) ;
237
- return HookupHandlers ( task , true , false ) ;
237
+ return HookupHandlers ( task , false ) ;
238
238
}
239
239
240
240
public ITask SwitchBranch ( string branch )
241
241
{
242
242
var task = GitClient . SwitchBranch ( branch ) ;
243
- return HookupHandlers ( task , true , true ) ;
243
+ return HookupHandlers ( task , true ) ;
244
244
}
245
245
246
246
public ITask DeleteBranch ( string branch , bool deleteUnmerged = false )
247
247
{
248
248
var task = GitClient . DeleteBranch ( branch , deleteUnmerged ) ;
249
- return HookupHandlers ( task , true , false ) ;
249
+ return HookupHandlers ( task , false ) ;
250
250
}
251
251
252
252
public ITask CreateBranch ( string branch , string baseBranch )
253
253
{
254
254
var task = GitClient . CreateBranch ( branch , baseBranch ) ;
255
- return HookupHandlers ( task , true , false ) ;
255
+ return HookupHandlers ( task , false ) ;
256
256
}
257
257
258
258
public ITask LockFile ( string file )
259
259
{
260
260
var task = GitClient . Lock ( file ) ;
261
- return HookupHandlers ( task , true , false ) . Then ( UpdateLocks ) ;
261
+ return HookupHandlers ( task , false ) . Then ( UpdateLocks ) ;
262
262
}
263
263
264
264
public ITask UnlockFile ( string file , bool force )
265
265
{
266
266
var task = GitClient . Unlock ( file , force ) ;
267
- return HookupHandlers ( task , true , false ) . Then ( UpdateLocks ) ;
267
+ return HookupHandlers ( task , false ) . Then ( UpdateLocks ) ;
268
268
}
269
269
270
270
public void UpdateGitLog ( )
@@ -278,7 +278,7 @@ public void UpdateGitLog()
278
278
GitLogUpdated ? . Invoke ( logEntries ) ;
279
279
}
280
280
} ) ;
281
- task = HookupHandlers ( task , false , false ) ;
281
+ task = HookupHandlers ( task , false ) ;
282
282
task . Start ( ) ;
283
283
}
284
284
@@ -293,7 +293,7 @@ public void UpdateGitStatus()
293
293
GitStatusUpdated ? . Invoke ( status ) ;
294
294
}
295
295
} ) ;
296
- task = HookupHandlers ( task , true , false ) ;
296
+ task = HookupHandlers ( task , false ) ;
297
297
task . Start ( ) ;
298
298
}
299
299
@@ -331,13 +331,21 @@ public ITask DiscardChanges(GitStatusEntry[] gitStatusEntries)
331
331
if ( itemsToRevert . Any ( ) )
332
332
{
333
333
gitDiscardTask = GitClient . Discard ( itemsToRevert ) ;
334
- task . Then ( gitDiscardTask ) ;
334
+ task
335
+ . Then ( gitDiscardTask )
336
+ // we're appending a new continuation, we need to reset the finally handler
337
+ // so it runs after the discard task
338
+ . Finally ( s =>
339
+ {
340
+ watcher . Start ( ) ;
341
+ isBusy = false ;
342
+ } ) ;
335
343
}
336
344
}
337
345
, ( ) => gitStatusEntries ) ;
338
346
339
347
340
- return HookupHandlers ( task , true , true ) ;
348
+ return HookupHandlers ( task , true ) ;
341
349
}
342
350
343
351
public void UpdateGitAheadBehindStatus ( )
@@ -351,16 +359,15 @@ public void UpdateGitAheadBehindStatus()
351
359
var name = configBranch . Value . Name ;
352
360
var trackingName = configBranch . Value . IsTracking ? configBranch . Value . Remote . Value . Name + "/" + name : "[None]" ;
353
361
354
- var task = GitClient
355
- . AheadBehindStatus ( name , trackingName )
362
+ var task = GitClient . AheadBehindStatus ( name , trackingName )
356
363
. Then ( ( success , status ) =>
357
364
{
358
365
if ( success )
359
366
{
360
367
GitAheadBehindStatusUpdated ? . Invoke ( status ) ;
361
368
}
362
369
} ) ;
363
- task = HookupHandlers ( task , true , false ) ;
370
+ task = HookupHandlers ( task , false ) ;
364
371
task . Start ( ) ;
365
372
}
366
373
else
@@ -371,51 +378,55 @@ public void UpdateGitAheadBehindStatus()
371
378
372
379
public void UpdateLocks ( )
373
380
{
374
- var task = GitClient . ListLocks ( false ) ;
375
- HookupHandlers ( task , false , false ) ;
376
- task . Then ( ( success , locks ) =>
377
- {
378
- if ( success )
381
+ GitClient . ListLocks ( false )
382
+ . Finally ( ( success , locks ) =>
379
383
{
380
- GitLocksUpdated ? . Invoke ( locks ) ;
381
- }
382
- } ) . Start ( ) ;
384
+ if ( success )
385
+ {
386
+ GitLocksUpdated ? . Invoke ( locks ) ;
387
+ }
388
+ } )
389
+ . Start ( ) ;
383
390
}
384
391
385
- private ITask HookupHandlers ( ITask task , bool isExclusive , bool filesystemChangesExpected )
392
+ private ITask < T > HookupHandlers < T > ( ITask < T > task , bool filesystemChangesExpected )
386
393
{
387
- return new ActionTask ( token , ( ) => {
388
- if ( isExclusive )
389
- {
390
- Logger . Trace ( "Starting Operation - Setting Busy Flag" ) ;
391
- IsBusy = true ;
392
- }
394
+ return ( ITask < T > ) HookupHandlers ( ( ITask ) task , filesystemChangesExpected ) ;
395
+ }
393
396
394
- if ( filesystemChangesExpected )
395
- {
396
- Logger . Trace ( "Starting Operation - Disable Watcher" ) ;
397
- watcher . Stop ( ) ;
398
- }
399
- } )
400
- . Then ( task )
401
- . Finally ( ( success , exception ) => {
402
- if ( filesystemChangesExpected )
403
- {
404
- Logger . Trace ( "Ended Operation - Enable Watcher" ) ;
405
- watcher . Start ( ) ;
406
- }
397
+ private ITask HookupHandlers ( ITask task , bool filesystemChangesExpected )
398
+ {
399
+ var isExclusive = task . IsChainExclusive ( ) ;
400
+ task . GetTopOfChain ( ) . OnStart += t =>
401
+ {
402
+ if ( t . Affinity == TaskAffinity . Exclusive )
403
+ {
404
+ Logger . Trace ( "Starting Operation - Setting Busy Flag" ) ;
405
+ IsBusy = true ;
406
+ }
407
407
408
- if ( isExclusive )
409
- {
410
- Logger . Trace ( "Ended Operation - Clearing Busy Flag" ) ;
411
- IsBusy = false ;
412
- }
408
+ if ( filesystemChangesExpected )
409
+ {
410
+ Logger . Trace ( "Starting Operation - Disable Watcher" ) ;
411
+ watcher . Stop ( ) ;
412
+ }
413
+ } ;
413
414
414
- if ( ! success )
415
- {
416
- throw exception ;
417
- }
418
- } ) ;
415
+ task . Finally ( success =>
416
+ {
417
+ if ( filesystemChangesExpected )
418
+ {
419
+ Logger . Trace ( "Ended Operation - Enable Watcher" ) ;
420
+ watcher . Start ( ) ;
421
+ }
422
+
423
+ if ( isExclusive )
424
+ {
425
+ Logger . Trace ( "Ended Operation - Clearing Busy Flag" ) ;
426
+ IsBusy = false ;
427
+ }
428
+ } ) ;
429
+ return task ;
419
430
}
420
431
421
432
private void SetupWatcher ( )
0 commit comments