@@ -160,14 +160,30 @@ public int CheckAndProcessEvents()
160
160
return processedEventCount ;
161
161
}
162
162
163
- private int ProcessEvents ( Event [ ] fileEvents )
163
+ enum EventType
164
+ {
165
+ None ,
166
+ ConfigChanged ,
167
+ HeadChanged ,
168
+ RepositoryChanged ,
169
+ IndexChanged ,
170
+ RemoteBranchDeleted ,
171
+ RemoteBranchCreated ,
172
+ RemoteBranchChanged ,
173
+ LocalBranchDeleted ,
174
+ LocalBranchCreated ,
175
+ LocalBranchChanged
176
+ }
177
+
178
+ class EventData
164
179
{
165
- var eventsProcessed = 0 ;
166
- var configChanged = false ;
167
- var headChanged = false ;
168
- var repositoryChanged = false ;
169
- var indexChanged = false ;
180
+ public string Origin ;
181
+ public string Branch ;
182
+ }
170
183
184
+ private int ProcessEvents ( Event [ ] fileEvents )
185
+ {
186
+ Dictionary < EventType , List < EventData > > events = new Dictionary < EventType , List < EventData > > ( ) ;
171
187
foreach ( var fileEvent in fileEvents )
172
188
{
173
189
if ( ! running )
@@ -195,29 +211,17 @@ private int ProcessEvents(Event[] fileEvents)
195
211
// handling events in .git/*
196
212
if ( fileA . IsChildOf ( paths . DotGitPath ) )
197
213
{
198
- if ( ! configChanged && fileA . Equals ( paths . DotGitConfig ) )
214
+ if ( ! events . ContainsKey ( EventType . ConfigChanged ) && fileA . Equals ( paths . DotGitConfig ) )
199
215
{
200
- configChanged = true ;
201
-
202
- Logger . Trace ( "ConfigChanged" ) ;
203
- ConfigChanged ? . Invoke ( ) ;
204
- eventsProcessed ++ ;
216
+ events . Add ( EventType . ConfigChanged , null ) ;
205
217
}
206
- else if ( ! headChanged && fileA . Equals ( paths . DotGitHead ) )
218
+ else if ( ! events . ContainsKey ( EventType . HeadChanged ) && fileA . Equals ( paths . DotGitHead ) )
207
219
{
208
- headChanged = true ;
209
-
210
- Logger . Trace ( "HeadChanged" ) ;
211
- HeadChanged ? . Invoke ( ) ;
212
- eventsProcessed ++ ;
220
+ events . Add ( EventType . HeadChanged , null ) ;
213
221
}
214
- else if ( ! indexChanged && fileA . Equals ( paths . DotGitIndex ) )
222
+ else if ( ! events . ContainsKey ( EventType . IndexChanged ) && fileA . Equals ( paths . DotGitIndex ) )
215
223
{
216
- indexChanged = true ;
217
-
218
- Logger . Trace ( "IndexChanged" ) ;
219
- IndexChanged ? . Invoke ( ) ;
220
- eventsProcessed ++ ;
224
+ events . Add ( EventType . IndexChanged , null ) ;
221
225
}
222
226
else if ( fileA . IsChildOf ( paths . RemotesPath ) )
223
227
{
@@ -231,20 +235,17 @@ private int ProcessEvents(Event[] fileEvents)
231
235
232
236
var origin = relativePathElements [ 0 ] ;
233
237
234
- if ( fileEvent . Type == EventType . DELETED )
238
+ if ( fileEvent . Type == sfw . net . EventType . DELETED )
235
239
{
236
240
if ( fileA . ExtensionWithDot == ".lock" )
237
241
{
238
242
continue ;
239
243
}
240
244
241
245
var branch = string . Join ( @"/" , relativePathElements . Skip ( 1 ) . ToArray ( ) ) ;
242
-
243
- Logger . Trace ( "RemoteBranchDeleted: {0}/{1}" , origin , branch ) ;
244
- RemoteBranchDeleted ? . Invoke ( origin , branch ) ;
245
- eventsProcessed ++ ;
246
+ AddOrUpdateEventData ( events , EventType . RemoteBranchDeleted , new EventData { Origin = origin , Branch = branch } ) ;
246
247
}
247
- else if ( fileEvent . Type == EventType . RENAMED )
248
+ else if ( fileEvent . Type == sfw . net . EventType . RENAMED )
248
249
{
249
250
if ( fileA . ExtensionWithDot != ".lock" )
250
251
{
@@ -260,17 +261,14 @@ private int ProcessEvents(Event[] fileEvents)
260
261
. Union ( new [ ] { fileA . FileNameWithoutExtension } ) . ToArray ( ) ;
261
262
262
263
var branch = string . Join ( @"/" , branchPathElement ) ;
263
-
264
- Logger . Trace ( "RemoteBranchCreated: {0}/{1}" , origin , branch ) ;
265
- RemoteBranchCreated ? . Invoke ( origin , branch ) ;
266
- eventsProcessed ++ ;
264
+ AddOrUpdateEventData ( events , EventType . RemoteBranchCreated , new EventData { Origin = origin , Branch = branch } ) ;
267
265
}
268
266
}
269
267
}
270
268
}
271
269
else if ( fileA . IsChildOf ( paths . BranchesPath ) )
272
270
{
273
- if ( fileEvent . Type == EventType . MODIFIED )
271
+ if ( fileEvent . Type == sfw . net . EventType . MODIFIED )
274
272
{
275
273
if ( fileA . DirectoryExists ( ) )
276
274
{
@@ -292,11 +290,10 @@ private int ProcessEvents(Event[] fileEvents)
292
290
293
291
var branch = string . Join ( @"/" , relativePathElements . ToArray ( ) ) ;
294
292
295
- Logger . Trace ( "LocalBranchChanged: {0}" , branch ) ;
296
- LocalBranchChanged ? . Invoke ( branch ) ;
297
- eventsProcessed ++ ;
293
+ AddOrUpdateEventData ( events , EventType . LocalBranchChanged , new EventData { Branch = branch } ) ;
294
+
298
295
}
299
- else if ( fileEvent . Type == EventType . DELETED )
296
+ else if ( fileEvent . Type == sfw . net . EventType . DELETED )
300
297
{
301
298
if ( fileA . ExtensionWithDot == ".lock" )
302
299
{
@@ -312,12 +309,9 @@ private int ProcessEvents(Event[] fileEvents)
312
309
}
313
310
314
311
var branch = string . Join ( @"/" , relativePathElements . ToArray ( ) ) ;
315
-
316
- Logger . Trace ( "LocalBranchDeleted: {0}" , branch ) ;
317
- LocalBranchDeleted ? . Invoke ( branch ) ;
318
- eventsProcessed ++ ;
312
+ AddOrUpdateEventData ( events , EventType . LocalBranchDeleted , new EventData { Branch = branch } ) ;
319
313
}
320
- else if ( fileEvent . Type == EventType . RENAMED )
314
+ else if ( fileEvent . Type == sfw . net . EventType . RENAMED )
321
315
{
322
316
if ( fileA . ExtensionWithDot != ".lock" )
323
317
{
@@ -337,30 +331,112 @@ private int ProcessEvents(Event[] fileEvents)
337
331
}
338
332
339
333
var branch = string . Join ( @"/" , relativePathElements . ToArray ( ) ) ;
340
-
341
- Logger . Trace ( "LocalBranchCreated: {0}" , branch ) ;
342
- LocalBranchCreated ? . Invoke ( branch ) ;
343
- eventsProcessed ++ ;
334
+ AddOrUpdateEventData ( events , EventType . LocalBranchCreated , new EventData { Branch = branch } ) ;
344
335
}
345
336
}
346
337
}
347
338
}
348
339
}
349
340
else
350
341
{
351
- if ( repositoryChanged || ignoredPaths . Any ( ignoredPath => fileA . IsChildOf ( ignoredPath ) ) )
342
+ if ( events . ContainsKey ( EventType . RepositoryChanged ) || ignoredPaths . Any ( ignoredPath => fileA . IsChildOf ( ignoredPath ) ) )
352
343
{
353
344
continue ;
354
345
}
346
+ events . Add ( EventType . RepositoryChanged , null ) ;
347
+ }
348
+ }
349
+
350
+ return FireEvents ( events ) ;
351
+ }
355
352
356
- repositoryChanged = true ;
353
+ private void AddOrUpdateEventData ( Dictionary < EventType , List < EventData > > events , EventType type , EventData data )
354
+ {
355
+ if ( ! events . ContainsKey ( type ) )
356
+ events . Add ( type , new List < EventData > ( ) ) ;
357
+ events [ type ] . Add ( data ) ;
358
+ }
357
359
358
- Logger . Trace ( "RepositoryChanged" ) ;
359
- RepositoryChanged ? . Invoke ( ) ;
360
+ private int FireEvents ( Dictionary < EventType , List < EventData > > events )
361
+ {
362
+ int eventsProcessed = 0 ;
363
+ if ( events . ContainsKey ( EventType . ConfigChanged ) )
364
+ {
365
+ Logger . Trace ( "ConfigChanged" ) ;
366
+ ConfigChanged ? . Invoke ( ) ;
367
+ eventsProcessed ++ ;
368
+ }
369
+
370
+ if ( events . ContainsKey ( EventType . HeadChanged ) )
371
+ {
372
+ Logger . Trace ( "HeadChanged" ) ;
373
+ HeadChanged ? . Invoke ( ) ;
374
+ eventsProcessed ++ ;
375
+ }
376
+
377
+ if ( events . ContainsKey ( EventType . IndexChanged ) )
378
+ {
379
+ Logger . Trace ( "IndexChanged" ) ;
380
+ IndexChanged ? . Invoke ( ) ;
381
+ eventsProcessed ++ ;
382
+ }
383
+
384
+ if ( events . ContainsKey ( EventType . RepositoryChanged ) )
385
+ {
386
+ Logger . Trace ( "RepositoryChanged" ) ;
387
+ RepositoryChanged ? . Invoke ( ) ;
388
+ eventsProcessed ++ ;
389
+ }
390
+
391
+ if ( events . ContainsKey ( EventType . LocalBranchCreated ) )
392
+ {
393
+ foreach ( var evt in events [ EventType . LocalBranchCreated ] )
394
+ {
395
+ Logger . Trace ( $ "LocalBranchCreated: { evt . Branch } ") ;
396
+ LocalBranchCreated ? . Invoke ( evt . Branch ) ;
360
397
eventsProcessed ++ ;
361
398
}
362
399
}
363
400
401
+ if ( events . ContainsKey ( EventType . LocalBranchChanged ) )
402
+ {
403
+ foreach ( var evt in events [ EventType . LocalBranchChanged ] )
404
+ {
405
+ Logger . Trace ( $ "LocalBranchChanged: { evt . Branch } ") ;
406
+ LocalBranchChanged ? . Invoke ( evt . Branch ) ;
407
+ eventsProcessed ++ ;
408
+ }
409
+ }
410
+
411
+ if ( events . ContainsKey ( EventType . LocalBranchDeleted ) )
412
+ {
413
+ foreach ( var evt in events [ EventType . LocalBranchDeleted ] )
414
+ {
415
+ Logger . Trace ( $ "LocalBranchDeleted: { evt . Branch } ") ;
416
+ LocalBranchDeleted ? . Invoke ( evt . Branch ) ;
417
+ eventsProcessed ++ ;
418
+ }
419
+ }
420
+
421
+ if ( events . ContainsKey ( EventType . RemoteBranchCreated ) )
422
+ {
423
+ foreach ( var evt in events [ EventType . RemoteBranchCreated ] )
424
+ {
425
+ Logger . Trace ( $ "RemoteBranchCreated: { evt . Origin } /{ evt . Branch } ") ;
426
+ RemoteBranchCreated ? . Invoke ( evt . Origin , evt . Branch ) ;
427
+ eventsProcessed ++ ;
428
+ }
429
+ }
430
+
431
+ if ( events . ContainsKey ( EventType . RemoteBranchDeleted ) )
432
+ {
433
+ foreach ( var evt in events [ EventType . RemoteBranchDeleted ] )
434
+ {
435
+ Logger . Trace ( $ "RemoteBranchDeleted: { evt . Origin } /{ evt . Branch } ") ;
436
+ RemoteBranchDeleted ? . Invoke ( evt . Origin , evt . Branch ) ;
437
+ eventsProcessed ++ ;
438
+ }
439
+ }
364
440
return eventsProcessed ;
365
441
}
366
442
0 commit comments