GitVersion icon indicating copy to clipboard operation
GitVersion copied to clipboard

#2034 StackOverflow when using increment: Inherit: new unit test

Open dzenchar opened this issue 5 years ago • 3 comments

This PR consists of the new unit test that reproduces an issue #2034 StackOverflow exception while using increment: Inherit config, and branches merging

dzenchar avatar Jan 21 '20 09:01 dzenchar

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! 😃

asbjornu avatar Jan 21 '20 13:01 asbjornu

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)

dzenchar avatar Jan 22 '20 06:01 dzenchar

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

asbjornu avatar Jan 27 '20 13:01 asbjornu

Closed in favor of #3445

arturcic avatar Mar 19 '23 09:03 arturcic