Skip to content
This repository was archived by the owner on Dec 5, 2024. It is now read-only.

Commit 0cd5b78

Browse files
Merge pull request #368 from github-for-unity/shana/queueing-watcher-events
Split event processing and process firing
2 parents 87d9811 + 6966e57 commit 0cd5b78

File tree

1 file changed

+132
-52
lines changed

1 file changed

+132
-52
lines changed

src/GitHub.Api/Events/RepositoryWatcher.cs

Lines changed: 132 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)