From 12eac941d27d8a1d7ed8a6e4daee9069a74d35aa Mon Sep 17 00:00:00 2001 From: Andreia Gaita Date: Mon, 16 Oct 2017 18:05:13 +0200 Subject: [PATCH 1/4] Split event processing and process firing --- src/GitHub.Api/Events/RepositoryWatcher.cs | 180 +++++++++++++++------ 1 file changed, 128 insertions(+), 52 deletions(-) diff --git a/src/GitHub.Api/Events/RepositoryWatcher.cs b/src/GitHub.Api/Events/RepositoryWatcher.cs index 788fdff93..6f3de0ac7 100644 --- a/src/GitHub.Api/Events/RepositoryWatcher.cs +++ b/src/GitHub.Api/Events/RepositoryWatcher.cs @@ -160,14 +160,30 @@ public int CheckAndProcessEvents() return processedEventCount; } - private int ProcessEvents(Event[] fileEvents) + enum EventType + { + None, + ConfigChanged, + HeadChanged, + RepositoryChanged, + IndexChanged, + RemoteBranchDeleted, + RemoteBranchCreated, + RemoteBranchChanged, + LocalBranchDeleted, + LocalBranchCreated, + LocalBranchChanged + } + + class EventData { - var eventsProcessed = 0; - var configChanged = false; - var headChanged = false; - var repositoryChanged = false; - var indexChanged = false; + public string Origin; + public string Branch; + } + private int ProcessEvents(Event[] fileEvents) + { + Dictionary> events = new Dictionary>(); foreach (var fileEvent in fileEvents) { if (!running) @@ -195,29 +211,17 @@ private int ProcessEvents(Event[] fileEvents) // handling events in .git/* if (fileA.IsChildOf(paths.DotGitPath)) { - if (!configChanged && fileA.Equals(paths.DotGitConfig)) + if (!events.ContainsKey(EventType.ConfigChanged) && fileA.Equals(paths.DotGitConfig)) { - configChanged = true; - - Logger.Trace("ConfigChanged"); - ConfigChanged?.Invoke(); - eventsProcessed++; + events.Add(EventType.ConfigChanged, null); } - else if (!headChanged && fileA.Equals(paths.DotGitHead)) + else if (!events.ContainsKey(EventType.HeadChanged) && fileA.Equals(paths.DotGitHead)) { - headChanged = true; - - Logger.Trace("HeadChanged"); - HeadChanged?.Invoke(); - eventsProcessed++; + events.Add(EventType.HeadChanged, null); } - else if (!indexChanged && fileA.Equals(paths.DotGitIndex)) + else if (!events.ContainsKey(EventType.IndexChanged) && fileA.Equals(paths.DotGitIndex)) { - indexChanged = true; - - Logger.Trace("IndexChanged"); - IndexChanged?.Invoke(); - eventsProcessed++; + events.Add(EventType.IndexChanged, null); } else if (fileA.IsChildOf(paths.RemotesPath)) { @@ -231,7 +235,7 @@ private int ProcessEvents(Event[] fileEvents) var origin = relativePathElements[0]; - if (fileEvent.Type == EventType.DELETED) + if (fileEvent.Type == sfw.net.EventType.DELETED) { if (fileA.ExtensionWithDot == ".lock") { @@ -239,12 +243,9 @@ private int ProcessEvents(Event[] fileEvents) } var branch = string.Join(@"/", relativePathElements.Skip(1).ToArray()); - - Logger.Trace("RemoteBranchDeleted: {0}/{1}", origin, branch); - RemoteBranchDeleted?.Invoke(origin, branch); - eventsProcessed++; + AddOrUpdateEventData(events, EventType.RemoteBranchDeleted, new EventData { Origin = origin, Branch = branch }); } - else if (fileEvent.Type == EventType.RENAMED) + else if (fileEvent.Type == sfw.net.EventType.RENAMED) { if (fileA.ExtensionWithDot != ".lock") { @@ -260,17 +261,14 @@ private int ProcessEvents(Event[] fileEvents) .Union(new[] { fileA.FileNameWithoutExtension }).ToArray(); var branch = string.Join(@"/", branchPathElement); - - Logger.Trace("RemoteBranchCreated: {0}/{1}", origin, branch); - RemoteBranchCreated?.Invoke(origin, branch); - eventsProcessed++; + AddOrUpdateEventData(events, EventType.RemoteBranchCreated, new EventData { Origin = origin, Branch = branch }); } } } } else if (fileA.IsChildOf(paths.BranchesPath)) { - if (fileEvent.Type == EventType.MODIFIED) + if (fileEvent.Type == sfw.net.EventType.MODIFIED) { if (fileA.DirectoryExists()) { @@ -292,11 +290,10 @@ private int ProcessEvents(Event[] fileEvents) var branch = string.Join(@"/", relativePathElements.ToArray()); - Logger.Trace("LocalBranchChanged: {0}", branch); - LocalBranchChanged?.Invoke(branch); - eventsProcessed++; + AddOrUpdateEventData(events, EventType.LocalBranchChanged, new EventData { Branch = branch }); + } - else if (fileEvent.Type == EventType.DELETED) + else if (fileEvent.Type == sfw.net.EventType.DELETED) { if (fileA.ExtensionWithDot == ".lock") { @@ -312,12 +309,9 @@ private int ProcessEvents(Event[] fileEvents) } var branch = string.Join(@"/", relativePathElements.ToArray()); - - Logger.Trace("LocalBranchDeleted: {0}", branch); - LocalBranchDeleted?.Invoke(branch); - eventsProcessed++; + AddOrUpdateEventData(events, EventType.LocalBranchDeleted, new EventData { Branch = branch }); } - else if (fileEvent.Type == EventType.RENAMED) + else if (fileEvent.Type == sfw.net.EventType.RENAMED) { if (fileA.ExtensionWithDot != ".lock") { @@ -337,10 +331,7 @@ private int ProcessEvents(Event[] fileEvents) } var branch = string.Join(@"/", relativePathElements.ToArray()); - - Logger.Trace("LocalBranchCreated: {0}", branch); - LocalBranchCreated?.Invoke(branch); - eventsProcessed++; + AddOrUpdateEventData(events, EventType.LocalBranchCreated, new EventData { Branch = branch }); } } } @@ -348,19 +339,104 @@ private int ProcessEvents(Event[] fileEvents) } else { - if (repositoryChanged || ignoredPaths.Any(ignoredPath => fileA.IsChildOf(ignoredPath))) + if (events.ContainsKey(EventType.RepositoryChanged) || ignoredPaths.Any(ignoredPath => fileA.IsChildOf(ignoredPath))) { continue; } + events.Add(EventType.RepositoryChanged, null); + } + } + + return FireEvents(events); + } - repositoryChanged = true; + private void AddOrUpdateEventData(Dictionary> events, EventType type, EventData data) + { + if (!events.ContainsKey(type)) + events.Add(type, new List()); + events[type].Add(data); + } - Logger.Trace("RepositoryChanged"); - RepositoryChanged?.Invoke(); + private int FireEvents(Dictionary> events) + { + int eventsProcessed = 0; + if (events.ContainsKey(EventType.ConfigChanged)) + { + Logger.Trace("ConfigChanged"); + ConfigChanged?.Invoke(); + eventsProcessed++; + } + + if (events.ContainsKey(EventType.HeadChanged)) + { + Logger.Trace("HeadChanged"); + HeadChanged?.Invoke(); + eventsProcessed++; + } + + if (events.ContainsKey(EventType.IndexChanged)) + { + Logger.Trace("IndexChanged"); + IndexChanged?.Invoke(); + eventsProcessed++; + } + + if (events.ContainsKey(EventType.RepositoryChanged)) + { + Logger.Trace("RepositoryChanged"); + RepositoryChanged?.Invoke(); + eventsProcessed++; + } + + if (events.ContainsKey(EventType.LocalBranchCreated)) + { + foreach (var evt in events[EventType.LocalBranchCreated]) + { + Logger.Trace($"LocalBranchCreated: {evt.Branch}"); + LocalBranchCreated?.Invoke(evt.Branch); eventsProcessed++; } } + if (events.ContainsKey(EventType.LocalBranchChanged)) + { + foreach (var evt in events[EventType.LocalBranchChanged]) + { + Logger.Trace($"LocalBranchChanged: {evt.Branch}"); + LocalBranchChanged?.Invoke(evt.Branch); + eventsProcessed++; + } + } + + if (events.ContainsKey(EventType.LocalBranchDeleted)) + { + foreach (var evt in events[EventType.LocalBranchDeleted]) + { + Logger.Trace($"LocalBranchDeleted: {evt.Branch}"); + LocalBranchDeleted?.Invoke(evt.Branch); + eventsProcessed++; + } + } + + if (events.ContainsKey(EventType.RemoteBranchCreated)) + { + foreach (var evt in events[EventType.RemoteBranchCreated]) + { + Logger.Trace($"RemoteBranchCreated: {evt.Origin}/{evt.Branch}"); + RemoteBranchCreated?.Invoke(evt.Origin, evt.Branch); + eventsProcessed++; + } + } + + if (events.ContainsKey(EventType.RemoteBranchDeleted)) + { + foreach (var evt in events[EventType.RemoteBranchDeleted]) + { + Logger.Trace($"RemoteBranchDeleted: {evt.Origin}/{evt.Branch}"); + RemoteBranchDeleted?.Invoke(evt.Origin, evt.Branch); + eventsProcessed++; + } + } return eventsProcessed; } From a2e6a521ea4a007e5d762a20995b045c17494310 Mon Sep 17 00:00:00 2001 From: Andreia Gaita Date: Mon, 16 Oct 2017 18:11:57 +0200 Subject: [PATCH 2/4] Put things in their proper place --- src/GitHub.Api/Events/RepositoryWatcher.cs | 42 +++++++++++----------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/src/GitHub.Api/Events/RepositoryWatcher.cs b/src/GitHub.Api/Events/RepositoryWatcher.cs index 6f3de0ac7..025b93eb8 100644 --- a/src/GitHub.Api/Events/RepositoryWatcher.cs +++ b/src/GitHub.Api/Events/RepositoryWatcher.cs @@ -160,27 +160,6 @@ public int CheckAndProcessEvents() return processedEventCount; } - enum EventType - { - None, - ConfigChanged, - HeadChanged, - RepositoryChanged, - IndexChanged, - RemoteBranchDeleted, - RemoteBranchCreated, - RemoteBranchChanged, - LocalBranchDeleted, - LocalBranchCreated, - LocalBranchChanged - } - - class EventData - { - public string Origin; - public string Branch; - } - private int ProcessEvents(Event[] fileEvents) { Dictionary> events = new Dictionary>(); @@ -464,5 +443,26 @@ public void Dispose() } protected static ILogging Logger { get; } = Logging.GetLogger(); + + private enum EventType + { + None, + ConfigChanged, + HeadChanged, + RepositoryChanged, + IndexChanged, + RemoteBranchDeleted, + RemoteBranchCreated, + RemoteBranchChanged, + LocalBranchDeleted, + LocalBranchCreated, + LocalBranchChanged + } + + private class EventData + { + public string Origin; + public string Branch; + } } } From 9b776d17319a3005392ff2ae63b54eb23e72992f Mon Sep 17 00:00:00 2001 From: Stanley Goldman Date: Mon, 16 Oct 2017 13:20:28 -0400 Subject: [PATCH 3/4] Using TryGet to fire events --- src/GitHub.Api/Events/RepositoryWatcher.cs | 25 +++++++++++++--------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/src/GitHub.Api/Events/RepositoryWatcher.cs b/src/GitHub.Api/Events/RepositoryWatcher.cs index 025b93eb8..bd2576815 100644 --- a/src/GitHub.Api/Events/RepositoryWatcher.cs +++ b/src/GitHub.Api/Events/RepositoryWatcher.cs @@ -367,9 +367,10 @@ private int FireEvents(Dictionary> events) eventsProcessed++; } - if (events.ContainsKey(EventType.LocalBranchCreated)) + List localBranchesCreated; + if (events.TryGetValue(EventType.LocalBranchCreated, out localBranchesCreated)) { - foreach (var evt in events[EventType.LocalBranchCreated]) + foreach (var evt in localBranchesCreated) { Logger.Trace($"LocalBranchCreated: {evt.Branch}"); LocalBranchCreated?.Invoke(evt.Branch); @@ -377,9 +378,10 @@ private int FireEvents(Dictionary> events) } } - if (events.ContainsKey(EventType.LocalBranchChanged)) + List localBranchesChanged; + if (events.TryGetValue(EventType.LocalBranchChanged, out localBranchesChanged)) { - foreach (var evt in events[EventType.LocalBranchChanged]) + foreach (var evt in localBranchesChanged) { Logger.Trace($"LocalBranchChanged: {evt.Branch}"); LocalBranchChanged?.Invoke(evt.Branch); @@ -387,9 +389,10 @@ private int FireEvents(Dictionary> events) } } - if (events.ContainsKey(EventType.LocalBranchDeleted)) + List localBranchesDeleted; + if (events.TryGetValue(EventType.LocalBranchDeleted, out localBranchesDeleted)) { - foreach (var evt in events[EventType.LocalBranchDeleted]) + foreach (var evt in localBranchesDeleted) { Logger.Trace($"LocalBranchDeleted: {evt.Branch}"); LocalBranchDeleted?.Invoke(evt.Branch); @@ -397,9 +400,10 @@ private int FireEvents(Dictionary> events) } } - if (events.ContainsKey(EventType.RemoteBranchCreated)) + List remoteBranchesCreated; + if (events.TryGetValue(EventType.RemoteBranchCreated, out remoteBranchesCreated)) { - foreach (var evt in events[EventType.RemoteBranchCreated]) + foreach (var evt in remoteBranchesCreated) { Logger.Trace($"RemoteBranchCreated: {evt.Origin}/{evt.Branch}"); RemoteBranchCreated?.Invoke(evt.Origin, evt.Branch); @@ -407,9 +411,10 @@ private int FireEvents(Dictionary> events) } } - if (events.ContainsKey(EventType.RemoteBranchDeleted)) + List remoteBranchesDeleted; + if (events.TryGetValue(EventType.RemoteBranchDeleted, out remoteBranchesDeleted)) { - foreach (var evt in events[EventType.RemoteBranchDeleted]) + foreach (var evt in remoteBranchesDeleted) { Logger.Trace($"RemoteBranchDeleted: {evt.Origin}/{evt.Branch}"); RemoteBranchDeleted?.Invoke(evt.Origin, evt.Branch); From 6966e576a309a9cea99f12aa4a7cc19cbf2d49d5 Mon Sep 17 00:00:00 2001 From: Andreia Gaita Date: Tue, 17 Oct 2017 19:20:46 +0200 Subject: [PATCH 4/4] Remove unused event --- src/GitHub.Api/Events/RepositoryWatcher.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/GitHub.Api/Events/RepositoryWatcher.cs b/src/GitHub.Api/Events/RepositoryWatcher.cs index bd2576815..b72d6bd3c 100644 --- a/src/GitHub.Api/Events/RepositoryWatcher.cs +++ b/src/GitHub.Api/Events/RepositoryWatcher.cs @@ -458,7 +458,6 @@ private enum EventType IndexChanged, RemoteBranchDeleted, RemoteBranchCreated, - RemoteBranchChanged, LocalBranchDeleted, LocalBranchCreated, LocalBranchChanged