GitVersion
GitVersion copied to clipboard
#2034 StackOverflow when using increment: Inherit: new unit test
This PR consists of the new unit test that reproduces an issue #2034 StackOverflow exception while using increment: Inherit config, and branches merging
Hm. I had hoped the test failing would give us a stack trace from where the StackOverflowException occurred, allowing us to pinpoint the line of code causing the issue. Seems like we need to invest a bit more into debugging this, as is often the case when StackOverflowException is involved. Well, well. Thanks for the failing test, @dzenchar! 😃
Hi. Thanks to you! I was able to get the stack trace locally, see below:
GitVersionCore.dll!GitVersion.Configuration.BranchConfigurationCalculator.CalculateWhenMultipleParents(LibGit2Sharp.IRepository repository, LibGit2Sharp.Commit currentCommit, ref LibGit2Sharp.Branch currentBranch, LibGit2Sharp.Branch[] excludedBranches) Line 190
at C:\Repos\GitVersion\src\GitVersionCore\Configuration\BranchConfigurationCalculator.cs(190)
GitVersionCore.dll!GitVersion.Configuration.BranchConfigurationCalculator.InheritBranchConfiguration(LibGit2Sharp.Branch targetBranch, GitVersion.Configuration.BranchConfig branchConfiguration, System.Collections.Generic.IList<LibGit2Sharp.Branch> excludedInheritBranches) Line 63
at C:\Repos\GitVersion\src\GitVersionCore\Configuration\BranchConfigurationCalculator.cs(63)
GitVersionCore.dll!GitVersion.Configuration.BranchConfigurationCalculator.GetBranchConfiguration(LibGit2Sharp.Branch targetBranch, System.Collections.Generic.IList<LibGit2Sharp.Branch> excludedInheritBranches) Line 40
at C:\Repos\GitVersion\src\GitVersionCore\Configuration\BranchConfigurationCalculator.cs(40)
GitVersionCore.dll!GitVersion.Configuration.BranchConfigurationCalculator.InheritBranchConfiguration(LibGit2Sharp.Branch targetBranch, GitVersion.Configuration.BranchConfig branchConfiguration, System.Collections.Generic.IList<LibGit2Sharp.Branch> excludedInheritBranches) Line 170
at C:\Repos\GitVersion\src\GitVersionCore\Configuration\BranchConfigurationCalculator.cs(170)
GitVersionCore.dll!GitVersion.Configuration.BranchConfigurationCalculator.GetBranchConfiguration(LibGit2Sharp.Branch targetBranch, System.Collections.Generic.IList<LibGit2Sharp.Branch> excludedInheritBranches) Line 40
at C:\Repos\GitVersion\src\GitVersionCore\Configuration\BranchConfigurationCalculator.cs(40)
GitVersionCore.dll!GitVersion.Configuration.BranchConfigurationCalculator.InheritBranchConfiguration(LibGit2Sharp.Branch targetBranch, GitVersion.Configuration.BranchConfig branchConfiguration, System.Collections.Generic.IList<LibGit2Sharp.Branch> excludedInheritBranches) Line 170
at C:\Repos\GitVersion\src\GitVersionCore\Configuration\BranchConfigurationCalculator.cs(170)
GitVersionCore.dll!GitVersion.Configuration.BranchConfigurationCalculator.GetBranchConfiguration(LibGit2Sharp.Branch targetBranch, System.Collections.Generic.IList<LibGit2Sharp.Branch> excludedInheritBranches) Line 40
at C:\Repos\GitVersion\src\GitVersionCore\Configuration\BranchConfigurationCalculator.cs(40)
GitVersionCore.dll!GitVersion.Configuration.BranchConfigurationCalculator.InheritBranchConfiguration(LibGit2Sharp.Branch targetBranch, GitVersion.Configuration.BranchConfig branchConfiguration, System.Collections.Generic.IList<LibGit2Sharp.Branch> excludedInheritBranches) Line 170
... (a long cycle of repeated calls)
at C:\Repos\GitVersion\src\GitVersionCore\Configuration\BranchConfigurationCalculator.cs(170)
GitVersionCore.dll!GitVersion.Configuration.BranchConfigurationCalculator.GetBranchConfiguration(LibGit2Sharp.Branch targetBranch, System.Collections.Generic.IList<LibGit2Sharp.Branch> excludedInheritBranches) Line 40
at C:\Repos\GitVersion\src\GitVersionCore\Configuration\BranchConfigurationCalculator.cs(40)
GitVersionCore.dll!GitVersion.Configuration.BranchConfigurationCalculator.InheritBranchConfiguration(LibGit2Sharp.Branch targetBranch, GitVersion.Configuration.BranchConfig branchConfiguration, System.Collections.Generic.IList<LibGit2Sharp.Branch> excludedInheritBranches) Line 170
at C:\Repos\GitVersion\src\GitVersionCore\Configuration\BranchConfigurationCalculator.cs(170)
GitVersionCore.dll!GitVersion.Configuration.BranchConfigurationCalculator.GetBranchConfiguration(LibGit2Sharp.Branch targetBranch, System.Collections.Generic.IList<LibGit2Sharp.Branch> excludedInheritBranches) Line 40
at C:\Repos\GitVersion\src\GitVersionCore\Configuration\BranchConfigurationCalculator.cs(40)
GitVersionCore.dll!GitVersion.GitVersionContext.CalculateEffectiveConfiguration() Line 92
at C:\Repos\GitVersion\src\GitVersionCore\GitVersionContext.cs(92)
GitVersionCore.dll!GitVersion.GitVersionContext.GitVersionContext(LibGit2Sharp.IRepository repository, GitVersion.Logging.ILog log, LibGit2Sharp.Branch currentBranch, GitVersion.Configuration.Config configuration, bool onlyTrackedBranches, string commitId) Line 63
at C:\Repos\GitVersion\src\GitVersionCore\GitVersionContext.cs(63)
GitVersionCore.dll!GitVersion.GitVersionContext.GitVersionContext(LibGit2Sharp.IRepository repository, GitVersion.Logging.ILog log, string targetBranch, GitVersion.Configuration.Config configuration, bool onlyTrackedBranches, string commitId) Line 18
at C:\Repos\GitVersion\src\GitVersionCore\GitVersionContext.cs(18)
GitVersionCore.Tests.dll!GitVersionCore.Tests.GitToolsTestingExtensions.GetVersion(GitTools.Testing.RepositoryFixtureBase fixture, GitVersion.Configuration.Config configuration, LibGit2Sharp.IRepository repository, string commitId, bool onlyTrackedBranches, string targetBranch) Line 34
at C:\Repos\GitVersion\src\GitVersionCore.Tests\GitToolsTestingExtensions.cs(34)
GitVersionCore.Tests.dll!GitVersionCore.Tests.GitToolsTestingExtensions.AssertFullSemver(GitTools.Testing.RepositoryFixtureBase fixture, GitVersion.Configuration.Config configuration, string fullSemver, LibGit2Sharp.IRepository repository, string commitId, bool onlyTrackedBranches, string targetBranch) Line 62
at C:\Repos\GitVersion\src\GitVersionCore.Tests\GitToolsTestingExtensions.cs(62)
GitVersionCore.Tests.dll!GitVersionCore.Tests.IntegrationTests.MainlineDevelopmentMode.MergingMasterBranchToDevelopWithInheritIncrementShouldIncrementDevelopPatch() Line 453
at C:\Repos\GitVersion\src\GitVersionCore.Tests\IntegrationTests\MainlineDevelopmentMode.cs(453)
Thanks for the stack trace! It reduces the problem down to these two lines, which invoke each other perpetually:
https://github.com/GitTools/GitVersion/blob/f0e5275d974d7bd694dad8dce0ac85e57e33b19f/src/GitVersionCore/Configuration/BranchConfigurationCalculator.cs#L40
https://github.com/GitTools/GitVersion/blob/f0e5275d974d7bd694dad8dce0ac85e57e33b19f/src/GitVersionCore/Configuration/BranchConfigurationCalculator.cs#L170
I find it a bit troubling that GetBranchConfiguration() and InheritBranchConfiguration() both invokes the other. Circular dependencies should be avoided, I think. A refactoring of both methods to rely on a third (terminal) one would be good, I suppose. There's an attempt to guard against infinite loops on line 151, but it doesn't work in this case:
https://github.com/GitTools/GitVersion/blob/f0e5275d974d7bd694dad8dce0ac85e57e33b19f/src/GitVersionCore/Configuration/BranchConfigurationCalculator.cs#L150-L151
I think the following comment describes the situation well:
https://github.com/GitTools/GitVersion/blob/f0e5275d974d7bd694dad8dce0ac85e57e33b19f/src/GitVersionCore/Configuration/BranchConfigurationCalculator.cs#L51
Closed in favor of #3445