@@ -162,12 +162,7 @@ public int CheckAndProcessEvents()
162
162
163
163
private int ProcessEvents ( Event [ ] fileEvents )
164
164
{
165
- var eventsProcessed = 0 ;
166
- var configChanged = false ;
167
- var headChanged = false ;
168
- var repositoryChanged = false ;
169
- var indexChanged = false ;
170
-
165
+ Dictionary < EventType , List < EventData > > events = new Dictionary < EventType , List < EventData > > ( ) ;
171
166
foreach ( var fileEvent in fileEvents )
172
167
{
173
168
if ( ! running )
@@ -195,29 +190,17 @@ private int ProcessEvents(Event[] fileEvents)
195
190
// handling events in .git/*
196
191
if ( fileA . IsChildOf ( paths . DotGitPath ) )
197
192
{
198
- if ( ! configChanged && fileA . Equals ( paths . DotGitConfig ) )
193
+ if ( ! events . ContainsKey ( EventType . ConfigChanged ) && fileA . Equals ( paths . DotGitConfig ) )
199
194
{
200
- configChanged = true ;
201
-
202
- Logger . Trace ( "ConfigChanged" ) ;
203
- ConfigChanged ? . Invoke ( ) ;
204
- eventsProcessed ++ ;
195
+ events . Add ( EventType . ConfigChanged , null ) ;
205
196
}
206
- else if ( ! headChanged && fileA . Equals ( paths . DotGitHead ) )
197
+ else if ( ! events . ContainsKey ( EventType . HeadChanged ) && fileA . Equals ( paths . DotGitHead ) )
207
198
{
208
- headChanged = true ;
209
-
210
- Logger . Trace ( "HeadChanged" ) ;
211
- HeadChanged ? . Invoke ( ) ;
212
- eventsProcessed ++ ;
199
+ events . Add ( EventType . HeadChanged , null ) ;
213
200
}
214
- else if ( ! indexChanged && fileA . Equals ( paths . DotGitIndex ) )
201
+ else if ( ! events . ContainsKey ( EventType . IndexChanged ) && fileA . Equals ( paths . DotGitIndex ) )
215
202
{
216
- indexChanged = true ;
217
-
218
- Logger . Trace ( "IndexChanged" ) ;
219
- IndexChanged ? . Invoke ( ) ;
220
- eventsProcessed ++ ;
203
+ events . Add ( EventType . IndexChanged , null ) ;
221
204
}
222
205
else if ( fileA . IsChildOf ( paths . RemotesPath ) )
223
206
{
@@ -231,20 +214,17 @@ private int ProcessEvents(Event[] fileEvents)
231
214
232
215
var origin = relativePathElements [ 0 ] ;
233
216
234
- if ( fileEvent . Type == EventType . DELETED )
217
+ if ( fileEvent . Type == sfw . net . EventType . DELETED )
235
218
{
236
219
if ( fileA . ExtensionWithDot == ".lock" )
237
220
{
238
221
continue ;
239
222
}
240
223
241
224
var branch = string . Join ( @"/" , relativePathElements . Skip ( 1 ) . ToArray ( ) ) ;
242
-
243
- Logger . Trace ( "RemoteBranchDeleted: {0}/{1}" , origin , branch ) ;
244
- RemoteBranchDeleted ? . Invoke ( origin , branch ) ;
245
- eventsProcessed ++ ;
225
+ AddOrUpdateEventData ( events , EventType . RemoteBranchDeleted , new EventData { Origin = origin , Branch = branch } ) ;
246
226
}
247
- else if ( fileEvent . Type == EventType . RENAMED )
227
+ else if ( fileEvent . Type == sfw . net . EventType . RENAMED )
248
228
{
249
229
if ( fileA . ExtensionWithDot != ".lock" )
250
230
{
@@ -260,17 +240,14 @@ private int ProcessEvents(Event[] fileEvents)
260
240
. Union ( new [ ] { fileA . FileNameWithoutExtension } ) . ToArray ( ) ;
261
241
262
242
var branch = string . Join ( @"/" , branchPathElement ) ;
263
-
264
- Logger . Trace ( "RemoteBranchCreated: {0}/{1}" , origin , branch ) ;
265
- RemoteBranchCreated ? . Invoke ( origin , branch ) ;
266
- eventsProcessed ++ ;
243
+ AddOrUpdateEventData ( events , EventType . RemoteBranchCreated , new EventData { Origin = origin , Branch = branch } ) ;
267
244
}
268
245
}
269
246
}
270
247
}
271
248
else if ( fileA . IsChildOf ( paths . BranchesPath ) )
272
249
{
273
- if ( fileEvent . Type == EventType . MODIFIED )
250
+ if ( fileEvent . Type == sfw . net . EventType . MODIFIED )
274
251
{
275
252
if ( fileA . DirectoryExists ( ) )
276
253
{
@@ -292,11 +269,10 @@ private int ProcessEvents(Event[] fileEvents)
292
269
293
270
var branch = string . Join ( @"/" , relativePathElements . ToArray ( ) ) ;
294
271
295
- Logger . Trace ( "LocalBranchChanged: {0}" , branch ) ;
296
- LocalBranchChanged ? . Invoke ( branch ) ;
297
- eventsProcessed ++ ;
272
+ AddOrUpdateEventData ( events , EventType . LocalBranchChanged , new EventData { Branch = branch } ) ;
273
+
298
274
}
299
- else if ( fileEvent . Type == EventType . DELETED )
275
+ else if ( fileEvent . Type == sfw . net . EventType . DELETED )
300
276
{
301
277
if ( fileA . ExtensionWithDot == ".lock" )
302
278
{
@@ -312,12 +288,9 @@ private int ProcessEvents(Event[] fileEvents)
312
288
}
313
289
314
290
var branch = string . Join ( @"/" , relativePathElements . ToArray ( ) ) ;
315
-
316
- Logger . Trace ( "LocalBranchDeleted: {0}" , branch ) ;
317
- LocalBranchDeleted ? . Invoke ( branch ) ;
318
- eventsProcessed ++ ;
291
+ AddOrUpdateEventData ( events , EventType . LocalBranchDeleted , new EventData { Branch = branch } ) ;
319
292
}
320
- else if ( fileEvent . Type == EventType . RENAMED )
293
+ else if ( fileEvent . Type == sfw . net . EventType . RENAMED )
321
294
{
322
295
if ( fileA . ExtensionWithDot != ".lock" )
323
296
{
@@ -337,30 +310,117 @@ private int ProcessEvents(Event[] fileEvents)
337
310
}
338
311
339
312
var branch = string . Join ( @"/" , relativePathElements . ToArray ( ) ) ;
340
-
341
- Logger . Trace ( "LocalBranchCreated: {0}" , branch ) ;
342
- LocalBranchCreated ? . Invoke ( branch ) ;
343
- eventsProcessed ++ ;
313
+ AddOrUpdateEventData ( events , EventType . LocalBranchCreated , new EventData { Branch = branch } ) ;
344
314
}
345
315
}
346
316
}
347
317
}
348
318
}
349
319
else
350
320
{
351
- if ( repositoryChanged || ignoredPaths . Any ( ignoredPath => fileA . IsChildOf ( ignoredPath ) ) )
321
+ if ( events . ContainsKey ( EventType . RepositoryChanged ) || ignoredPaths . Any ( ignoredPath => fileA . IsChildOf ( ignoredPath ) ) )
352
322
{
353
323
continue ;
354
324
}
325
+ events . Add ( EventType . RepositoryChanged , null ) ;
326
+ }
327
+ }
328
+
329
+ return FireEvents ( events ) ;
330
+ }
331
+
332
+ private void AddOrUpdateEventData ( Dictionary < EventType , List < EventData > > events , EventType type , EventData data )
333
+ {
334
+ if ( ! events . ContainsKey ( type ) )
335
+ events . Add ( type , new List < EventData > ( ) ) ;
336
+ events [ type ] . Add ( data ) ;
337
+ }
338
+
339
+ private int FireEvents ( Dictionary < EventType , List < EventData > > events )
340
+ {
341
+ int eventsProcessed = 0 ;
342
+ if ( events . ContainsKey ( EventType . ConfigChanged ) )
343
+ {
344
+ Logger . Trace ( "ConfigChanged" ) ;
345
+ ConfigChanged ? . Invoke ( ) ;
346
+ eventsProcessed ++ ;
347
+ }
355
348
356
- repositoryChanged = true ;
349
+ if ( events . ContainsKey ( EventType . HeadChanged ) )
350
+ {
351
+ Logger . Trace ( "HeadChanged" ) ;
352
+ HeadChanged ? . Invoke ( ) ;
353
+ eventsProcessed ++ ;
354
+ }
357
355
358
- Logger . Trace ( "RepositoryChanged" ) ;
359
- RepositoryChanged ? . Invoke ( ) ;
356
+ if ( events . ContainsKey ( EventType . IndexChanged ) )
357
+ {
358
+ Logger . Trace ( "IndexChanged" ) ;
359
+ IndexChanged ? . Invoke ( ) ;
360
+ eventsProcessed ++ ;
361
+ }
362
+
363
+ if ( events . ContainsKey ( EventType . RepositoryChanged ) )
364
+ {
365
+ Logger . Trace ( "RepositoryChanged" ) ;
366
+ RepositoryChanged ? . Invoke ( ) ;
367
+ eventsProcessed ++ ;
368
+ }
369
+
370
+ List < EventData > localBranchesCreated ;
371
+ if ( events . TryGetValue ( EventType . LocalBranchCreated , out localBranchesCreated ) )
372
+ {
373
+ foreach ( var evt in localBranchesCreated )
374
+ {
375
+ Logger . Trace ( $ "LocalBranchCreated: { evt . Branch } ") ;
376
+ LocalBranchCreated ? . Invoke ( evt . Branch ) ;
360
377
eventsProcessed ++ ;
361
378
}
362
379
}
363
380
381
+ List < EventData > localBranchesChanged ;
382
+ if ( events . TryGetValue ( EventType . LocalBranchChanged , out localBranchesChanged ) )
383
+ {
384
+ foreach ( var evt in localBranchesChanged )
385
+ {
386
+ Logger . Trace ( $ "LocalBranchChanged: { evt . Branch } ") ;
387
+ LocalBranchChanged ? . Invoke ( evt . Branch ) ;
388
+ eventsProcessed ++ ;
389
+ }
390
+ }
391
+
392
+ List < EventData > localBranchesDeleted ;
393
+ if ( events . TryGetValue ( EventType . LocalBranchDeleted , out localBranchesDeleted ) )
394
+ {
395
+ foreach ( var evt in localBranchesDeleted )
396
+ {
397
+ Logger . Trace ( $ "LocalBranchDeleted: { evt . Branch } ") ;
398
+ LocalBranchDeleted ? . Invoke ( evt . Branch ) ;
399
+ eventsProcessed ++ ;
400
+ }
401
+ }
402
+
403
+ List < EventData > remoteBranchesCreated ;
404
+ if ( events . TryGetValue ( EventType . RemoteBranchCreated , out remoteBranchesCreated ) )
405
+ {
406
+ foreach ( var evt in remoteBranchesCreated )
407
+ {
408
+ Logger . Trace ( $ "RemoteBranchCreated: { evt . Origin } /{ evt . Branch } ") ;
409
+ RemoteBranchCreated ? . Invoke ( evt . Origin , evt . Branch ) ;
410
+ eventsProcessed ++ ;
411
+ }
412
+ }
413
+
414
+ List < EventData > remoteBranchesDeleted ;
415
+ if ( events . TryGetValue ( EventType . RemoteBranchDeleted , out remoteBranchesDeleted ) )
416
+ {
417
+ foreach ( var evt in remoteBranchesDeleted )
418
+ {
419
+ Logger . Trace ( $ "RemoteBranchDeleted: { evt . Origin } /{ evt . Branch } ") ;
420
+ RemoteBranchDeleted ? . Invoke ( evt . Origin , evt . Branch ) ;
421
+ eventsProcessed ++ ;
422
+ }
423
+ }
364
424
return eventsProcessed ;
365
425
}
366
426
@@ -388,5 +448,25 @@ public void Dispose()
388
448
}
389
449
390
450
protected static ILogging Logger { get ; } = Logging . GetLogger < RepositoryWatcher > ( ) ;
451
+
452
+ private enum EventType
453
+ {
454
+ None ,
455
+ ConfigChanged ,
456
+ HeadChanged ,
457
+ RepositoryChanged ,
458
+ IndexChanged ,
459
+ RemoteBranchDeleted ,
460
+ RemoteBranchCreated ,
461
+ LocalBranchDeleted ,
462
+ LocalBranchCreated ,
463
+ LocalBranchChanged
464
+ }
465
+
466
+ private class EventData
467
+ {
468
+ public string Origin ;
469
+ public string Branch ;
470
+ }
391
471
}
392
472
}
0 commit comments