From c4938ed4871df91c26d92913fe019a914481a290 Mon Sep 17 00:00:00 2001 From: Stanley Goldman Date: Fri, 15 Sep 2017 16:46:05 -0400 Subject: [PATCH 1/5] Batching events from the RepositoryWatcher --- src/GitHub.Api/Events/RepositoryWatcher.cs | 292 +++++++++++---------- 1 file changed, 157 insertions(+), 135 deletions(-) diff --git a/src/GitHub.Api/Events/RepositoryWatcher.cs b/src/GitHub.Api/Events/RepositoryWatcher.cs index 1ea868b4f..a2ad3d4e8 100644 --- a/src/GitHub.Api/Events/RepositoryWatcher.cs +++ b/src/GitHub.Api/Events/RepositoryWatcher.cs @@ -149,9 +149,22 @@ public int CheckAndProcessEvents() if (fileEvents.Length > 0) { Logger.Trace("Processing {0} Events", fileEvents.Length); + ProcessEvents(fileEvents); } + processingEvents = false; + signalProcessingEventsDone.Set(); + return lastCountOfProcessedEvents; + } + + private void ProcessEvents(Event[] fileEvents) + { + var configChanged = false; + var headChanged = false; var repositoryChanged = false; + var indexChanged = false; + + string headContent = null; foreach (var fileEvent in fileEvents) { @@ -180,175 +193,184 @@ public int CheckAndProcessEvents() // handling events in .git/* if (fileA.IsChildOf(paths.DotGitPath)) { - HandleEventInDotGit(fileEvent, fileA, fileB); - } - else - { - if (repositoryChanged || ignoredPaths.Any(ignoredPath => fileA.IsChildOf(ignoredPath))) + if (fileA.Equals(paths.DotGitConfig)) { - continue; - } - - repositoryChanged = true; - } - lastCountOfProcessedEvents++; - } - - if (repositoryChanged) - { - Logger.Trace("RepositoryChanged"); - RepositoryChanged?.Invoke(); - } - - processingEvents = false; - signalProcessingEventsDone.Set(); - return lastCountOfProcessedEvents; - } + Logger.Trace("ConfigChanged"); - private void HandleEventInDotGit(Event fileEvent, NPath fileA, NPath fileB = null) - { - if (fileA.Equals(paths.DotGitConfig)) - { - Logger.Trace("ConfigChanged"); - - ConfigChanged?.Invoke(); - } - else if (fileA.Equals(paths.DotGitHead)) - { - string headContent = null; - if (fileEvent.Type != EventType.DELETED) - { - headContent = paths.DotGitHead.ReadAllLines().FirstOrDefault(); - } - - Logger.Trace("HeadChanged: {0}", headContent ?? "[null]"); - HeadChanged?.Invoke(headContent); - } - else if (fileA.Equals(paths.DotGitIndex)) - { - Logger.Trace("IndexChanged"); - IndexChanged?.Invoke(); - } - else if (fileA.IsChildOf(paths.RemotesPath)) - { - var relativePath = fileA.RelativeTo(paths.RemotesPath); - var relativePathElements = relativePath.Elements.ToArray(); - - if (!relativePathElements.Any()) - { - return; - } - - var origin = relativePathElements[0]; + configChanged = true; + } + else if (fileA.Equals(paths.DotGitHead)) + { + if (fileEvent.Type != EventType.DELETED) + { + headContent = paths.DotGitHead.ReadAllLines().FirstOrDefault(); + } - if (fileEvent.Type == EventType.DELETED) - { - if (fileA.ExtensionWithDot == ".lock") + Logger.Trace("HeadChanged: {0}", headContent ?? "[null]"); + headChanged = true; + } + else if (fileA.Equals(paths.DotGitIndex)) { - return; + Logger.Trace("IndexChanged"); + indexChanged = true; } + else if (fileA.IsChildOf(paths.RemotesPath)) + { + var relativePath = fileA.RelativeTo(paths.RemotesPath); + var relativePathElements = relativePath.Elements.ToArray(); - var branch = string.Join(@"/", relativePathElements.Skip(1).ToArray()); + if (!relativePathElements.Any()) + { + continue; + } - Logger.Trace("RemoteBranchDeleted: {0}/{1}", origin, branch); - RemoteBranchDeleted?.Invoke(origin, branch); - } - else if (fileEvent.Type == EventType.RENAMED) - { - if (fileA.ExtensionWithDot != ".lock") - { - return; - } + var origin = relativePathElements[0]; - if (fileB != null && fileB.FileExists()) - { - if (fileA.FileNameWithoutExtension == fileB.FileNameWithoutExtension) + if (fileEvent.Type == EventType.DELETED) { - var branchPathElement = relativePathElements.Skip(1) - .Take(relativePathElements.Length-2) - .Union(new [] { fileA.FileNameWithoutExtension }).ToArray(); + if (fileA.ExtensionWithDot == ".lock") + { + continue; + } - var branch = string.Join(@"/", branchPathElement); + var branch = string.Join(@"/", relativePathElements.Skip(1).ToArray()); - Logger.Trace("RemoteBranchCreated: {0}/{1}", origin, branch); - RemoteBranchCreated?.Invoke(origin, branch); + Logger.Trace("RemoteBranchDeleted: {0}/{1}", origin, branch); + RemoteBranchDeleted?.Invoke(origin, branch); } - } - } - } - else if (fileA.IsChildOf(paths.BranchesPath)) - { - if (fileEvent.Type == EventType.MODIFIED) - { - if (fileA.DirectoryExists()) - { - return; - } + else if (fileEvent.Type == EventType.RENAMED) + { + if (fileA.ExtensionWithDot != ".lock") + { + continue; + } - if (fileA.ExtensionWithDot == ".lock") - { - return; - } + if (fileB != null && fileB.FileExists()) + { + if (fileA.FileNameWithoutExtension == fileB.FileNameWithoutExtension) + { + var branchPathElement = relativePathElements + .Skip(1).Take(relativePathElements.Length - 2) + .Union(new[] { fileA.FileNameWithoutExtension }).ToArray(); - var relativePath = fileA.RelativeTo(paths.BranchesPath); - var relativePathElements = relativePath.Elements.ToArray(); + var branch = string.Join(@"/", branchPathElement); - if (!relativePathElements.Any()) - { - return; + Logger.Trace("RemoteBranchCreated: {0}/{1}", origin, branch); + RemoteBranchCreated?.Invoke(origin, branch); + } + } + } } - - var branch = string.Join(@"/", relativePathElements.ToArray()); - - Logger.Trace("LocalBranchChanged: {0}", branch); - LocalBranchChanged?.Invoke(branch); - } - else if (fileEvent.Type == EventType.DELETED) - { - if (fileA.ExtensionWithDot == ".lock") + else if (fileA.IsChildOf(paths.BranchesPath)) { - return; - } + if (fileEvent.Type == EventType.MODIFIED) + { + if (fileA.DirectoryExists()) + { + continue; + } - var relativePath = fileA.RelativeTo(paths.BranchesPath); - var relativePathElements = relativePath.Elements.ToArray(); + if (fileA.ExtensionWithDot == ".lock") + { + continue; + } - if (!relativePathElements.Any()) - { - return; - } + var relativePath = fileA.RelativeTo(paths.BranchesPath); + var relativePathElements = relativePath.Elements.ToArray(); - var branch = string.Join(@"/", relativePathElements.ToArray()); + if (!relativePathElements.Any()) + { + continue; + } - Logger.Trace("LocalBranchDeleted: {0}", branch); - LocalBranchDeleted?.Invoke(branch); - } - else if (fileEvent.Type == EventType.RENAMED) - { - if (fileA.ExtensionWithDot != ".lock") - { - return; - } + var branch = string.Join(@"/", relativePathElements.ToArray()); - if (fileB != null && fileB.FileExists()) - { - if (fileA.FileNameWithoutExtension == fileB.FileNameWithoutExtension) + Logger.Trace("LocalBranchChanged: {0}", branch); + LocalBranchChanged?.Invoke(branch); + } + else if (fileEvent.Type == EventType.DELETED) { - var relativePath = fileB.RelativeTo(paths.BranchesPath); + if (fileA.ExtensionWithDot == ".lock") + { + continue; + } + + var relativePath = fileA.RelativeTo(paths.BranchesPath); var relativePathElements = relativePath.Elements.ToArray(); if (!relativePathElements.Any()) { - return; + continue; } var branch = string.Join(@"/", relativePathElements.ToArray()); - Logger.Trace("LocalBranchCreated: {0}", branch); - LocalBranchCreated?.Invoke(branch); + Logger.Trace("LocalBranchDeleted: {0}", branch); + LocalBranchDeleted?.Invoke(branch); + } + else if (fileEvent.Type == EventType.RENAMED) + { + if (fileA.ExtensionWithDot != ".lock") + { + continue; + } + + if (fileB != null && fileB.FileExists()) + { + if (fileA.FileNameWithoutExtension == fileB.FileNameWithoutExtension) + { + var relativePath = fileB.RelativeTo(paths.BranchesPath); + var relativePathElements = relativePath.Elements.ToArray(); + + if (!relativePathElements.Any()) + { + continue; + } + + var branch = string.Join(@"/", relativePathElements.ToArray()); + + Logger.Trace("LocalBranchCreated: {0}", branch); + LocalBranchCreated?.Invoke(branch); + } + } } } } + else + { + if (repositoryChanged || ignoredPaths.Any(ignoredPath => fileA.IsChildOf(ignoredPath))) + { + continue; + } + + repositoryChanged = true; + } + + lastCountOfProcessedEvents++; + } + + if (configChanged) + { + Logger.Trace("ConfigChanged"); + ConfigChanged?.Invoke(); + } + + if (headChanged) + { + Logger.Trace("ConfigChanged"); + HeadChanged?.Invoke(headContent); + } + + if (indexChanged) + { + Logger.Trace("IndexChanged"); + IndexChanged?.Invoke(); + } + + if (repositoryChanged) + { + Logger.Trace("RepositoryChanged"); + RepositoryChanged?.Invoke(); } } From 3b049e0fa1584618c316436c4475183b2614fdbf Mon Sep 17 00:00:00 2001 From: Stanley Goldman Date: Fri, 15 Sep 2017 16:51:59 -0400 Subject: [PATCH 2/5] Hopefully making tests more reliable --- .../Events/RepositoryManagerTests.cs | 51 +++++++------------ src/tests/IntegrationTests/SetupFixture.cs | 5 +- .../Events/IRepositoryManagerListener.cs | 2 - .../Repository/RepositoryManagerTests.cs | 4 -- 4 files changed, 21 insertions(+), 41 deletions(-) diff --git a/src/tests/IntegrationTests/Events/RepositoryManagerTests.cs b/src/tests/IntegrationTests/Events/RepositoryManagerTests.cs index 7057a74ea..c8d84ebd2 100644 --- a/src/tests/IntegrationTests/Events/RepositoryManagerTests.cs +++ b/src/tests/IntegrationTests/Events/RepositoryManagerTests.cs @@ -10,7 +10,7 @@ namespace IntegrationTests { - [TestFixture/*, Category("TimeSensitive")*/] + [TestFixture] class RepositoryManagerTests : BaseGitEnvironmentTest { private RepositoryManagerEvents repositoryManagerEvents; @@ -53,7 +53,6 @@ public async Task ShouldDetectFileChanges() repositoryManagerListener.Received().OnStatusUpdate(Args.GitStatus); repositoryManagerListener.DidNotReceive().OnActiveBranchChanged(Arg.Any()); repositoryManagerListener.DidNotReceive().OnActiveRemoteChanged(Arg.Any()); - repositoryManagerListener.DidNotReceive().OnHeadChanged(); repositoryManagerListener.DidNotReceive().OnLocalBranchListChanged(); repositoryManagerListener.DidNotReceive().OnRemoteBranchListChanged(); repositoryManagerListener.Received().OnIsBusyChanged(Args.Bool); @@ -62,7 +61,7 @@ public async Task ShouldDetectFileChanges() result.AssertEqual(expected); } - [Test, Category("TimeSensitive")] + [Test] public async Task ShouldAddAndCommitFiles() { await Initialize(TestRepoMasterCleanSynchronized); @@ -93,14 +92,12 @@ public async Task ShouldAddAndCommitFiles() var testDocumentTxt = TestRepoMasterCleanSynchronized.Combine("Assets", "TestDocument.txt"); testDocumentTxt.WriteAllText("foobar"); await TaskManager.Wait(); - WaitForNotBusy(repositoryManagerEvents, 1); RepositoryManager.WaitForEvents(); WaitForNotBusy(repositoryManagerEvents, 1); repositoryManagerListener.Received().OnStatusUpdate(Args.GitStatus); repositoryManagerListener.DidNotReceive().OnActiveBranchChanged(Arg.Any()); repositoryManagerListener.DidNotReceive().OnActiveRemoteChanged(Arg.Any()); - repositoryManagerListener.DidNotReceive().OnHeadChanged(); repositoryManagerListener.DidNotReceive().OnLocalBranchListChanged(); repositoryManagerListener.DidNotReceive().OnRemoteBranchListChanged(); repositoryManagerListener.ReceivedWithAnyArgs().OnIsBusyChanged(Args.Bool); @@ -118,18 +115,18 @@ await RepositoryManager await TaskManager.Wait(); RepositoryManager.WaitForEvents(); WaitForNotBusy(repositoryManagerEvents, 1); + repositoryManagerEvents.OnStatusUpdate.WaitOne(TimeSpan.FromSeconds(1)); - repositoryManagerListener.DidNotReceive().OnStatusUpdate(Args.GitStatus); + repositoryManagerListener.Received().OnStatusUpdate(Args.GitStatus); repositoryManagerListener.DidNotReceive().OnActiveBranchChanged(Arg.Any()); repositoryManagerListener.DidNotReceive().OnActiveRemoteChanged(Arg.Any()); - repositoryManagerListener.DidNotReceive().OnHeadChanged(); repositoryManagerListener.DidNotReceive().OnLocalBranchListChanged(); repositoryManagerListener.DidNotReceive().OnRemoteBranchListChanged(); - repositoryManagerListener.Received(2).OnIsBusyChanged(Args.Bool); + repositoryManagerListener.Received().OnIsBusyChanged(Args.Bool); repositoryManagerListener.DidNotReceive().OnLocksUpdated(Args.EnumerableGitLock); } - [Test, Category("TimeSensitive")] + [Test] public async Task ShouldAddAndCommitAllFiles() { await Initialize(TestRepoMasterCleanSynchronized); @@ -162,12 +159,10 @@ public async Task ShouldAddAndCommitAllFiles() await TaskManager.Wait(); WaitForNotBusy(repositoryManagerEvents, 1); RepositoryManager.WaitForEvents(); - WaitForNotBusy(repositoryManagerEvents, 1); repositoryManagerListener.Received().OnStatusUpdate(Args.GitStatus); repositoryManagerListener.DidNotReceive().OnActiveBranchChanged(Arg.Any()); repositoryManagerListener.DidNotReceive().OnActiveRemoteChanged(Arg.Any()); - repositoryManagerListener.DidNotReceive().OnHeadChanged(); repositoryManagerListener.DidNotReceive().OnLocalBranchListChanged(); repositoryManagerListener.DidNotReceive().OnRemoteBranchListChanged(); repositoryManagerListener.ReceivedWithAnyArgs().OnIsBusyChanged(Args.Bool); @@ -183,20 +178,19 @@ await RepositoryManager .StartAsAsync(); await TaskManager.Wait(); - RepositoryManager.WaitForEvents(); WaitForNotBusy(repositoryManagerEvents, 1); + RepositoryManager.WaitForEvents(); repositoryManagerListener.DidNotReceive().OnStatusUpdate(Args.GitStatus); repositoryManagerListener.DidNotReceive().OnActiveBranchChanged(Arg.Any()); repositoryManagerListener.DidNotReceive().OnActiveRemoteChanged(Arg.Any()); - repositoryManagerListener.DidNotReceive().OnHeadChanged(); repositoryManagerListener.DidNotReceive().OnLocalBranchListChanged(); repositoryManagerListener.DidNotReceive().OnRemoteBranchListChanged(); repositoryManagerListener.Received(2).OnIsBusyChanged(Args.Bool); repositoryManagerListener.DidNotReceive().OnLocksUpdated(Args.EnumerableGitLock); } - [Test, Category("TimeSensitive")] + [Test] public async Task ShouldDetectBranchChange() { await Initialize(TestRepoMasterCleanSynchronized); @@ -217,14 +211,14 @@ public async Task ShouldDetectBranchChange() await TaskManager.Wait(); RepositoryManager.WaitForEvents(); WaitForNotBusy(repositoryManagerEvents, 5); + repositoryManagerEvents.OnStatusUpdate.WaitOne(TimeSpan.FromSeconds(1)); repositoryManagerListener.Received().OnStatusUpdate(Args.GitStatus); - repositoryManagerListener.Received(1).OnActiveBranchChanged(Arg.Any()); - repositoryManagerListener.DidNotReceive().OnActiveRemoteChanged(Arg.Any()); - repositoryManagerListener.Received(1).OnHeadChanged(); + repositoryManagerListener.Received().OnActiveBranchChanged(Arg.Any()); + repositoryManagerListener.Received().OnActiveRemoteChanged(Arg.Any()); repositoryManagerListener.DidNotReceive().OnLocalBranchListChanged(); repositoryManagerListener.DidNotReceive().OnRemoteBranchListChanged(); - repositoryManagerListener.DidNotReceive().OnIsBusyChanged(Args.Bool); + repositoryManagerListener.Received().OnIsBusyChanged(Args.Bool); repositoryManagerListener.DidNotReceive().OnLocksUpdated(Args.EnumerableGitLock); result.AssertEqual(expected); @@ -240,14 +234,13 @@ public async Task ShouldDetectBranchDelete() await RepositoryManager.DeleteBranch("feature/document", true).StartAsAsync(); await TaskManager.Wait(); - RepositoryManager.WaitForEvents(); WaitForNotBusy(repositoryManagerEvents, 1); + RepositoryManager.WaitForEvents(); repositoryManagerListener.DidNotReceive().OnStatusUpdate(Args.GitStatus); //TODO: Deleting a branch causes a config reload, which raises OnActiveBranchChanged/OnActiveRemoteChanged repositoryManagerListener.Received().OnActiveBranchChanged(Arg.Any()); repositoryManagerListener.Received().OnActiveRemoteChanged(Arg.Any()); - repositoryManagerListener.DidNotReceive().OnHeadChanged(); repositoryManagerListener.Received(1).OnLocalBranchListChanged(); repositoryManagerListener.DidNotReceive().OnRemoteBranchListChanged(); repositoryManagerListener.ReceivedWithAnyArgs().OnIsBusyChanged(Args.Bool); @@ -269,7 +262,6 @@ public async Task ShouldDetectBranchCreate() repositoryManagerListener.DidNotReceive().OnStatusUpdate(Args.GitStatus); repositoryManagerListener.DidNotReceive().OnActiveBranchChanged(Arg.Any()); repositoryManagerListener.DidNotReceive().OnActiveRemoteChanged(Arg.Any()); - repositoryManagerListener.DidNotReceive().OnHeadChanged(); repositoryManagerListener.Received(1).OnLocalBranchListChanged(); repositoryManagerListener.DidNotReceive().OnRemoteBranchListChanged(); repositoryManagerListener.ReceivedWithAnyArgs().OnIsBusyChanged(Args.Bool); @@ -285,7 +277,6 @@ public async Task ShouldDetectBranchCreate() repositoryManagerListener.DidNotReceive().OnStatusUpdate(Args.GitStatus); repositoryManagerListener.DidNotReceive().OnActiveBranchChanged(Arg.Any()); repositoryManagerListener.DidNotReceive().OnActiveRemoteChanged(Arg.Any()); - repositoryManagerListener.DidNotReceive().OnHeadChanged(); repositoryManagerListener.Received(1).OnLocalBranchListChanged(); repositoryManagerListener.DidNotReceive().OnRemoteBranchListChanged(); repositoryManagerListener.Received(2).OnIsBusyChanged(Args.Bool); @@ -319,9 +310,8 @@ public async Task ShouldDetectChangesToRemotes() repositoryManagerListener.DidNotReceive().OnStatusUpdate(Args.GitStatus); repositoryManagerListener.Received().OnActiveBranchChanged(Arg.Any()); repositoryManagerListener.Received().OnActiveRemoteChanged(Arg.Any()); - repositoryManagerListener.DidNotReceive().OnHeadChanged(); repositoryManagerListener.DidNotReceive().OnLocalBranchListChanged(); - repositoryManagerListener.DidNotReceive().OnRemoteBranchListChanged(); + repositoryManagerListener.Received().OnRemoteBranchListChanged(); repositoryManagerListener.ReceivedWithAnyArgs().OnIsBusyChanged(Args.Bool); repositoryManagerListener.DidNotReceive().OnLocksUpdated(Args.EnumerableGitLock); @@ -342,14 +332,13 @@ public async Task ShouldDetectChangesToRemotes() repositoryManagerListener.DidNotReceive().OnStatusUpdate(Args.GitStatus); repositoryManagerListener.Received().OnActiveBranchChanged(Arg.Any()); repositoryManagerListener.Received().OnActiveRemoteChanged(Arg.Any()); - repositoryManagerListener.DidNotReceive().OnHeadChanged(); repositoryManagerListener.DidNotReceive().OnLocalBranchListChanged(); repositoryManagerListener.DidNotReceive().OnRemoteBranchListChanged(); repositoryManagerListener.ReceivedWithAnyArgs().OnIsBusyChanged(Args.Bool); repositoryManagerListener.DidNotReceive().OnLocksUpdated(Args.EnumerableGitLock); } - [Test, Category("TimeSensitive")] + [Test] public async Task ShouldDetectChangesToRemotesWhenSwitchingBranches() { var expectedCloneUrl = "https://github.com/EvilStanleyGoldman/IOTestsRepo.git"; @@ -374,7 +363,6 @@ await RepositoryManager.CreateBranch("branch2", "another/master") repositoryManagerListener.DidNotReceive().OnStatusUpdate(Args.GitStatus); repositoryManagerListener.Received().OnActiveBranchChanged(Arg.Any()); repositoryManagerListener.Received().OnActiveRemoteChanged(Arg.Any()); - repositoryManagerListener.DidNotReceive().OnHeadChanged(); repositoryManagerListener.Received().OnLocalBranchListChanged(); repositoryManagerListener.DidNotReceive().OnRemoteBranchListChanged(); repositoryManagerListener.ReceivedWithAnyArgs().OnIsBusyChanged(Args.Bool); @@ -400,7 +388,6 @@ await RepositoryManager.SwitchBranch("branch2") repositoryManagerListener.DidNotReceive().OnStatusUpdate(Args.GitStatus); repositoryManagerListener.Received().OnActiveBranchChanged(Arg.Any()); repositoryManagerListener.Received().OnActiveRemoteChanged(Arg.Any()); - repositoryManagerListener.DidNotReceive().OnHeadChanged(); repositoryManagerListener.DidNotReceive().OnLocalBranchListChanged(); repositoryManagerListener.DidNotReceive().OnRemoteBranchListChanged(); repositoryManagerListener.Received().OnIsBusyChanged(Args.Bool); @@ -435,9 +422,8 @@ public async Task ShouldUpdateCloneUrlIfRemoteIsDeleted() repositoryManagerListener.ReceivedWithAnyArgs().OnIsBusyChanged(Args.Bool); repositoryManagerListener.Received().OnActiveBranchChanged(Arg.Any()); repositoryManagerListener.Received().OnActiveRemoteChanged(Arg.Any()); - repositoryManagerListener.DidNotReceive().OnHeadChanged(); repositoryManagerListener.DidNotReceive().OnLocalBranchListChanged(); - repositoryManagerListener.DidNotReceive().OnRemoteBranchListChanged(); + repositoryManagerListener.Received().OnRemoteBranchListChanged(); repositoryManagerListener.DidNotReceive().OnLocksUpdated(Args.EnumerableGitLock); repositoryManagerListener.ClearReceivedCalls(); @@ -457,13 +443,12 @@ public async Task ShouldUpdateCloneUrlIfRemoteIsDeleted() repositoryManagerListener.ReceivedWithAnyArgs().OnIsBusyChanged(Args.Bool); repositoryManagerListener.Received().OnActiveBranchChanged(Arg.Any()); repositoryManagerListener.Received().OnActiveRemoteChanged(Arg.Any()); - repositoryManagerListener.DidNotReceive().OnHeadChanged(); repositoryManagerListener.DidNotReceive().OnLocalBranchListChanged(); repositoryManagerListener.DidNotReceive().OnRemoteBranchListChanged(); repositoryManagerListener.DidNotReceive().OnLocksUpdated(Args.EnumerableGitLock); } - [Test, Category("TimeSensitive")] + [Test] public async Task ShouldDetectGitPull() { await Initialize(TestRepoMasterCleanSynchronized); @@ -488,7 +473,6 @@ public async Task ShouldDetectGitPull() repositoryManagerListener.ReceivedWithAnyArgs().OnIsBusyChanged(Args.Bool); repositoryManagerListener.DidNotReceive().OnActiveBranchChanged(Arg.Any()); repositoryManagerListener.DidNotReceive().OnActiveRemoteChanged(Arg.Any()); - repositoryManagerListener.DidNotReceive().OnHeadChanged(); repositoryManagerListener.DidNotReceive().OnLocalBranchListChanged(); repositoryManagerListener.DidNotReceive().OnRemoteBranchListChanged(); repositoryManagerListener.DidNotReceive().OnLocksUpdated(Args.EnumerableGitLock); @@ -515,7 +499,6 @@ public async Task ShouldDetectGitFetch() repositoryManagerListener.ReceivedWithAnyArgs().OnIsBusyChanged(Args.Bool); repositoryManagerListener.DidNotReceive().OnActiveBranchChanged(Arg.Any()); repositoryManagerListener.DidNotReceive().OnActiveRemoteChanged(Arg.Any()); - repositoryManagerListener.DidNotReceive().OnHeadChanged(); repositoryManagerListener.DidNotReceive().OnLocalBranchListChanged(); repositoryManagerListener.Received(2).OnRemoteBranchListChanged(); repositoryManagerListener.DidNotReceive().OnLocksUpdated(Args.EnumerableGitLock); diff --git a/src/tests/IntegrationTests/SetupFixture.cs b/src/tests/IntegrationTests/SetupFixture.cs index 4c9a43b6b..10ab573b3 100644 --- a/src/tests/IntegrationTests/SetupFixture.cs +++ b/src/tests/IntegrationTests/SetupFixture.cs @@ -12,7 +12,10 @@ public void Setup() { Logging.TracingEnabled = true; - Logging.LogAdapter = new MultipleLogAdapter(new FileLogAdapter($"..\\{DateTime.UtcNow.ToString("yyyyMMddHHmmss")}-integration-tests.log")); + Logging.LogAdapter = new MultipleLogAdapter( + new FileLogAdapter($"..\\{DateTime.UtcNow.ToString("yyyyMMddHHmmss")}-integration-tests.log"), + new ConsoleLogAdapter() + ); } } } diff --git a/src/tests/TestUtils/Events/IRepositoryManagerListener.cs b/src/tests/TestUtils/Events/IRepositoryManagerListener.cs index be0aafa76..d9c984e6c 100644 --- a/src/tests/TestUtils/Events/IRepositoryManagerListener.cs +++ b/src/tests/TestUtils/Events/IRepositoryManagerListener.cs @@ -11,7 +11,6 @@ interface IRepositoryManagerListener void OnStatusUpdate(GitStatus status); void OnActiveBranchChanged(ConfigBranch? branch); void OnActiveRemoteChanged(ConfigRemote? remote); - void OnHeadChanged(); void OnLocalBranchListChanged(); void OnRemoteBranchListChanged(); void OnIsBusyChanged(bool busy); @@ -101,7 +100,6 @@ public static void AssertDidNotReceiveAnyCalls(this IRepositoryManagerListener r repositoryManagerListener.DidNotReceive().OnStatusUpdate(Args.GitStatus); repositoryManagerListener.DidNotReceive().OnActiveBranchChanged(Arg.Any()); repositoryManagerListener.DidNotReceive().OnActiveRemoteChanged(Arg.Any()); - repositoryManagerListener.DidNotReceive().OnHeadChanged(); repositoryManagerListener.DidNotReceive().OnLocalBranchListChanged(); repositoryManagerListener.DidNotReceive().OnRemoteBranchListChanged(); repositoryManagerListener.DidNotReceive().OnLocksUpdated(Args.EnumerableGitLock); diff --git a/src/tests/UnitTests/Repository/RepositoryManagerTests.cs b/src/tests/UnitTests/Repository/RepositoryManagerTests.cs index aa4ed882c..be6bfbbe6 100644 --- a/src/tests/UnitTests/Repository/RepositoryManagerTests.cs +++ b/src/tests/UnitTests/Repository/RepositoryManagerTests.cs @@ -181,7 +181,6 @@ public async Task ShouldRefreshAndReturnCombinedStatusAndLockInformation1() repositoryManagerListener.DidNotReceive().OnActiveBranchChanged(Arg.Any()); repositoryManagerListener.DidNotReceive().OnActiveRemoteChanged(Arg.Any()); - repositoryManagerListener.DidNotReceive().OnHeadChanged(); repositoryManagerListener.DidNotReceive().OnLocalBranchListChanged(); repositoryManagerListener.DidNotReceive().OnRemoteBranchListChanged(); } @@ -243,7 +242,6 @@ public void ShouldRefreshAndReturnCombinedStatusAndLockInformation2() repositoryManagerListener.DidNotReceive().OnActiveBranchChanged(Arg.Any()); repositoryManagerListener.DidNotReceive().OnActiveRemoteChanged(Arg.Any()); - repositoryManagerListener.DidNotReceive().OnHeadChanged(); repositoryManagerListener.DidNotReceive().OnLocalBranchListChanged(); repositoryManagerListener.DidNotReceive().OnRemoteBranchListChanged(); } @@ -282,7 +280,6 @@ public void ShouldRefreshAndReturnWithEmptyGitLockResponse() repositoryManagerListener.DidNotReceive().OnActiveBranchChanged(Arg.Any()); repositoryManagerListener.DidNotReceive().OnActiveRemoteChanged(Arg.Any()); - repositoryManagerListener.DidNotReceive().OnHeadChanged(); repositoryManagerListener.DidNotReceive().OnLocalBranchListChanged(); repositoryManagerListener.DidNotReceive().OnRemoteBranchListChanged(); } @@ -321,7 +318,6 @@ public void ShouldRefreshAndReturnWithNoGitLockResponse() repositoryManagerListener.DidNotReceive().OnActiveBranchChanged(Arg.Any()); repositoryManagerListener.DidNotReceive().OnActiveRemoteChanged(Arg.Any()); - repositoryManagerListener.DidNotReceive().OnHeadChanged(); repositoryManagerListener.DidNotReceive().OnLocalBranchListChanged(); repositoryManagerListener.DidNotReceive().OnRemoteBranchListChanged(); } From ccc4d38532c9b8336d2f00d1a7231369eb90ef2e Mon Sep 17 00:00:00 2001 From: Stanley Goldman Date: Fri, 15 Sep 2017 17:17:37 -0400 Subject: [PATCH 3/5] Tweaking the logs --- src/GitHub.Api/Events/RepositoryWatcher.cs | 28 ++++++++++++++-------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/src/GitHub.Api/Events/RepositoryWatcher.cs b/src/GitHub.Api/Events/RepositoryWatcher.cs index a2ad3d4e8..e0a3401af 100644 --- a/src/GitHub.Api/Events/RepositoryWatcher.cs +++ b/src/GitHub.Api/Events/RepositoryWatcher.cs @@ -148,8 +148,10 @@ public int CheckAndProcessEvents() if (fileEvents.Length > 0) { - Logger.Trace("Processing {0} Events", fileEvents.Length); - ProcessEvents(fileEvents); + Logger.Trace("Handling {0} Events", fileEvents.Length); + var processedEventCount = ProcessEvents(fileEvents); + lastCountOfProcessedEvents = processedEventCount; + Logger.Trace("Processed {0} Events", processedEventCount); } processingEvents = false; @@ -157,8 +159,9 @@ public int CheckAndProcessEvents() return lastCountOfProcessedEvents; } - private void ProcessEvents(Event[] fileEvents) + private int ProcessEvents(Event[] fileEvents) { + var eventsProcessed = 0; var configChanged = false; var headChanged = false; var repositoryChanged = false; @@ -195,9 +198,8 @@ private void ProcessEvents(Event[] fileEvents) { if (fileA.Equals(paths.DotGitConfig)) { - Logger.Trace("ConfigChanged"); - configChanged = true; + eventsProcessed++; } else if (fileA.Equals(paths.DotGitHead)) { @@ -206,13 +208,13 @@ private void ProcessEvents(Event[] fileEvents) headContent = paths.DotGitHead.ReadAllLines().FirstOrDefault(); } - Logger.Trace("HeadChanged: {0}", headContent ?? "[null]"); headChanged = true; + eventsProcessed++; } else if (fileA.Equals(paths.DotGitIndex)) { - Logger.Trace("IndexChanged"); indexChanged = true; + eventsProcessed++; } else if (fileA.IsChildOf(paths.RemotesPath)) { @@ -237,6 +239,7 @@ private void ProcessEvents(Event[] fileEvents) Logger.Trace("RemoteBranchDeleted: {0}/{1}", origin, branch); RemoteBranchDeleted?.Invoke(origin, branch); + eventsProcessed++; } else if (fileEvent.Type == EventType.RENAMED) { @@ -257,6 +260,7 @@ private void ProcessEvents(Event[] fileEvents) Logger.Trace("RemoteBranchCreated: {0}/{1}", origin, branch); RemoteBranchCreated?.Invoke(origin, branch); + eventsProcessed++; } } } @@ -287,6 +291,7 @@ private void ProcessEvents(Event[] fileEvents) Logger.Trace("LocalBranchChanged: {0}", branch); LocalBranchChanged?.Invoke(branch); + eventsProcessed++; } else if (fileEvent.Type == EventType.DELETED) { @@ -307,6 +312,7 @@ private void ProcessEvents(Event[] fileEvents) Logger.Trace("LocalBranchDeleted: {0}", branch); LocalBranchDeleted?.Invoke(branch); + eventsProcessed++; } else if (fileEvent.Type == EventType.RENAMED) { @@ -331,6 +337,7 @@ private void ProcessEvents(Event[] fileEvents) Logger.Trace("LocalBranchCreated: {0}", branch); LocalBranchCreated?.Invoke(branch); + eventsProcessed++; } } } @@ -344,9 +351,8 @@ private void ProcessEvents(Event[] fileEvents) } repositoryChanged = true; + eventsProcessed++; } - - lastCountOfProcessedEvents++; } if (configChanged) @@ -357,7 +363,7 @@ private void ProcessEvents(Event[] fileEvents) if (headChanged) { - Logger.Trace("ConfigChanged"); + Logger.Trace("HeadChanged: {0}", headContent ?? "[null]"); HeadChanged?.Invoke(headContent); } @@ -372,6 +378,8 @@ private void ProcessEvents(Event[] fileEvents) Logger.Trace("RepositoryChanged"); RepositoryChanged?.Invoke(); } + + return eventsProcessed; } private bool disposed; From 80c128595e502ec1c147f2b33b8a334b6b81cb8f Mon Sep 17 00:00:00 2001 From: Stanley Goldman Date: Fri, 15 Sep 2017 17:40:47 -0400 Subject: [PATCH 4/5] Additional optimizations --- src/GitHub.Api/Events/RepositoryWatcher.cs | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/GitHub.Api/Events/RepositoryWatcher.cs b/src/GitHub.Api/Events/RepositoryWatcher.cs index e0a3401af..9bd2bd261 100644 --- a/src/GitHub.Api/Events/RepositoryWatcher.cs +++ b/src/GitHub.Api/Events/RepositoryWatcher.cs @@ -196,12 +196,11 @@ private int ProcessEvents(Event[] fileEvents) // handling events in .git/* if (fileA.IsChildOf(paths.DotGitPath)) { - if (fileA.Equals(paths.DotGitConfig)) + if (!configChanged && fileA.Equals(paths.DotGitConfig)) { configChanged = true; - eventsProcessed++; } - else if (fileA.Equals(paths.DotGitHead)) + else if (!headChanged && fileA.Equals(paths.DotGitHead)) { if (fileEvent.Type != EventType.DELETED) { @@ -209,12 +208,10 @@ private int ProcessEvents(Event[] fileEvents) } headChanged = true; - eventsProcessed++; } - else if (fileA.Equals(paths.DotGitIndex)) + else if (!indexChanged && fileA.Equals(paths.DotGitIndex)) { indexChanged = true; - eventsProcessed++; } else if (fileA.IsChildOf(paths.RemotesPath)) { @@ -351,7 +348,6 @@ private int ProcessEvents(Event[] fileEvents) } repositoryChanged = true; - eventsProcessed++; } } @@ -359,24 +355,28 @@ private int ProcessEvents(Event[] fileEvents) { Logger.Trace("ConfigChanged"); ConfigChanged?.Invoke(); + eventsProcessed++; } if (headChanged) { Logger.Trace("HeadChanged: {0}", headContent ?? "[null]"); HeadChanged?.Invoke(headContent); + eventsProcessed++; } if (indexChanged) { Logger.Trace("IndexChanged"); IndexChanged?.Invoke(); + eventsProcessed++; } if (repositoryChanged) { Logger.Trace("RepositoryChanged"); RepositoryChanged?.Invoke(); + eventsProcessed++; } return eventsProcessed; From be017b617401557ce7f3af22f48e99cc3e9bce2b Mon Sep 17 00:00:00 2001 From: Stanley Goldman Date: Fri, 15 Sep 2017 17:49:37 -0400 Subject: [PATCH 5/5] Tweaking the way values are handled in CheckAndProcessEvents --- src/GitHub.Api/Events/RepositoryWatcher.cs | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/GitHub.Api/Events/RepositoryWatcher.cs b/src/GitHub.Api/Events/RepositoryWatcher.cs index 9bd2bd261..066788dbc 100644 --- a/src/GitHub.Api/Events/RepositoryWatcher.cs +++ b/src/GitHub.Api/Events/RepositoryWatcher.cs @@ -143,20 +143,21 @@ public int CheckAndProcessEvents() signalProcessingEventsDone.Reset(); processingEvents = true; - lastCountOfProcessedEvents = 0; - var fileEvents = nativeInterface.GetEvents(); + var processedEventCount = 0; + var fileEvents = nativeInterface.GetEvents(); if (fileEvents.Length > 0) { Logger.Trace("Handling {0} Events", fileEvents.Length); - var processedEventCount = ProcessEvents(fileEvents); - lastCountOfProcessedEvents = processedEventCount; + processedEventCount = ProcessEvents(fileEvents); Logger.Trace("Processed {0} Events", processedEventCount); } + lastCountOfProcessedEvents = processedEventCount; processingEvents = false; signalProcessingEventsDone.Set(); - return lastCountOfProcessedEvents; + + return processedEventCount; } private int ProcessEvents(Event[] fileEvents)