diff --git a/src/GitVersionCore.Tests/IntegrationTests/DevelopScenarios.cs b/src/GitVersionCore.Tests/IntegrationTests/DevelopScenarios.cs index 9f505afbf4..c1506cd7f8 100644 --- a/src/GitVersionCore.Tests/IntegrationTests/DevelopScenarios.cs +++ b/src/GitVersionCore.Tests/IntegrationTests/DevelopScenarios.cs @@ -201,7 +201,7 @@ public void WhenMultipleDevelopBranchesExistAndCurrentBranchHasIncrementInheritP fixture.Repository.MakeACommit(); fixture.Repository.MergeNoFF("develop"); - fixture.AssertFullSemver("1.0.1-x.1+3"); + fixture.AssertFullSemver("1.1.0-x.1+3"); } } } diff --git a/src/GitVersionCore.Tests/IntegrationTests/FeatureBranchScenarios.cs b/src/GitVersionCore.Tests/IntegrationTests/FeatureBranchScenarios.cs index 7bd7506d1a..e972c4d842 100644 --- a/src/GitVersionCore.Tests/IntegrationTests/FeatureBranchScenarios.cs +++ b/src/GitVersionCore.Tests/IntegrationTests/FeatureBranchScenarios.cs @@ -552,4 +552,49 @@ public void PickUpVersionFromMasterMarkedWithIsTracksReleaseBranches() fixture.AssertFullSemver(config, "0.10.1-MyFeatureD.1+1"); } } + + [Test] + public void ShouldHaveAGreaterSemVerAfterDevelopIsMergedIntoFeature() + { + var config = new Config() + { + VersioningMode = VersioningMode.ContinuousDeployment, + AssemblyVersioningScheme = AssemblyVersioningScheme.Major, + AssemblyFileVersioningFormat = "{MajorMinorPatch}.{env:WeightedPreReleaseNumber ?? 0}", + LegacySemVerPadding = 4, + BuildMetaDataPadding = 4, + CommitsSinceVersionSourcePadding = 4, + CommitMessageIncrementing = CommitMessageIncrementMode.Disabled, + Branches = new Dictionary + { + { + "develop", new BranchConfig() + { + PreventIncrementOfMergedBranchVersion = true + } + }, + { + "feature", new BranchConfig() + { + Tag = "feat-{BranchName}" + } + } + } + }; + using (var fixture = new EmptyRepositoryFixture()) + { + fixture.MakeACommit(); + fixture.BranchTo("develop"); + fixture.MakeACommit(); + fixture.ApplyTag("16.23.0"); + fixture.MakeACommit(); + fixture.BranchTo("feature/featX"); + fixture.MakeACommit(); + fixture.Checkout("develop"); + fixture.MakeACommit(); + fixture.Checkout("feature/featX"); + fixture.MergeNoFF("develop"); + fixture.AssertFullSemver(config, "16.24.0-feat-featX.4"); + } + } } diff --git a/src/GitVersionCore/BranchConfigurationCalculator.cs b/src/GitVersionCore/BranchConfigurationCalculator.cs index df6d7c1f2d..f73c147679 100644 --- a/src/GitVersionCore/BranchConfigurationCalculator.cs +++ b/src/GitVersionCore/BranchConfigurationCalculator.cs @@ -142,11 +142,21 @@ static BranchConfig InheritBranchConfiguration(GitVersionContext context, Branch // To prevent infinite loops, make sure that a new branch was chosen. if (targetBranch.IsSameBranch(chosenBranch)) { - Logger.WriteWarning("Fallback branch wants to inherit Increment branch configuration from itself. Using patch increment instead."); - return new BranchConfig(branchConfiguration) + BranchConfig developOrMasterConfig = + ChooseMasterOrDevelopIncrementStrategyIfTheChosenBranchIsOneOfThem( + chosenBranch, branchConfiguration, config); + if (developOrMasterConfig != null) { - Increment = IncrementStrategy.Patch - }; + return developOrMasterConfig; + } + else + { + Logger.WriteWarning("Fallback branch wants to inherit Increment branch configuration from itself. Using patch increment instead."); + return new BranchConfig(branchConfiguration) + { + Increment = IncrementStrategy.Patch + }; + } } var inheritingBranchConfig = GetBranchConfiguration(context, chosenBranch, excludedInheritBranches); @@ -201,5 +211,39 @@ static Branch[] CalculateWhenMultipleParents(IRepository repository, Commit curr return excludedBranches; } + + private static BranchConfig + ChooseMasterOrDevelopIncrementStrategyIfTheChosenBranchIsOneOfThem(Branch ChosenBranch, + BranchConfig BranchConfiguration, Config config) + { + BranchConfig masterOrDevelopConfig = null; + var developBranchRegex = config.Branches[ConfigurationProvider.DevelopBranchKey].Regex; + var masterBranchRegex = config.Branches[ConfigurationProvider.MasterBranchKey].Regex; + if (Regex.IsMatch(ChosenBranch.FriendlyName, developBranchRegex, RegexOptions.IgnoreCase)) + { + // Normally we would not expect this to happen but for safety we add a check + if (config.Branches[ConfigurationProvider.DevelopBranchKey].Increment != + IncrementStrategy.Inherit) + { + masterOrDevelopConfig = new BranchConfig(BranchConfiguration) + { + Increment = config.Branches[ConfigurationProvider.DevelopBranchKey].Increment + }; + } + } + else if (Regex.IsMatch(ChosenBranch.FriendlyName, masterBranchRegex, RegexOptions.IgnoreCase)) + { + // Normally we would not expect this to happen but for safety we add a check + if (config.Branches[ConfigurationProvider.MasterBranchKey].Increment != + IncrementStrategy.Inherit) + { + masterOrDevelopConfig = new BranchConfig(BranchConfiguration) + { + Increment = config.Branches[ConfigurationProvider.DevelopBranchKey].Increment + }; + } + } + return masterOrDevelopConfig; + } } -} \ No newline at end of file +}