@@ -162,12 +162,7 @@ public int CheckAndProcessEvents()
162162
163163 private int ProcessEvents ( Event [ ] fileEvents )
164164 {
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 > > ( ) ;
171166 foreach ( var fileEvent in fileEvents )
172167 {
173168 if ( ! running )
@@ -195,29 +190,17 @@ private int ProcessEvents(Event[] fileEvents)
195190 // handling events in .git/*
196191 if ( fileA . IsChildOf ( paths . DotGitPath ) )
197192 {
198- if ( ! configChanged && fileA . Equals ( paths . DotGitConfig ) )
193+ if ( ! events . ContainsKey ( EventType . ConfigChanged ) && fileA . Equals ( paths . DotGitConfig ) )
199194 {
200- configChanged = true ;
201-
202- Logger . Trace ( "ConfigChanged" ) ;
203- ConfigChanged ? . Invoke ( ) ;
204- eventsProcessed ++ ;
195+ events . Add ( EventType . ConfigChanged , null ) ;
205196 }
206- else if ( ! headChanged && fileA . Equals ( paths . DotGitHead ) )
197+ else if ( ! events . ContainsKey ( EventType . HeadChanged ) && fileA . Equals ( paths . DotGitHead ) )
207198 {
208- headChanged = true ;
209-
210- Logger . Trace ( "HeadChanged" ) ;
211- HeadChanged ? . Invoke ( ) ;
212- eventsProcessed ++ ;
199+ events . Add ( EventType . HeadChanged , null ) ;
213200 }
214- else if ( ! indexChanged && fileA . Equals ( paths . DotGitIndex ) )
201+ else if ( ! events . ContainsKey ( EventType . IndexChanged ) && fileA . Equals ( paths . DotGitIndex ) )
215202 {
216- indexChanged = true ;
217-
218- Logger . Trace ( "IndexChanged" ) ;
219- IndexChanged ? . Invoke ( ) ;
220- eventsProcessed ++ ;
203+ events . Add ( EventType . IndexChanged , null ) ;
221204 }
222205 else if ( fileA . IsChildOf ( paths . RemotesPath ) )
223206 {
@@ -231,20 +214,17 @@ private int ProcessEvents(Event[] fileEvents)
231214
232215 var origin = relativePathElements [ 0 ] ;
233216
234- if ( fileEvent . Type == EventType . DELETED )
217+ if ( fileEvent . Type == sfw . net . EventType . DELETED )
235218 {
236219 if ( fileA . ExtensionWithDot == ".lock" )
237220 {
238221 continue ;
239222 }
240223
241224 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 } ) ;
246226 }
247- else if ( fileEvent . Type == EventType . RENAMED )
227+ else if ( fileEvent . Type == sfw . net . EventType . RENAMED )
248228 {
249229 if ( fileA . ExtensionWithDot != ".lock" )
250230 {
@@ -260,17 +240,14 @@ private int ProcessEvents(Event[] fileEvents)
260240 . Union ( new [ ] { fileA . FileNameWithoutExtension } ) . ToArray ( ) ;
261241
262242 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 } ) ;
267244 }
268245 }
269246 }
270247 }
271248 else if ( fileA . IsChildOf ( paths . BranchesPath ) )
272249 {
273- if ( fileEvent . Type == EventType . MODIFIED )
250+ if ( fileEvent . Type == sfw . net . EventType . MODIFIED )
274251 {
275252 if ( fileA . DirectoryExists ( ) )
276253 {
@@ -292,11 +269,10 @@ private int ProcessEvents(Event[] fileEvents)
292269
293270 var branch = string . Join ( @"/" , relativePathElements . ToArray ( ) ) ;
294271
295- Logger . Trace ( "LocalBranchChanged: {0}" , branch ) ;
296- LocalBranchChanged ? . Invoke ( branch ) ;
297- eventsProcessed ++ ;
272+ AddOrUpdateEventData ( events , EventType . LocalBranchChanged , new EventData { Branch = branch } ) ;
273+
298274 }
299- else if ( fileEvent . Type == EventType . DELETED )
275+ else if ( fileEvent . Type == sfw . net . EventType . DELETED )
300276 {
301277 if ( fileA . ExtensionWithDot == ".lock" )
302278 {
@@ -312,12 +288,9 @@ private int ProcessEvents(Event[] fileEvents)
312288 }
313289
314290 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 } ) ;
319292 }
320- else if ( fileEvent . Type == EventType . RENAMED )
293+ else if ( fileEvent . Type == sfw . net . EventType . RENAMED )
321294 {
322295 if ( fileA . ExtensionWithDot != ".lock" )
323296 {
@@ -337,30 +310,117 @@ private int ProcessEvents(Event[] fileEvents)
337310 }
338311
339312 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 } ) ;
344314 }
345315 }
346316 }
347317 }
348318 }
349319 else
350320 {
351- if ( repositoryChanged || ignoredPaths . Any ( ignoredPath => fileA . IsChildOf ( ignoredPath ) ) )
321+ if ( events . ContainsKey ( EventType . RepositoryChanged ) || ignoredPaths . Any ( ignoredPath => fileA . IsChildOf ( ignoredPath ) ) )
352322 {
353323 continue ;
354324 }
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+ }
355348
356- repositoryChanged = true ;
349+ if ( events . ContainsKey ( EventType . HeadChanged ) )
350+ {
351+ Logger . Trace ( "HeadChanged" ) ;
352+ HeadChanged ? . Invoke ( ) ;
353+ eventsProcessed ++ ;
354+ }
357355
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 ) ;
360377 eventsProcessed ++ ;
361378 }
362379 }
363380
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+ }
364424 return eventsProcessed ;
365425 }
366426
@@ -388,5 +448,25 @@ public void Dispose()
388448 }
389449
390450 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+ }
391471 }
392472}
0 commit comments