diff --git a/src/GitVersion.Core.Tests/IntegrationTests/AlignGitFlowWithMainlineVersionStrategy.cs b/src/GitVersion.Core.Tests/IntegrationTests/AlignGitFlowWithMainlineVersionStrategy.cs index b0b64ed02a..23591aea02 100644 --- a/src/GitVersion.Core.Tests/IntegrationTests/AlignGitFlowWithMainlineVersionStrategy.cs +++ b/src/GitVersion.Core.Tests/IntegrationTests/AlignGitFlowWithMainlineVersionStrategy.cs @@ -158,7 +158,7 @@ public void EnsureFeatureWithIncrementInheritOnMainAndNoneOnFeatureBranch(bool u else { // ❔ expected: "2.0.0-2+4" - fixture.AssertFullSemver("3.0.0-1+4", configuration); + fixture.AssertFullSemver("2.0.0-1+4", configuration); } } @@ -230,16 +230,8 @@ public void EnsureFeatureWithIncrementInheritOnMainAndPatchOnFeatureBranch(bool fixture.MergeTo("main"); - if (useMainline) - { - // ✅ succeeds as expected - fixture.AssertFullSemver("2.0.1-1+4", configuration); - } - else - { - // ❔ expected: "2.0.1-1+4" - fixture.AssertFullSemver("3.0.0-1+4", configuration); - } + // ✅ succeeds as expected + fixture.AssertFullSemver("2.0.1-1+4", configuration); } /// @@ -310,16 +302,8 @@ public void EnsureFeatureWithIncrementInheritOnMainAndMinorOnFeatureBranch(bool fixture.MergeTo("main"); - if (useMainline) - { - // ✅ succeeds as expected - fixture.AssertFullSemver("2.1.0-1+4", configuration); - } - else - { - // ❔ expected: "2.1.0-1+4" - fixture.AssertFullSemver("3.0.0-1+4", configuration); - } + // ✅ succeeds as expected + fixture.AssertFullSemver("2.1.0-1+4", configuration); } /// @@ -868,7 +852,7 @@ public void EnsureFeatureWithIncrementPatchOnMainAndNoneOnFeatureBranch(bool use else { // ❔ expected: "0.0.2-2+4" - fixture.AssertFullSemver("0.0.3-1+4", configuration); + fixture.AssertFullSemver("0.0.2-1+4", configuration); } } @@ -1236,7 +1220,7 @@ public void EnsureFeatureWithIncrementMinorOnMainAndNoneOnFeatureBranch(bool use else { // ❔ expected: "0.2.0-2+4" - fixture.AssertFullSemver("0.3.0-1+4", configuration); + fixture.AssertFullSemver("0.2.0-1+4", configuration); } } @@ -1308,16 +1292,8 @@ public void EnsureFeatureWithIncrementMinorOnMainAndPatchOnFeatureBranch(bool us fixture.MergeTo("main"); - if (useMainline) - { - // ✅ succeeds as expected - fixture.AssertFullSemver("0.2.1-1+4", configuration); - } - else - { - // ❔ expected: "0.2.1-1+4" - fixture.AssertFullSemver("0.3.0-1+4", configuration); - } + // ✅ succeeds as expected + fixture.AssertFullSemver("0.2.1-1+4", configuration); } /// @@ -1612,7 +1588,7 @@ public void EnsureFeatureWithIncrementMajorOnMainAndNoneOnFeatureBranch(bool use else { // ❔ expected: "2.0.0-2+4" - fixture.AssertFullSemver("3.0.0-1+4", configuration); + fixture.AssertFullSemver("2.0.0-1+4", configuration); } } @@ -1684,16 +1660,9 @@ public void EnsureFeatureWithIncrementMajorOnMainAndPatchOnFeatureBranch(bool us fixture.MergeTo("main"); - if (useMainline) - { - // ✅ succeeds as expected - fixture.AssertFullSemver("2.0.1-1+4", configuration); - } - else - { - // ❔ expected: "2.0.1-foo.2+3" - fixture.AssertFullSemver("3.0.0-1+4", configuration); - } + // Mainline: ✅ succeeds as expected + // Non-mainline: ❔ expected: "2.0.1-foo.2+3" + fixture.AssertFullSemver("2.0.1-1+4", configuration); } /// @@ -1764,16 +1733,8 @@ public void EnsureFeatureWithIncrementMajorOnMainAndMinorOnFeatureBranch(bool us fixture.MergeTo("main"); - if (useMainline) - { - // ✅ succeeds as expected - fixture.AssertFullSemver("2.1.0-1+4", configuration); - } - else - { - // ❔ expected: "2.1.0-1+4" - fixture.AssertFullSemver("3.0.0-1+4", configuration); - } + // ✅ succeeds as expected + fixture.AssertFullSemver("2.1.0-1+4", configuration); } /// @@ -2018,7 +1979,7 @@ public void EnsureMergeMainToFeatureWithIncrementInheritOnMainAndNoneOnFeatureBr else { // ❔ expected: "2.0.0-2+6" - fixture.AssertFullSemver("3.0.0-1+6", configuration); + fixture.AssertFullSemver("2.0.0-1+6", configuration); } } @@ -2101,16 +2062,8 @@ public void EnsureMergeMainToFeatureWithIncrementInheritOnMainAndPatchOnFeatureB fixture.MergeTo("main"); - if (useMainline) - { - // ✅ succeeds as expected - fixture.AssertFullSemver("2.0.1-1+6", configuration); - } - else - { - // ❔ expected: "2.0.1-1+6" - fixture.AssertFullSemver("3.0.0-1+6", configuration); - } + // ✅ succeeds as expected + fixture.AssertFullSemver("2.0.1-1+6", configuration); } /// @@ -2192,16 +2145,8 @@ public void EnsureMergeMainToFeatureWithIncrementInheritOnMainAndMinorOnFeatureB fixture.MergeTo("main"); - if (useMainline) - { - // ✅ succeeds as expected - fixture.AssertFullSemver("2.1.0-1+6", configuration); - } - else - { - // ❔ expected: "2.1.0-1+6" - fixture.AssertFullSemver("3.0.0-1+6", configuration); - } + // ✅ succeeds as expected + fixture.AssertFullSemver("2.1.0-1+6", configuration); } /// @@ -2944,7 +2889,7 @@ public void EnsureMergeMainToFeatureWithIncrementPatchOnMainAndNoneOnFeatureBran else { // ❔ expected: "0.0.2-2+6" - fixture.AssertFullSemver("0.0.3-1+6", configuration); + fixture.AssertFullSemver("0.0.2-1+6", configuration); } } @@ -3366,8 +3311,8 @@ public void EnsureMergeMainToFeatureWithIncrementMinorOnMainAndNoneOnFeatureBran } else { - // ❔ expected: "0.2.0-1+6" - fixture.AssertFullSemver("0.3.0-1+6", configuration); + // ✅ succeeds as expected + fixture.AssertFullSemver("0.2.0-1+6", configuration); } } @@ -3450,16 +3395,8 @@ public void EnsureMergeMainToFeatureWithIncrementMinorOnMainAndPatchOnFeatureBra fixture.MergeTo("main"); - if (useMainline) - { - // ✅ succeeds as expected - fixture.AssertFullSemver("0.2.1-1+6", configuration); - } - else - { - // ❔ expected: "0.2.1-1+6" - fixture.AssertFullSemver("0.3.0-1+6", configuration); - } + // ✅ succeeds as expected + fixture.AssertFullSemver("0.2.1-1+6", configuration); } /// @@ -3798,7 +3735,7 @@ public void EnsureMergeMainToFeatureWithIncrementMajorOnMainAndNoneOnFeatureBran else { // ❔ expected: "2.0.0-2+6" - fixture.AssertFullSemver("3.0.0-1+6", configuration); + fixture.AssertFullSemver("2.0.0-1+6", configuration); } } @@ -3881,16 +3818,8 @@ public void EnsureMergeMainToFeatureWithIncrementMajorOnMainAndPatchOnFeatureBra fixture.MergeTo("main"); - if (useMainline) - { - // ✅ succeeds as expected - fixture.AssertFullSemver("2.0.1-1+6", configuration); - } - else - { - // ❔ expected: "2.0.1-1+6" - fixture.AssertFullSemver("3.0.0-1+6", configuration); - } + // ✅ succeeds as expected + fixture.AssertFullSemver("2.0.1-1+6", configuration); } /// @@ -3972,16 +3901,8 @@ public void EnsureMergeMainToFeatureWithIncrementMajorOnMainAndMinorOnFeatureBra fixture.MergeTo("main"); - if (useMainline) - { - // ✅ succeeds as expected - fixture.AssertFullSemver("2.1.0-1+6", configuration); - } - else - { - // ❔ expected: "2.1.0-1+6" - fixture.AssertFullSemver("3.0.0-1+6", configuration); - } + // ✅ succeeds as expected + fixture.AssertFullSemver("2.1.0-1+6", configuration); } /// @@ -4190,8 +4111,8 @@ public void EnsurePullRequestWithIncrementInheritOnMainAndNoneOnFeatureBranch(bo } else { - // ❔ expected: "1.0.0-1+2" - fixture.AssertFullSemver("2.0.0-1+2", configuration); + // ✅ succeeds as expected + fixture.AssertFullSemver("1.0.0-1+2", configuration); } } @@ -4255,16 +4176,8 @@ public void EnsurePullRequestWithIncrementInheritOnMainAndPatchOnFeatureBranch(b fixture.Remove("pull/2/merge"); fixture.MergeNoFF("feature/foo"); - if (useMainline) - { - // ✅ succeeds as expected - fixture.AssertFullSemver("1.0.1-1+2", configuration); - } - else - { - // ❔ expected: "1.0.1-1+2" - fixture.AssertFullSemver("2.0.0-1+2", configuration); - } + // ✅ succeeds as expected + fixture.AssertFullSemver("1.0.1-1+2", configuration); } /// @@ -4327,16 +4240,8 @@ public void EnsurePullRequestWithIncrementInheritOnMainAndMinorOnFeatureBranch(b fixture.Remove("pull/2/merge"); fixture.MergeNoFF("feature/foo"); - if (useMainline) - { - // ✅ succeeds as expected - fixture.AssertFullSemver("1.1.0-1+2", configuration); - } - else - { - // ❔ expected: "1.1.0-1+2" - fixture.AssertFullSemver("2.0.0-1+2", configuration); - } + // ✅ succeeds as expected + fixture.AssertFullSemver("1.1.0-1+2", configuration); } /// @@ -4575,16 +4480,8 @@ public void EnsurePullRequestWithIncrementNoneOnMainAndPatchOnFeatureBranch(bool fixture.Remove("pull/2/merge"); fixture.MergeNoFF("feature/foo"); - if (useMainline) - { - // ✅ succeeds as expected - fixture.AssertFullSemver("0.0.1-1+2", configuration); - } - else - { - // ❔ expected: "0.0.1-1+2" - fixture.AssertFullSemver("0.0.0-1+2", configuration); - } + // ✅ succeeds as expected + fixture.AssertFullSemver("0.0.1-1+2", configuration); } /// @@ -4639,16 +4536,8 @@ public void EnsurePullRequestWithIncrementNoneOnMainAndMinorOnFeatureBranch(bool fixture.Remove("pull/2/merge"); fixture.MergeNoFF("feature/foo"); - if (useMainline) - { - // ✅ succeeds as expected - fixture.AssertFullSemver("0.1.0-1+2", configuration); - } - else - { - // ❔ expected: "0.1.0-1+2" - fixture.AssertFullSemver("0.0.0-1+2", configuration); - } + // ✅ succeeds as expected + fixture.AssertFullSemver("0.1.0-1+2", configuration); } /// @@ -4703,16 +4592,8 @@ public void EnsurePullRequestWithIncrementNoneOnMainAndMajorOnFeatureBranch(bool fixture.Remove("pull/2/merge"); fixture.MergeNoFF("feature/foo"); - if (useMainline) - { - // ✅ succeeds as expected - fixture.AssertFullSemver("1.0.0-1+2", configuration); - } - else - { - // ❔ expected: "1.0.0-1+2" - fixture.AssertFullSemver("0.0.0-1+2", configuration); - } + // ✅ succeeds as expected + fixture.AssertFullSemver("1.0.0-1+2", configuration); } /// @@ -4839,7 +4720,7 @@ public void EnsurePullRequestWithIncrementPatchOnMainAndNoneOnFeatureBranch(bool else { // ❔ expected: "0.0.1-2+2" - fixture.AssertFullSemver("0.0.2-1+2", configuration); + fixture.AssertFullSemver("0.0.1-1+2", configuration); } } @@ -4951,16 +4832,8 @@ public void EnsurePullRequestWithIncrementPatchOnMainAndMinorOnFeatureBranch(boo fixture.Remove("pull/2/merge"); fixture.MergeNoFF("feature/foo"); - if (useMainline) - { - // ✅ succeeds as expected - fixture.AssertFullSemver("0.1.0-1+2", configuration); - } - else - { - // ❔ expected: "0.1.0-1+2" - fixture.AssertFullSemver("0.0.2-1+2", configuration); - } + // ✅ succeeds as expected + fixture.AssertFullSemver("0.1.0-1+2", configuration); } /// @@ -5015,16 +4888,8 @@ public void EnsurePullRequestWithIncrementPatchOnMainAndMajorOnFeatureBranch(boo fixture.Remove("pull/2/merge"); fixture.MergeNoFF("feature/foo"); - if (useMainline) - { - // ✅ succeeds as expected - fixture.AssertFullSemver("1.0.0-1+2", configuration); - } - else - { - // ❔ expected: "1.0.0-1+2" - fixture.AssertFullSemver("0.0.2-1+2", configuration); - } + // ✅ succeeds as expected + fixture.AssertFullSemver("1.0.0-1+2", configuration); } /// @@ -5150,8 +5015,8 @@ public void EnsurePullRequestWithIncrementMinorOnMainAndNoneOnFeatureBranch(bool } else { - // ❔ expected: "0.1.0-1+2" - fixture.AssertFullSemver("0.2.0-1+2", configuration); + // ✅ succeeds as expected + fixture.AssertFullSemver("0.1.0-1+2", configuration); } } @@ -5215,16 +5080,8 @@ public void EnsurePullRequestWithIncrementMinorOnMainAndPatchOnFeatureBranch(boo fixture.Remove("pull/2/merge"); fixture.MergeNoFF("feature/foo"); - if (useMainline) - { - // ✅ succeeds as expected - fixture.AssertFullSemver("0.1.1-1+2", configuration); - } - else - { - // ❔ expected: "0.1.1-1+2" - fixture.AssertFullSemver("0.2.0-1+2", configuration); - } + // ✅ succeeds as expected + fixture.AssertFullSemver("0.1.1-1+2", configuration); } /// @@ -5335,16 +5192,8 @@ public void EnsurePullRequestWithIncrementMinorOnMainAndMajorOnFeatureBranch(boo fixture.Remove("pull/2/merge"); fixture.MergeNoFF("feature/foo"); - if (useMainline) - { - // ✅ succeeds as expected - fixture.AssertFullSemver("1.0.0-1+2", configuration); - } - else - { - // ❔ expected: "1.0.0-1+2" - fixture.AssertFullSemver("0.2.0-1+2", configuration); - } + // ✅ succeeds as expected + fixture.AssertFullSemver("1.0.0-1+2", configuration); } /// @@ -5470,8 +5319,8 @@ public void EnsurePullRequestWithIncrementMajorOnMainAndNoneOnFeatureBranch(bool } else { - // ❔ expected: "1.0.0-1+2" - fixture.AssertFullSemver("2.0.0-1+2", configuration); + // ✅ succeeds as expected + fixture.AssertFullSemver("1.0.0-1+2", configuration); } } @@ -5535,16 +5384,8 @@ public void EnsurePullRequestWithIncrementMajorOnMainAndPatchOnFeatureBranch(boo fixture.Remove("pull/2/merge"); fixture.MergeNoFF("feature/foo"); - if (useMainline) - { - // ✅ succeeds as expected - fixture.AssertFullSemver("1.0.1-1+2", configuration); - } - else - { - // ❔ expected: "1.0.1-1+2" - fixture.AssertFullSemver("2.0.0-1+2", configuration); - } + // ✅ succeeds as expected + fixture.AssertFullSemver("1.0.1-1+2", configuration); } /// @@ -5607,16 +5448,8 @@ public void EnsurePullRequestWithIncrementMajorOnMainAndMinorOnFeatureBranch(boo fixture.Remove("pull/2/merge"); fixture.MergeNoFF("feature/foo"); - if (useMainline) - { - // ✅ succeeds as expected - fixture.AssertFullSemver("1.1.0-1+2", configuration); - } - else - { - // ❔ expected: "1.1.0-1+2" - fixture.AssertFullSemver("2.0.0-1+2", configuration); - } + // ✅ succeeds as expected + fixture.AssertFullSemver("1.1.0-1+2", configuration); } /// @@ -5979,7 +5812,7 @@ public void EnsureReleaseBranchWithIncrementInheritOnMainAndNoneOnReleaseBranch( else { // ❔ expected: "2.0.0-2+6" - fixture.AssertFullSemver("3.0.0-1+6", configuration); + fixture.AssertFullSemver("2.0.0-1+6", configuration); } if (!useMainline) @@ -6083,16 +5916,8 @@ public void EnsureReleaseBranchWithIncrementInheritOnMainAndPatchOnReleaseBranch fixture.MergeTo("main", removeBranchAfterMerging: true); - if (useMainline) - { - // ✅ succeeds as expected - fixture.AssertFullSemver("2.0.1-1+6", configuration); - } - else - { - // ❔ expected: "2.0.1-1+6" - fixture.AssertFullSemver("3.0.0-1+6", configuration); - } + // ✅ succeeds as expected + fixture.AssertFullSemver("2.0.1-1+6", configuration); if (!useMainline) { @@ -6197,16 +6022,8 @@ public void EnsureReleaseBranchWithIncrementInheritOnMainAndMinorOnReleaseBranch fixture.MergeTo("main", removeBranchAfterMerging: true); - if (useMainline) - { - // ✅ succeeds as expected - fixture.AssertFullSemver("2.1.0-1+6", configuration); - } - else - { - // ❔ expected: "2.1.0-1+6" - fixture.AssertFullSemver("3.0.0-1+6", configuration); - } + // ✅ succeeds as expected + fixture.AssertFullSemver("2.1.0-1+6", configuration); if (!useMainline) { @@ -7313,7 +7130,7 @@ public void EnsureReleaseBranchWithIncrementPatchOnMainAndNoneOnReleaseBranch(bo else { // ❔ expected: "0.0.2-2+6" - fixture.AssertFullSemver("0.0.3-1+6", configuration); + fixture.AssertFullSemver("0.0.2-1+6", configuration); } if (!useMainline) @@ -7919,7 +7736,7 @@ public void EnsureReleaseBranchWithIncrementMinorOnMainAndNoneOnReleaseBranch(bo else { // ❔ expected: "0.2.0-2+6" - fixture.AssertFullSemver("0.3.0-1+6", configuration); + fixture.AssertFullSemver("0.2.0-1+6", configuration); } if (!useMainline) @@ -8019,16 +7836,8 @@ public void EnsureReleaseBranchWithIncrementMinorOnMainAndPatchOnReleaseBranch(b fixture.MergeTo("main", removeBranchAfterMerging: true); - if (useMainline) - { - // ✅ succeeds as expected - fixture.AssertFullSemver("0.2.1-1+6", configuration); - } - else - { - // ❔ expected: "0.2.1-1+6" - fixture.AssertFullSemver("0.3.0-1+6", configuration); - } + // ✅ succeeds as expected + fixture.AssertFullSemver("0.2.1-1+6", configuration); if (!useMainline) { @@ -8545,7 +8354,7 @@ public void EnsureReleaseBranchWithIncrementMajorOnMainAndNoneOnReleaseBranch(bo else { // ❔ expected: "2.0.0-2+6" - fixture.AssertFullSemver("3.0.0-1+6", configuration); + fixture.AssertFullSemver("2.0.0-1+6", configuration); } if (!useMainline) @@ -8647,16 +8456,8 @@ public void EnsureReleaseBranchWithIncrementMajorOnMainAndPatchOnReleaseBranch(b fixture.MergeTo("main", removeBranchAfterMerging: true); - if (useMainline) - { - // ✅ succeeds as expected - fixture.AssertFullSemver("2.0.1-1+6", configuration); - } - else - { - // ❔ expected: "2.0.1-1+6" - fixture.AssertFullSemver("3.0.0-1+6", configuration); - } + // ✅ succeeds as expected + fixture.AssertFullSemver("2.0.1-1+6", configuration); if (!useMainline) { @@ -8759,16 +8560,8 @@ public void EnsureReleaseBranchWithIncrementMajorOnMainAndMinorOnReleaseBranch(b fixture.MergeTo("main", removeBranchAfterMerging: true); - if (useMainline) - { - // ✅ succeeds as expected - fixture.AssertFullSemver("2.1.0-1+6", configuration); - } - else - { - // ❔ expected: "2.1.0-1+6" - fixture.AssertFullSemver("3.0.0-1+6", configuration); - } + // ✅ succeeds as expected + fixture.AssertFullSemver("2.1.0-1+6", configuration); if (!useMainline) { @@ -9213,7 +9006,7 @@ public void EnsureReleaseAndFeatureBranchWithIncrementInheritOnMainAndNoneOnRele else { // ❔ expected: "1.0.0-2+6" - fixture.AssertFullSemver("2.0.0-1+6", configuration); + fixture.AssertFullSemver("1.0.0-1+6", configuration); } if (!useMainline) @@ -9326,16 +9119,8 @@ public void EnsureReleaseAndFeatureBranchWithIncrementInheritOnMainAndPatchOnRel fixture.MergeTo("main", removeBranchAfterMerging: true); - if (useMainline) - { - // ✅ succeeds as expected - fixture.AssertFullSemver("1.0.1-1+6", configuration); - } - else - { - // ❔ expected: "1.0.1-1+6" - fixture.AssertFullSemver("2.0.0-1+6", configuration); - } + // ✅ succeeds as expected + fixture.AssertFullSemver("1.0.1-1+6", configuration); if (!useMainline) { @@ -9451,16 +9236,8 @@ public void EnsureReleaseAndFeatureBranchWithIncrementInheritOnMainAndMinorOnRel fixture.MergeTo("main", removeBranchAfterMerging: true); - if (useMainline) - { - // ✅ succeeds as expected - fixture.AssertFullSemver("1.1.0-1+6", configuration); - } - else - { - // ❔ expected: "1.1.0-1+6" - fixture.AssertFullSemver("2.0.0-1+6", configuration); - } + // ✅ succeeds as expected + fixture.AssertFullSemver("1.1.0-1+6", configuration); if (!useMainline) { @@ -10569,7 +10346,7 @@ public void EnsureReleaseAndFeatureBranchWithIncrementPatchOnMainAndNoneOnReleas else { // ❔ expected: "0.0.1-2+6" - fixture.AssertFullSemver("0.0.2-1+6", configuration); + fixture.AssertFullSemver("0.0.1-1+6", configuration); } if (!useMainline) @@ -11206,7 +10983,7 @@ public void EnsureReleaseAndFeatureBranchWithIncrementMinorOnMainAndNoneOnReleas else { // ❔ not expected - fixture.AssertFullSemver("0.2.0-1+6", configuration); + fixture.AssertFullSemver("0.1.0-1+6", configuration); } if (!useMainline) @@ -11313,16 +11090,9 @@ public void EnsureReleaseAndFeatureBranchWithIncrementMinorOnMainAndPatchOnRelea fixture.MergeTo("main", removeBranchAfterMerging: true); - if (useMainline) - { - // ✅ succeeds as expected - fixture.AssertFullSemver("0.1.1-1+6", configuration); - } - else - { - // ❔ not expected - fixture.AssertFullSemver("0.2.0-1+6", configuration); - } + // Mainline: ✅ succeeds as expected + // Non-mainline: ❔ not expected + fixture.AssertFullSemver("0.1.1-1+6", configuration); if (!useMainline) { @@ -11875,7 +11645,7 @@ public void EnsureReleaseAndFeatureBranchWithIncrementMajorOnMainAndNoneOnReleas else { // ❔ expected: "1.0.0-2+6" - fixture.AssertFullSemver("2.0.0-1+6", configuration); + fixture.AssertFullSemver("1.0.0-1+6", configuration); } if (!useMainline) @@ -11988,16 +11758,8 @@ public void EnsureReleaseAndFeatureBranchWithIncrementMajorOnMainAndPatchOnRelea fixture.MergeTo("main", removeBranchAfterMerging: true); - if (useMainline) - { - // ✅ succeeds as expected - fixture.AssertFullSemver("1.0.1-1+6", configuration); - } - else - { - // ❔ expected: "1.0.1-1+6" - fixture.AssertFullSemver("2.0.0-1+6", configuration); - } + // ✅ succeeds as expected + fixture.AssertFullSemver("1.0.1-1+6", configuration); if (!useMainline) { @@ -12113,16 +11875,8 @@ public void EnsureReleaseAndFeatureBranchWithIncrementMajorOnMainAndMinorOnRelea fixture.MergeTo("main", removeBranchAfterMerging: true); - if (useMainline) - { - // ✅ succeeds as expected - fixture.AssertFullSemver("1.1.0-1+6", configuration); - } - else - { - // ❔ expected: "1.1.0-1+6" - fixture.AssertFullSemver("2.0.0-1+6", configuration); - } + // ✅ succeeds as expected + fixture.AssertFullSemver("1.1.0-1+6", configuration); if (!useMainline) { diff --git a/src/GitVersion.Core.Tests/IntegrationTests/AlignGitHubFlowWithMainlineVersionStrategy.cs b/src/GitVersion.Core.Tests/IntegrationTests/AlignGitHubFlowWithMainlineVersionStrategy.cs index 33738c6136..87647d7c29 100644 --- a/src/GitVersion.Core.Tests/IntegrationTests/AlignGitHubFlowWithMainlineVersionStrategy.cs +++ b/src/GitVersion.Core.Tests/IntegrationTests/AlignGitHubFlowWithMainlineVersionStrategy.cs @@ -158,7 +158,7 @@ public void EnsureFeatureWithIncrementInheritOnMainAndNoneOnFeatureBranch(bool u else { // ❔ expected: "2.0.0-2+4" - fixture.AssertFullSemver("3.0.0-1+4", configuration); + fixture.AssertFullSemver("2.0.0-1+4", configuration); } } @@ -230,16 +230,8 @@ public void EnsureFeatureWithIncrementInheritOnMainAndPatchOnFeatureBranch(bool fixture.MergeTo("main"); - if (useMainline) - { - // ✅ succeeds as expected - fixture.AssertFullSemver("2.0.1-1+4", configuration); - } - else - { - // ❔ expected: "2.0.1-1+4" - fixture.AssertFullSemver("3.0.0-1+4", configuration); - } + // ✅ succeeds as expected + fixture.AssertFullSemver("2.0.1-1+4", configuration); } /// @@ -310,16 +302,8 @@ public void EnsureFeatureWithIncrementInheritOnMainAndMinorOnFeatureBranch(bool fixture.MergeTo("main"); - if (useMainline) - { - // ✅ succeeds as expected - fixture.AssertFullSemver("2.1.0-1+4", configuration); - } - else - { - // ❔ expected: "2.1.0-1+4" - fixture.AssertFullSemver("3.0.0-1+4", configuration); - } + // ✅ succeeds as expected + fixture.AssertFullSemver("2.1.0-1+4", configuration); } /// @@ -868,7 +852,7 @@ public void EnsureFeatureWithIncrementPatchOnMainAndNoneOnFeatureBranch(bool use else { // ❔ expected: "0.0.2-2+4" - fixture.AssertFullSemver("0.0.3-1+4", configuration); + fixture.AssertFullSemver("0.0.2-1+4", configuration); } } @@ -1236,7 +1220,7 @@ public void EnsureFeatureWithIncrementMinorOnMainAndNoneOnFeatureBranch(bool use else { // ❔ expected: "0.2.0-2+4" - fixture.AssertFullSemver("0.3.0-1+4", configuration); + fixture.AssertFullSemver("0.2.0-1+4", configuration); } } @@ -1308,16 +1292,8 @@ public void EnsureFeatureWithIncrementMinorOnMainAndPatchOnFeatureBranch(bool us fixture.MergeTo("main"); - if (useMainline) - { - // ✅ succeeds as expected - fixture.AssertFullSemver("0.2.1-1+4", configuration); - } - else - { - // ❔ expected: "0.2.1-1+4" - fixture.AssertFullSemver("0.3.0-1+4", configuration); - } + // ✅ succeeds as expected + fixture.AssertFullSemver("0.2.1-1+4", configuration); } /// @@ -1612,7 +1588,7 @@ public void EnsureFeatureWithIncrementMajorOnMainAndNoneOnFeatureBranch(bool use else { // ❔ expected: "2.0.0-2+4" - fixture.AssertFullSemver("3.0.0-1+4", configuration); + fixture.AssertFullSemver("2.0.0-1+4", configuration); } } @@ -1684,16 +1660,9 @@ public void EnsureFeatureWithIncrementMajorOnMainAndPatchOnFeatureBranch(bool us fixture.MergeTo("main"); - if (useMainline) - { - // ✅ succeeds as expected - fixture.AssertFullSemver("2.0.1-1+4", configuration); - } - else - { - // ❔ expected: "2.0.1-foo.2+3" - fixture.AssertFullSemver("3.0.0-1+4", configuration); - } + // Mainline: ✅ succeeds as expected + // Non-mainline: ❔ expected: "2.0.1-foo.2+3" + fixture.AssertFullSemver("2.0.1-1+4", configuration); } /// @@ -1764,16 +1733,8 @@ public void EnsureFeatureWithIncrementMajorOnMainAndMinorOnFeatureBranch(bool us fixture.MergeTo("main"); - if (useMainline) - { - // ✅ succeeds as expected - fixture.AssertFullSemver("2.1.0-1+4", configuration); - } - else - { - // ❔ expected: "2.1.0-1+4" - fixture.AssertFullSemver("3.0.0-1+4", configuration); - } + // ✅ succeeds as expected + fixture.AssertFullSemver("2.1.0-1+4", configuration); } /// @@ -2018,7 +1979,7 @@ public void EnsureMergeMainToFeatureWithIncrementInheritOnMainAndNoneOnFeatureBr else { // ❔ expected: "2.0.0-2+6" - fixture.AssertFullSemver("3.0.0-1+6", configuration); + fixture.AssertFullSemver("2.0.0-1+6", configuration); } } @@ -2101,16 +2062,8 @@ public void EnsureMergeMainToFeatureWithIncrementInheritOnMainAndPatchOnFeatureB fixture.MergeTo("main"); - if (useMainline) - { - // ✅ succeeds as expected - fixture.AssertFullSemver("2.0.1-1+6", configuration); - } - else - { - // ❔ expected: "2.0.1-1+6" - fixture.AssertFullSemver("3.0.0-1+6", configuration); - } + // ✅ succeeds as expected + fixture.AssertFullSemver("2.0.1-1+6", configuration); } /// @@ -2192,16 +2145,8 @@ public void EnsureMergeMainToFeatureWithIncrementInheritOnMainAndMinorOnFeatureB fixture.MergeTo("main"); - if (useMainline) - { - // ✅ succeeds as expected - fixture.AssertFullSemver("2.1.0-1+6", configuration); - } - else - { - // ❔ expected: "2.1.0-1+6" - fixture.AssertFullSemver("3.0.0-1+6", configuration); - } + // ✅ succeeds as expected + fixture.AssertFullSemver("2.1.0-1+6", configuration); } /// @@ -2944,7 +2889,7 @@ public void EnsureMergeMainToFeatureWithIncrementPatchOnMainAndNoneOnFeatureBran else { // ❔ expected: "0.0.2-2+6" - fixture.AssertFullSemver("0.0.3-1+6", configuration); + fixture.AssertFullSemver("0.0.2-1+6", configuration); } } @@ -3366,8 +3311,8 @@ public void EnsureMergeMainToFeatureWithIncrementMinorOnMainAndNoneOnFeatureBran } else { - // ❔ expected: "0.2.0-1+6" - fixture.AssertFullSemver("0.3.0-1+6", configuration); + // ✅ succeeds as expected + fixture.AssertFullSemver("0.2.0-1+6", configuration); } } @@ -3450,16 +3395,8 @@ public void EnsureMergeMainToFeatureWithIncrementMinorOnMainAndPatchOnFeatureBra fixture.MergeTo("main"); - if (useMainline) - { - // ✅ succeeds as expected - fixture.AssertFullSemver("0.2.1-1+6", configuration); - } - else - { - // ❔ expected: "0.2.1-1+6" - fixture.AssertFullSemver("0.3.0-1+6", configuration); - } + // ✅ succeeds as expected + fixture.AssertFullSemver("0.2.1-1+6", configuration); } /// @@ -3798,7 +3735,7 @@ public void EnsureMergeMainToFeatureWithIncrementMajorOnMainAndNoneOnFeatureBran else { // ❔ expected: "2.0.0-2+6" - fixture.AssertFullSemver("3.0.0-1+6", configuration); + fixture.AssertFullSemver("2.0.0-1+6", configuration); } } @@ -3881,16 +3818,8 @@ public void EnsureMergeMainToFeatureWithIncrementMajorOnMainAndPatchOnFeatureBra fixture.MergeTo("main"); - if (useMainline) - { - // ✅ succeeds as expected - fixture.AssertFullSemver("2.0.1-1+6", configuration); - } - else - { - // ❔ expected: "2.0.1-1+6" - fixture.AssertFullSemver("3.0.0-1+6", configuration); - } + // ✅ succeeds as expected + fixture.AssertFullSemver("2.0.1-1+6", configuration); } /// @@ -3972,16 +3901,8 @@ public void EnsureMergeMainToFeatureWithIncrementMajorOnMainAndMinorOnFeatureBra fixture.MergeTo("main"); - if (useMainline) - { - // ✅ succeeds as expected - fixture.AssertFullSemver("2.1.0-1+6", configuration); - } - else - { - // ❔ expected: "2.1.0-1+6" - fixture.AssertFullSemver("3.0.0-1+6", configuration); - } + // ✅ succeeds as expected + fixture.AssertFullSemver("2.1.0-1+6", configuration); } /// @@ -4190,8 +4111,8 @@ public void EnsurePullRequestWithIncrementInheritOnMainAndNoneOnFeatureBranch(bo } else { - // ❔ expected: "1.0.0-1+2" - fixture.AssertFullSemver("2.0.0-1+2", configuration); + // ✅ succeeds as expected + fixture.AssertFullSemver("1.0.0-1+2", configuration); } } @@ -4255,16 +4176,8 @@ public void EnsurePullRequestWithIncrementInheritOnMainAndPatchOnFeatureBranch(b fixture.Remove("pull/2/merge"); fixture.MergeNoFF("feature/foo"); - if (useMainline) - { - // ✅ succeeds as expected - fixture.AssertFullSemver("1.0.1-1+2", configuration); - } - else - { - // ❔ expected: "1.0.1-1+2" - fixture.AssertFullSemver("2.0.0-1+2", configuration); - } + // ✅ succeeds as expected + fixture.AssertFullSemver("1.0.1-1+2", configuration); } /// @@ -4327,16 +4240,8 @@ public void EnsurePullRequestWithIncrementInheritOnMainAndMinorOnFeatureBranch(b fixture.Remove("pull/2/merge"); fixture.MergeNoFF("feature/foo"); - if (useMainline) - { - // ✅ succeeds as expected - fixture.AssertFullSemver("1.1.0-1+2", configuration); - } - else - { - // ❔ expected: "1.1.0-1+2" - fixture.AssertFullSemver("2.0.0-1+2", configuration); - } + // ✅ succeeds as expected + fixture.AssertFullSemver("1.1.0-1+2", configuration); } /// @@ -4575,16 +4480,8 @@ public void EnsurePullRequestWithIncrementNoneOnMainAndPatchOnFeatureBranch(bool fixture.Remove("pull/2/merge"); fixture.MergeNoFF("feature/foo"); - if (useMainline) - { - // ✅ succeeds as expected - fixture.AssertFullSemver("0.0.1-1+2", configuration); - } - else - { - // ❔ expected: "0.0.1-1+2" - fixture.AssertFullSemver("0.0.0-1+2", configuration); - } + // ✅ succeeds as expected + fixture.AssertFullSemver("0.0.1-1+2", configuration); } /// @@ -4639,16 +4536,8 @@ public void EnsurePullRequestWithIncrementNoneOnMainAndMinorOnFeatureBranch(bool fixture.Remove("pull/2/merge"); fixture.MergeNoFF("feature/foo"); - if (useMainline) - { - // ✅ succeeds as expected - fixture.AssertFullSemver("0.1.0-1+2", configuration); - } - else - { - // ❔ expected: "0.1.0-1+2" - fixture.AssertFullSemver("0.0.0-1+2", configuration); - } + // ✅ succeeds as expected + fixture.AssertFullSemver("0.1.0-1+2", configuration); } /// @@ -4703,16 +4592,8 @@ public void EnsurePullRequestWithIncrementNoneOnMainAndMajorOnFeatureBranch(bool fixture.Remove("pull/2/merge"); fixture.MergeNoFF("feature/foo"); - if (useMainline) - { - // ✅ succeeds as expected - fixture.AssertFullSemver("1.0.0-1+2", configuration); - } - else - { - // ❔ expected: "1.0.0-1+2" - fixture.AssertFullSemver("0.0.0-1+2", configuration); - } + // ✅ succeeds as expected + fixture.AssertFullSemver("1.0.0-1+2", configuration); } /// @@ -4839,7 +4720,7 @@ public void EnsurePullRequestWithIncrementPatchOnMainAndNoneOnFeatureBranch(bool else { // ❔ expected: "0.0.1-2+2" - fixture.AssertFullSemver("0.0.2-1+2", configuration); + fixture.AssertFullSemver("0.0.1-1+2", configuration); } } @@ -4951,16 +4832,8 @@ public void EnsurePullRequestWithIncrementPatchOnMainAndMinorOnFeatureBranch(boo fixture.Remove("pull/2/merge"); fixture.MergeNoFF("feature/foo"); - if (useMainline) - { - // ✅ succeeds as expected - fixture.AssertFullSemver("0.1.0-1+2", configuration); - } - else - { - // ❔ expected: "0.1.0-1+2" - fixture.AssertFullSemver("0.0.2-1+2", configuration); - } + // ✅ succeeds as expected + fixture.AssertFullSemver("0.1.0-1+2", configuration); } /// @@ -5015,16 +4888,8 @@ public void EnsurePullRequestWithIncrementPatchOnMainAndMajorOnFeatureBranch(boo fixture.Remove("pull/2/merge"); fixture.MergeNoFF("feature/foo"); - if (useMainline) - { - // ✅ succeeds as expected - fixture.AssertFullSemver("1.0.0-1+2", configuration); - } - else - { - // ❔ expected: "1.0.0-1+2" - fixture.AssertFullSemver("0.0.2-1+2", configuration); - } + // ✅ succeeds as expected + fixture.AssertFullSemver("1.0.0-1+2", configuration); } /// @@ -5150,8 +5015,8 @@ public void EnsurePullRequestWithIncrementMinorOnMainAndNoneOnFeatureBranch(bool } else { - // ❔ expected: "0.1.0-1+2" - fixture.AssertFullSemver("0.2.0-1+2", configuration); + // ✅ succeeds as expected + fixture.AssertFullSemver("0.1.0-1+2", configuration); } } @@ -5215,16 +5080,8 @@ public void EnsurePullRequestWithIncrementMinorOnMainAndPatchOnFeatureBranch(boo fixture.Remove("pull/2/merge"); fixture.MergeNoFF("feature/foo"); - if (useMainline) - { - // ✅ succeeds as expected - fixture.AssertFullSemver("0.1.1-1+2", configuration); - } - else - { - // ❔ expected: "0.1.1-1+2" - fixture.AssertFullSemver("0.2.0-1+2", configuration); - } + // ✅ succeeds as expected + fixture.AssertFullSemver("0.1.1-1+2", configuration); } /// @@ -5335,16 +5192,8 @@ public void EnsurePullRequestWithIncrementMinorOnMainAndMajorOnFeatureBranch(boo fixture.Remove("pull/2/merge"); fixture.MergeNoFF("feature/foo"); - if (useMainline) - { - // ✅ succeeds as expected - fixture.AssertFullSemver("1.0.0-1+2", configuration); - } - else - { - // ❔ expected: "1.0.0-1+2" - fixture.AssertFullSemver("0.2.0-1+2", configuration); - } + // ✅ succeeds as expected + fixture.AssertFullSemver("1.0.0-1+2", configuration); } /// @@ -5470,8 +5319,8 @@ public void EnsurePullRequestWithIncrementMajorOnMainAndNoneOnFeatureBranch(bool } else { - // ❔ expected: "1.0.0-1+2" - fixture.AssertFullSemver("2.0.0-1+2", configuration); + // ✅ succeeds as expected + fixture.AssertFullSemver("1.0.0-1+2", configuration); } } @@ -5535,16 +5384,8 @@ public void EnsurePullRequestWithIncrementMajorOnMainAndPatchOnFeatureBranch(boo fixture.Remove("pull/2/merge"); fixture.MergeNoFF("feature/foo"); - if (useMainline) - { - // ✅ succeeds as expected - fixture.AssertFullSemver("1.0.1-1+2", configuration); - } - else - { - // ❔ expected: "1.0.1-1+2" - fixture.AssertFullSemver("2.0.0-1+2", configuration); - } + // ✅ succeeds as expected + fixture.AssertFullSemver("1.0.1-1+2", configuration); } /// @@ -5607,16 +5448,8 @@ public void EnsurePullRequestWithIncrementMajorOnMainAndMinorOnFeatureBranch(boo fixture.Remove("pull/2/merge"); fixture.MergeNoFF("feature/foo"); - if (useMainline) - { - // ✅ succeeds as expected - fixture.AssertFullSemver("1.1.0-1+2", configuration); - } - else - { - // ❔ expected: "1.1.0-1+2" - fixture.AssertFullSemver("2.0.0-1+2", configuration); - } + // ✅ succeeds as expected + fixture.AssertFullSemver("1.1.0-1+2", configuration); } /// @@ -5979,7 +5812,7 @@ public void EnsureReleaseBranchWithIncrementInheritOnMainAndNoneOnReleaseBranch( else { // ❔ expected: "2.0.0-2+6" - fixture.AssertFullSemver("3.0.0-1+6", configuration); + fixture.AssertFullSemver("2.0.0-1+6", configuration); } if (!useMainline) @@ -6083,16 +5916,8 @@ public void EnsureReleaseBranchWithIncrementInheritOnMainAndPatchOnReleaseBranch fixture.MergeTo("main", removeBranchAfterMerging: true); - if (useMainline) - { - // ✅ succeeds as expected - fixture.AssertFullSemver("2.0.1-1+6", configuration); - } - else - { - // ❔ expected: "2.0.1-1+6" - fixture.AssertFullSemver("3.0.0-1+6", configuration); - } + // ✅ succeeds as expected + fixture.AssertFullSemver("2.0.1-1+6", configuration); if (!useMainline) { @@ -6197,16 +6022,8 @@ public void EnsureReleaseBranchWithIncrementInheritOnMainAndMinorOnReleaseBranch fixture.MergeTo("main", removeBranchAfterMerging: true); - if (useMainline) - { - // ✅ succeeds as expected - fixture.AssertFullSemver("2.1.0-1+6", configuration); - } - else - { - // ❔ expected: "2.1.0-1+6" - fixture.AssertFullSemver("3.0.0-1+6", configuration); - } + // ✅ succeeds as expected + fixture.AssertFullSemver("2.1.0-1+6", configuration); if (!useMainline) { @@ -7313,7 +7130,7 @@ public void EnsureReleaseBranchWithIncrementPatchOnMainAndNoneOnReleaseBranch(bo else { // ❔ expected: "0.0.2-2+6" - fixture.AssertFullSemver("0.0.3-1+6", configuration); + fixture.AssertFullSemver("0.0.2-1+6", configuration); } if (!useMainline) @@ -7919,7 +7736,7 @@ public void EnsureReleaseBranchWithIncrementMinorOnMainAndNoneOnReleaseBranch(bo else { // ❔ expected: "0.2.0-2+6" - fixture.AssertFullSemver("0.3.0-1+6", configuration); + fixture.AssertFullSemver("0.2.0-1+6", configuration); } if (!useMainline) @@ -8019,16 +7836,8 @@ public void EnsureReleaseBranchWithIncrementMinorOnMainAndPatchOnReleaseBranch(b fixture.MergeTo("main", removeBranchAfterMerging: true); - if (useMainline) - { - // ✅ succeeds as expected - fixture.AssertFullSemver("0.2.1-1+6", configuration); - } - else - { - // ❔ expected: "0.2.1-1+6" - fixture.AssertFullSemver("0.3.0-1+6", configuration); - } + // ✅ succeeds as expected + fixture.AssertFullSemver("0.2.1-1+6", configuration); if (!useMainline) { @@ -8545,7 +8354,7 @@ public void EnsureReleaseBranchWithIncrementMajorOnMainAndNoneOnReleaseBranch(bo else { // ❔ expected: "2.0.0-2+6" - fixture.AssertFullSemver("3.0.0-1+6", configuration); + fixture.AssertFullSemver("2.0.0-1+6", configuration); } if (!useMainline) @@ -8647,16 +8456,8 @@ public void EnsureReleaseBranchWithIncrementMajorOnMainAndPatchOnReleaseBranch(b fixture.MergeTo("main", removeBranchAfterMerging: true); - if (useMainline) - { - // ✅ succeeds as expected - fixture.AssertFullSemver("2.0.1-1+6", configuration); - } - else - { - // ❔ expected: "2.0.1-1+6" - fixture.AssertFullSemver("3.0.0-1+6", configuration); - } + // ✅ succeeds as expected + fixture.AssertFullSemver("2.0.1-1+6", configuration); if (!useMainline) { @@ -8759,16 +8560,8 @@ public void EnsureReleaseBranchWithIncrementMajorOnMainAndMinorOnReleaseBranch(b fixture.MergeTo("main", removeBranchAfterMerging: true); - if (useMainline) - { - // ✅ succeeds as expected - fixture.AssertFullSemver("2.1.0-1+6", configuration); - } - else - { - // ❔ expected: "2.1.0-1+6" - fixture.AssertFullSemver("3.0.0-1+6", configuration); - } + // ✅ succeeds as expected + fixture.AssertFullSemver("2.1.0-1+6", configuration); if (!useMainline) { @@ -9213,7 +9006,7 @@ public void EnsureReleaseAndFeatureBranchWithIncrementInheritOnMainAndNoneOnRele else { // ❔ expected: "1.0.0-2+6" - fixture.AssertFullSemver("2.0.0-1+6", configuration); + fixture.AssertFullSemver("1.0.0-1+6", configuration); } if (!useMainline) @@ -9326,16 +9119,8 @@ public void EnsureReleaseAndFeatureBranchWithIncrementInheritOnMainAndPatchOnRel fixture.MergeTo("main", removeBranchAfterMerging: true); - if (useMainline) - { - // ✅ succeeds as expected - fixture.AssertFullSemver("1.0.1-1+6", configuration); - } - else - { - // ❔ expected: "1.0.1-1+6" - fixture.AssertFullSemver("2.0.0-1+6", configuration); - } + // ✅ succeeds as expected + fixture.AssertFullSemver("1.0.1-1+6", configuration); if (!useMainline) { @@ -9451,16 +9236,8 @@ public void EnsureReleaseAndFeatureBranchWithIncrementInheritOnMainAndMinorOnRel fixture.MergeTo("main", removeBranchAfterMerging: true); - if (useMainline) - { - // ✅ succeeds as expected - fixture.AssertFullSemver("1.1.0-1+6", configuration); - } - else - { - // ❔ expected: "1.1.0-1+6" - fixture.AssertFullSemver("2.0.0-1+6", configuration); - } + // ✅ succeeds as expected + fixture.AssertFullSemver("1.1.0-1+6", configuration); if (!useMainline) { @@ -10569,7 +10346,7 @@ public void EnsureReleaseAndFeatureBranchWithIncrementPatchOnMainAndNoneOnReleas else { // ❔ expected: "0.0.1-2+6" - fixture.AssertFullSemver("0.0.2-1+6", configuration); + fixture.AssertFullSemver("0.0.1-1+6", configuration); } if (!useMainline) @@ -11206,7 +10983,7 @@ public void EnsureReleaseAndFeatureBranchWithIncrementMinorOnMainAndNoneOnReleas else { // ❔ not expected - fixture.AssertFullSemver("0.2.0-1+6", configuration); + fixture.AssertFullSemver("0.1.0-1+6", configuration); } if (!useMainline) @@ -11313,16 +11090,9 @@ public void EnsureReleaseAndFeatureBranchWithIncrementMinorOnMainAndPatchOnRelea fixture.MergeTo("main", removeBranchAfterMerging: true); - if (useMainline) - { - // ✅ succeeds as expected - fixture.AssertFullSemver("0.1.1-1+6", configuration); - } - else - { - // ❔ not expected - fixture.AssertFullSemver("0.2.0-1+6", configuration); - } + // Mainline: ✅ succeeds as expected + // Non-mainline: ❔ not expected + fixture.AssertFullSemver("0.1.1-1+6", configuration); if (!useMainline) { @@ -11875,7 +11645,7 @@ public void EnsureReleaseAndFeatureBranchWithIncrementMajorOnMainAndNoneOnReleas else { // ❔ expected: "1.0.0-2+6" - fixture.AssertFullSemver("2.0.0-1+6", configuration); + fixture.AssertFullSemver("1.0.0-1+6", configuration); } if (!useMainline) @@ -11988,16 +11758,8 @@ public void EnsureReleaseAndFeatureBranchWithIncrementMajorOnMainAndPatchOnRelea fixture.MergeTo("main", removeBranchAfterMerging: true); - if (useMainline) - { - // ✅ succeeds as expected - fixture.AssertFullSemver("1.0.1-1+6", configuration); - } - else - { - // ❔ expected: "1.0.1-1+6" - fixture.AssertFullSemver("2.0.0-1+6", configuration); - } + // ✅ succeeds as expected + fixture.AssertFullSemver("1.0.1-1+6", configuration); if (!useMainline) { @@ -12113,16 +11875,8 @@ public void EnsureReleaseAndFeatureBranchWithIncrementMajorOnMainAndMinorOnRelea fixture.MergeTo("main", removeBranchAfterMerging: true); - if (useMainline) - { - // ✅ succeeds as expected - fixture.AssertFullSemver("1.1.0-1+6", configuration); - } - else - { - // ❔ expected: "1.1.0-1+6" - fixture.AssertFullSemver("2.0.0-1+6", configuration); - } + // ✅ succeeds as expected + fixture.AssertFullSemver("1.1.0-1+6", configuration); if (!useMainline) { diff --git a/src/GitVersion.Core.Tests/IntegrationTests/FeatureBranchScenarios.cs b/src/GitVersion.Core.Tests/IntegrationTests/FeatureBranchScenarios.cs index 2dd69830da..06f1df605d 100644 --- a/src/GitVersion.Core.Tests/IntegrationTests/FeatureBranchScenarios.cs +++ b/src/GitVersion.Core.Tests/IntegrationTests/FeatureBranchScenarios.cs @@ -322,11 +322,13 @@ public void ShouldPickUpVersionFromMainAfterReleaseBranchMergedBack() // merge release into main fixture.Checkout(MainBranch); fixture.MergeNoFF("release/1.0.0"); - fixture.AssertFullSemver("1.0.1-2", configuration); + fixture.AssertFullSemver("1.1.0-2", configuration); // create a feature branch from main and verify the version fixture.BranchTo("feature/test"); - fixture.AssertFullSemver("1.0.1-test.1+2", configuration); + fixture.AssertFullSemver("1.1.0-test.1+2", configuration); + fixture.MakeACommit(); + fixture.AssertFullSemver("1.1.0-test.1+3", configuration); } } @@ -412,11 +414,11 @@ public void ShouldPickUpVersionFromMainAfterReleaseBranchMergedBack() // merge release into main fixture.Checkout(MainBranch); fixture.MergeNoFF("release/1.0.0"); - fixture.AssertFullSemver("1.0.1-2", configuration); + fixture.AssertFullSemver("1.1.0-2", configuration); // create a misnamed feature branch (i.e. it uses the default configuration) from main and verify the version fixture.BranchTo("misnamed"); - fixture.AssertFullSemver("1.0.1-misnamed.1+2", configuration); + fixture.AssertFullSemver("1.1.0-misnamed.1+2", configuration); } } } diff --git a/src/GitVersion.Core.Tests/IntegrationTests/PreventIncrementOfMergedBranchScenarios.cs b/src/GitVersion.Core.Tests/IntegrationTests/PreventIncrementOfMergedBranchScenarios.cs new file mode 100644 index 0000000000..8c7587fb1f --- /dev/null +++ b/src/GitVersion.Core.Tests/IntegrationTests/PreventIncrementOfMergedBranchScenarios.cs @@ -0,0 +1,1086 @@ +using GitVersion.Configuration; +using GitVersion.Testing.Extensions; +using LibGit2Sharp; + +namespace GitVersion.Tests.IntegrationTests; + +[TestFixture] +[Parallelizable(ParallelScope.All)] +public class PreventIncrementOfMergedBranchScenarios +{ + [TestCase(false, false, "1.0.1-2")] + [TestCase(false, true, "1.0.1-2")] + [TestCase(false, null, "1.1.0-2")] + [TestCase(true, false, "1.1.0-2")] + [TestCase(true, true, "1.0.1-2")] + [TestCase(true, null, "1.1.0-2")] + public void SelectsIncrementFromTargetAndMergedBranchConfiguration( + bool preventIncrementOfMergedBranch, + bool? preventIncrementWhenBranchMerged, + string expectedVersion) + { + var configuration = GitFlowConfigurationBuilder.New + .WithPreventIncrementWhenBranchMerged(null) + .WithBranch("main", builder => builder + .WithIncrement(IncrementStrategy.Patch) + .WithPreventIncrementOfMergedBranch(preventIncrementOfMergedBranch) + ).WithBranch("feature", builder => builder + .WithIncrement(IncrementStrategy.Minor) + .WithPreventIncrementWhenBranchMerged(preventIncrementWhenBranchMerged) + ).Build(); + + using var fixture = new EmptyRepositoryFixture("main"); + fixture.MakeATaggedCommit("1.0.0"); + fixture.BranchTo("feature/foo"); + fixture.MakeACommit(); + fixture.MergeTo("main"); + + fixture.AssertFullSemver(expectedVersion, configuration); + } + + [Test] + public void UsesHotfixIncrementWhenHotfixIsMergedIntoMain() + { + var configuration = GitFlowConfigurationBuilder.New + .WithBranch("main", builder => builder + .WithIncrement(IncrementStrategy.Minor) + .WithPreventIncrementOfMergedBranch(true) + ).WithBranch("hotfix", builder => builder + .WithIncrement(IncrementStrategy.Patch) + ).Build(); + + using var fixture = new EmptyRepositoryFixture("main"); + fixture.MakeATaggedCommit("1.0.0"); + fixture.BranchTo("hotfix/foo"); + fixture.MakeACommit(); + fixture.MergeTo("main"); + + fixture.AssertFullSemver("1.0.1-2", configuration); + } + + [Test] + public void UsesFeatureIncrementWhenFeatureIsMergedIntoMain() + { + var configuration = GitHubFlowConfigurationBuilder.New + .WithBranch("main", builder => builder + .WithIncrement(IncrementStrategy.Patch) + .WithPreventIncrementOfMergedBranch(true) + ).WithBranch("feature", builder => builder + .WithIncrement(IncrementStrategy.Minor) + ).Build(); + + using var fixture = new EmptyRepositoryFixture("main"); + fixture.MakeATaggedCommit("1.0.0"); + fixture.BranchTo("feature/foo"); + fixture.MakeACommit(); + fixture.MergeTo("main"); + + fixture.AssertFullSemver("1.1.0-2", configuration); + } + + [Test] + public void RetainsMergedBranchIncrementAfterSubsequentTargetCommit() + { + var configuration = GitHubFlowConfigurationBuilder.New + .WithBranch("main", builder => builder + .WithIncrement(IncrementStrategy.Patch) + .WithPreventIncrementOfMergedBranch(true) + ).WithBranch("feature", builder => builder + .WithIncrement(IncrementStrategy.Minor) + ).Build(); + + using var fixture = new EmptyRepositoryFixture("main"); + fixture.MakeATaggedCommit("1.0.0"); + fixture.BranchTo("feature/foo"); + fixture.MakeACommit(); + fixture.MergeTo("main"); + fixture.MakeACommit(); + + fixture.AssertFullSemver("1.1.0-3", configuration); + } + + [Test] + public void UsesHighestIncrementFromMultipleMergedBranches() + { + var configuration = GitFlowConfigurationBuilder.New + .WithBranch("main", builder => builder + .WithIncrement(IncrementStrategy.Patch) + .WithPreventIncrementOfMergedBranch(true) + ).WithBranch("hotfix", builder => builder + .WithIncrement(IncrementStrategy.Patch) + ).WithBranch("feature", builder => builder + .WithIncrement(IncrementStrategy.Minor) + ).Build(); + + using var fixture = new EmptyRepositoryFixture("main"); + fixture.MakeATaggedCommit("1.0.0"); + fixture.BranchTo("hotfix/foo"); + fixture.MakeACommit(); + fixture.MergeTo("main"); + fixture.BranchTo("feature/foo"); + fixture.MakeACommit(); + fixture.MergeTo("main"); + + fixture.AssertFullSemver("1.1.0-4", configuration); + } + + [Test] + public void LatestMergedSourceResetDiscardsEarlierMergedIncrement() + { + var configuration = GitFlowConfigurationBuilder.New + .WithBranch("main", builder => builder + .WithIncrement(IncrementStrategy.Patch) + .WithPreventIncrementOfMergedBranch(true) + ).WithBranch("feature", builder => builder + .WithIncrement(IncrementStrategy.Patch) + ).WithBranch("hotfix", builder => builder + .WithIncrement(IncrementStrategy.Patch) + ).Build(); + + using var fixture = new EmptyRepositoryFixture("main"); + fixture.MakeATaggedCommit("1.0.0"); + fixture.BranchTo("feature/foo"); + fixture.MakeACommit("Breaking change +semver: major"); + fixture.MergeTo("main", removeBranchAfterMerging: true); + fixture.BranchTo("hotfix/foo"); + fixture.MakeACommit("Hotfix =semver: patch"); + fixture.MergeTo("main", removeBranchAfterMerging: true); + + fixture.AssertFullSemver("1.0.1-4", configuration); + } + + [Test] + public void NewerMergedSourceResetDiscardsEarlierTargetDirective() + { + var configuration = GitFlowConfigurationBuilder.New + .WithPreventIncrementWhenBranchMerged(null) + .WithBranch("main", builder => builder + .WithIncrement(IncrementStrategy.Patch) + .WithPreventIncrementOfMergedBranch(false) + ).WithBranch("hotfix", builder => builder + .WithIncrement(IncrementStrategy.Patch) + .WithPreventIncrementWhenBranchMerged(null) + ).Build(); + + using var fixture = new EmptyRepositoryFixture("main"); + fixture.MakeATaggedCommit("1.0.0"); + fixture.MakeACommit("Breaking change +semver: major"); + fixture.BranchTo("hotfix/foo"); + fixture.MakeACommit("Hotfix =semver: patch"); + fixture.MergeTo("main", removeBranchAfterMerging: true); + + fixture.AssertFullSemver("1.0.1-3", configuration); + } + + [TestCase(false)] + [TestCase(true)] + public void IncludesTargetIncrementForTargetCommit(bool commitAfterMerge) + { + var configuration = GitFlowConfigurationBuilder.New + .WithBranch("main", builder => builder + .WithIncrement(IncrementStrategy.Minor) + .WithPreventIncrementOfMergedBranch(true) + ).WithBranch("hotfix", builder => builder + .WithIncrement(IncrementStrategy.Patch) + ).Build(); + + using var fixture = new EmptyRepositoryFixture("main"); + fixture.MakeATaggedCommit("1.0.0"); + if (!commitAfterMerge) + { + fixture.MakeACommit(); + } + fixture.BranchTo("hotfix/foo"); + fixture.MakeACommit(); + fixture.MergeTo("main"); + if (commitAfterMerge) + { + fixture.MakeACommit(); + } + + fixture.AssertFullSemver("1.1.0-3", configuration); + } + + [Test] + public void IgnoresSourceCommitMessageWhenSourceIncrementIsPrevented() + { + var configuration = GitFlowConfigurationBuilder.New + .WithBranch("main", builder => builder + .WithIncrement(IncrementStrategy.Patch) + .WithPreventIncrementOfMergedBranch(true) + ).WithBranch("feature", builder => builder + .WithIncrement(IncrementStrategy.Minor) + .WithPreventIncrementWhenBranchMerged(true) + ).Build(); + + using var fixture = new EmptyRepositoryFixture("main"); + fixture.MakeATaggedCommit("1.0.0"); + fixture.BranchTo("feature/foo"); + fixture.MakeACommit("Breaking change +semver: major"); + fixture.MergeTo("main"); + + fixture.AssertFullSemver("1.0.1-2", configuration); + } + + [TestCase("Feature +semver: minor", "1.1.0-2")] + [TestCase("Feature =semver: patch", "1.0.1-2")] + public void UsesEffectiveSourceCommitMessageIncrement(string message, string expectedVersion) + { + var configuration = GitFlowConfigurationBuilder.New + .WithBranch("main", builder => builder + .WithIncrement(IncrementStrategy.Major) + .WithPreventIncrementOfMergedBranch(true) + ).WithBranch("feature", builder => builder + .WithIncrement(IncrementStrategy.Patch) + ).Build(); + + using var fixture = new EmptyRepositoryFixture("main"); + fixture.MakeATaggedCommit("1.0.0"); + fixture.BranchTo("feature/foo"); + fixture.MakeACommit(message); + fixture.MergeTo("main"); + + fixture.AssertFullSemver(expectedVersion, configuration); + } + + [Test] + public void ResolvesInheritedIncrementFromMergedBranchSource() + { + var configuration = GitFlowConfigurationBuilder.New + .WithBranch("main", builder => builder + .WithIncrement(IncrementStrategy.Patch) + .WithPreventIncrementOfMergedBranch(true) + ).WithBranch("develop", builder => builder + .WithIncrement(IncrementStrategy.Minor) + ).WithBranch("feature", builder => builder + .WithIncrement(IncrementStrategy.Inherit) + ).Build(); + + using var fixture = new EmptyRepositoryFixture("main"); + fixture.MakeATaggedCommit("1.0.0"); + fixture.BranchTo("develop"); + fixture.MakeACommit(); + fixture.BranchTo("feature/foo"); + fixture.MakeACommit(); + fixture.MergeTo("main", removeBranchAfterMerging: true); + + fixture.AssertFullSemver("1.1.0-3", configuration); + } + + [Test] + public void UsesInheritedPreventIncrementWhenBranchMergedSetting() + { + var configuration = GitFlowConfigurationBuilder.New + .WithPreventIncrementWhenBranchMerged(false) + .WithBranch("main", builder => builder + .WithIncrement(IncrementStrategy.Patch) + .WithPreventIncrementOfMergedBranch(true) + ).WithBranch("develop", builder => builder + .WithIncrement(IncrementStrategy.Minor) + .WithPreventIncrementWhenBranchMerged(true) + ).WithBranch("feature", builder => builder + .WithIncrement(IncrementStrategy.Inherit) + .WithPreventIncrementWhenBranchMerged(null) + ).Build(); + + using var fixture = new EmptyRepositoryFixture("main"); + fixture.MakeATaggedCommit("1.0.0"); + fixture.BranchTo("develop"); + fixture.MakeACommit(); + fixture.BranchTo("feature/foo"); + fixture.MakeACommit(); + fixture.MergeTo("main", removeBranchAfterMerging: true); + + fixture.AssertFullSemver("1.0.1-3", configuration); + } + + [Test] + public void ScoresLocalAndRemoteInheritedSourceBranchesBeforePreferringLocal() + { + var configuration = GitFlowConfigurationBuilder.New + .WithBranch("main", builder => builder + .WithIncrement(IncrementStrategy.Patch) + .WithPreventIncrementOfMergedBranch(true) + ).WithBranch("develop", builder => builder + .WithIncrement(IncrementStrategy.Minor) + ).WithBranch("integration", builder => builder + .WithRegularExpression("^(origin/)?integration$") + .WithIncrement(IncrementStrategy.Inherit) + .WithSourceBranches("main", "develop") + ).WithBranch("feature", builder => builder + .WithIncrement(IncrementStrategy.Inherit) + .WithSourceBranches("integration") + ).Build(); + + using var fixture = new EmptyRepositoryFixture("main"); + fixture.MakeATaggedCommit("1.0.0"); + fixture.BranchTo("develop"); + var developTip = fixture.MakeACommit(); + fixture.BranchTo("integration"); + fixture.MakeACommit(); + fixture.Repository.Refs.Add( + "refs/remotes/origin/integration", fixture.Repository.Lookup(developTip).Id); + fixture.BranchTo("feature/foo"); + fixture.MakeACommit(); + fixture.Checkout("main"); + fixture.Remove("integration"); + fixture.MakeACommit(); + fixture.BranchTo("integration"); + fixture.MakeACommit(); + fixture.Checkout("feature/foo"); + fixture.MergeTo("main", removeBranchAfterMerging: true); + + fixture.AssertFullSemver("1.1.0-5", configuration); + } + + [Test] + public void HonorsPreventIncrementForTaggedMergedSourceTip() + { + var configuration = GitFlowConfigurationBuilder.New + .WithBranch("main", builder => builder + .WithIncrement(IncrementStrategy.Patch) + .WithPreventIncrementOfMergedBranch(true) + ).WithBranch("hotfix", builder => builder + .WithIncrement(IncrementStrategy.Patch) + .WithPreventIncrementWhenCurrentCommitTagged(true) + ).Build(); + + using var fixture = new EmptyRepositoryFixture("main"); + fixture.MakeATaggedCommit("1.0.0"); + fixture.BranchTo("hotfix/foo"); + fixture.MakeATaggedCommit("2.0.0"); + fixture.MergeTo("main", removeBranchAfterMerging: true); + + fixture.AssertFullSemver("2.0.0-1", configuration); + } + + [Test] + public void TreatsSelectedSourceTipTagAsTaggedAcrossLabels() + { + var configuration = GitFlowConfigurationBuilder.New + .WithBranch("main", builder => builder + .WithIncrement(IncrementStrategy.Patch) + .WithPreventIncrementOfMergedBranch(true) + ).WithBranch("feature", builder => builder + .WithIncrement(IncrementStrategy.Minor) + .WithPreventIncrementWhenCurrentCommitTagged(true) + ).Build(); + + using var fixture = new EmptyRepositoryFixture("main"); + fixture.MakeATaggedCommit("1.0.0"); + fixture.BranchTo("feature/foo"); + fixture.MakeATaggedCommit("2.0.0"); + fixture.MergeTo("main", removeBranchAfterMerging: true); + + fixture.AssertFullSemver("2.0.0-1", configuration); + } + + [Test] + public void StopsUnrecognizedSideHistoryAtOffFirstParentBase() + { + var configuration = GitFlowConfigurationBuilder.New + .WithBranch("main", builder => builder + .WithIncrement(IncrementStrategy.Major) + .WithPreventIncrementOfMergedBranch(true) + ).WithBranch("hotfix", builder => builder + .WithIncrement(IncrementStrategy.Patch) + .WithPreventIncrementWhenCurrentCommitTagged(true) + ).Build(); + + using var fixture = new EmptyRepositoryFixture("main"); + fixture.MakeATaggedCommit("1.0.0"); + fixture.BranchTo("topic/foo"); + fixture.MakeACommit(); + fixture.Checkout("main"); + fixture.Repository.MergeNoFF("topic/foo", "Integrate topic"); + fixture.BranchTo("hotfix/foo"); + fixture.MakeATaggedCommit("2.0.0"); + fixture.MergeTo("main", removeBranchAfterMerging: true); + + fixture.AssertFullSemver("2.0.0-1", configuration); + } + + [Test] + public void IgnoresFutureDatedTagWhenEvaluatingMergedSourceMessages() + { + var configuration = GitFlowConfigurationBuilder.New + .WithBranch("main", builder => builder + .WithIncrement(IncrementStrategy.Patch) + .WithPreventIncrementOfMergedBranch(true) + .WithIsMainBranch(true) + .WithTrackMergeMessage(true) + ).WithBranch("feature", builder => builder + .WithIncrement(IncrementStrategy.Minor) + ).Build(); + + using var fixture = new EmptyRepositoryFixture("main"); + fixture.MakeATaggedCommit("1.0.0"); + fixture.BranchTo("feature/foo"); + fixture.MakeACommit("Breaking change +semver: major"); + var futureSignature = new Signature( + "A. U. Thor", "thor@valhalla.asgard.com", DateTimeOffset.Now.AddYears(10)); + var futureCommit = fixture.Repository.Commit( + "Breaking change +semver: major", futureSignature, futureSignature, + new CommitOptions { AmendPreviousCommit = true }); + fixture.ApplyTag("1.1.0"); + fixture.MergeTo("main", removeBranchAfterMerging: true); + var targetCommit = fixture.Repository.Head.Tip; + targetCommit.Parents.Count().ShouldBe(2); + futureCommit.Committer.When.ShouldBeGreaterThan(targetCommit.Committer.When); + + fixture.AssertFullSemver("2.0.0-2", configuration, commitId: targetCommit.Sha); + } + + [Test] + public void RetainsTargetAsPossibleHistoricalSourceBranch() + { + var configuration = GitFlowConfigurationBuilder.New + .WithBranch("main", builder => builder + .WithIncrement(IncrementStrategy.Patch) + .WithPreventIncrementOfMergedBranch(true) + ).WithBranch("develop", builder => builder + .WithIncrement(IncrementStrategy.Minor) + ).WithBranch("feature", builder => builder + .WithIncrement(IncrementStrategy.Inherit) + .WithSourceBranches("main", "develop") + ).Build(); + + using var fixture = new EmptyRepositoryFixture("main"); + fixture.MakeATaggedCommit("1.0.0"); + fixture.BranchTo("develop"); + fixture.MakeACommit(); + fixture.Checkout("main"); + fixture.MakeACommit(); + fixture.BranchTo("feature/foo"); + fixture.MakeACommit(); + fixture.MergeTo("main", removeBranchAfterMerging: true); + + fixture.AssertFullSemver("1.0.1-3", configuration); + } + + [Test] + public void ExcludesIgnoredBranchesFromHistoricalSourceInference() + { + var configuration = GitFlowConfigurationBuilder.New + .WithIgnoreConfiguration(new IgnoreConfiguration { Branches = ["^develop$"] }) + .WithBranch("main", builder => builder + .WithIncrement(IncrementStrategy.Patch) + .WithPreventIncrementOfMergedBranch(true) + ).WithBranch("develop", builder => builder + .WithIncrement(IncrementStrategy.Minor) + ).WithBranch("feature", builder => builder + .WithIncrement(IncrementStrategy.Inherit) + .WithSourceBranches("main", "develop") + ).Build(); + + using var fixture = new EmptyRepositoryFixture("main"); + fixture.MakeATaggedCommit("1.0.0"); + fixture.BranchTo("develop"); + fixture.MakeACommit(); + fixture.BranchTo("feature/foo"); + fixture.MakeACommit(); + fixture.MergeTo("main", removeBranchAfterMerging: true); + + fixture.AssertFullSemver("1.0.1-3", configuration); + } + + [Test] + public void RetainsIgnoredCurrentMainForMergedIncrementResolution() + { + var configuration = GitFlowConfigurationBuilder.New + .WithIgnoreConfiguration(new IgnoreConfiguration { Branches = ["^main$"] }) + .WithBranch("main", builder => builder + .WithIncrement(IncrementStrategy.Patch) + .WithPreventIncrementOfMergedBranch(true) + ).WithBranch("feature", builder => builder + .WithIncrement(IncrementStrategy.Minor) + ).Build(); + + using var fixture = new EmptyRepositoryFixture("main"); + fixture.MakeATaggedCommit("1.0.0"); + fixture.BranchTo("feature/foo"); + fixture.MakeACommit(); + fixture.MergeTo("main", removeBranchAfterMerging: true); + + fixture.AssertFullSemver("1.1.0-2", configuration); + } + + [Test] + public void HonorsInheritedMainBranchFlag() + { + var configuration = GitFlowConfigurationBuilder.New + .WithIsMainBranch(true) + .WithBranch("main", builder => builder + .WithIncrement(IncrementStrategy.Patch) + .WithPreventIncrementOfMergedBranch(true) + .WithIsMainBranch(null) + ).WithBranch("feature", builder => builder + .WithIncrement(IncrementStrategy.Minor) + .WithIsMainBranch(false) + ).Build(); + + using var fixture = new EmptyRepositoryFixture("main"); + fixture.MakeATaggedCommit("1.0.0"); + fixture.BranchTo("feature/foo"); + fixture.MakeACommit(); + fixture.MergeTo("main", removeBranchAfterMerging: true); + + fixture.AssertFullSemver("1.1.0-2", configuration); + } + + [Test] + public void HonorsMainBranchFlagInheritedFromSourceBranch() + { + var configuration = GitFlowConfigurationBuilder.New + .WithBranch("main", builder => builder + .WithIncrement(IncrementStrategy.Inherit) + .WithSourceBranches("develop") + .WithPreventIncrementOfMergedBranch(true) + .WithIsMainBranch(null) + ).WithBranch("develop", builder => builder + .WithIncrement(IncrementStrategy.Patch) + .WithIsMainBranch(true) + ).WithBranch("feature", builder => builder + .WithIncrement(IncrementStrategy.Minor) + .WithIsMainBranch(false) + ).Build(); + + using var fixture = new EmptyRepositoryFixture("main"); + fixture.MakeATaggedCommit("1.0.0"); + fixture.CreateBranch("develop"); + fixture.BranchTo("feature/foo"); + fixture.MakeACommit(); + fixture.MergeTo("main", removeBranchAfterMerging: true); + + fixture.AssertFullSemver("1.1.0-2", configuration); + } + + [Test] + public void RetainsIgnoredCurrentTargetAsHistoricalSource() + { + var configuration = GitFlowConfigurationBuilder.New + .WithIgnoreConfiguration(new IgnoreConfiguration { Branches = ["^main$"] }) + .WithBranch("main", builder => builder + .WithIncrement(IncrementStrategy.Patch) + .WithPreventIncrementOfMergedBranch(true) + ).WithBranch("develop", builder => builder + .WithIncrement(IncrementStrategy.Minor) + ).WithBranch("feature", builder => builder + .WithIncrement(IncrementStrategy.Inherit) + .WithSourceBranches("main", "develop") + ).Build(); + + using var fixture = new EmptyRepositoryFixture("main"); + fixture.MakeATaggedCommit("1.0.0"); + fixture.CreateBranch("develop"); + fixture.MakeACommit(); + fixture.BranchTo("feature/foo"); + fixture.MakeACommit(); + fixture.MergeTo("main", removeBranchAfterMerging: true); + + fixture.AssertFullSemver("1.0.1-3", configuration); + } + + [Test] + public void RetainsIgnoredHistoricalMainAsSourceOnLinearDescendant() + { + var configuration = GitFlowConfigurationBuilder.New + .WithIgnoreConfiguration(new IgnoreConfiguration { Branches = ["^main$"] }) + .WithBranch("main", builder => builder + .WithIncrement(IncrementStrategy.Patch) + .WithPreventIncrementOfMergedBranch(true) + ).WithBranch("develop", builder => builder + .WithIncrement(IncrementStrategy.Minor) + ).WithBranch("feature", builder => builder + .WithIncrement(IncrementStrategy.Inherit) + .WithSourceBranches("main", "develop") + ).WithBranch("child", builder => builder + .WithRegularExpression("^child$") + .WithLabel(string.Empty) + .WithIncrement(IncrementStrategy.Patch) + .WithSourceBranches("main") + .WithPreventIncrementOfMergedBranch(true) + ).Build(); + + using var fixture = new EmptyRepositoryFixture("main"); + fixture.MakeATaggedCommit("1.0.0"); + fixture.CreateBranch("develop"); + fixture.MakeACommit(); + fixture.BranchTo("feature/foo"); + fixture.MakeACommit(); + fixture.MergeTo("main", removeBranchAfterMerging: true); + fixture.BranchTo("child"); + fixture.MakeACommit(); + + fixture.AssertFullSemver("1.0.1-4", configuration); + } + + [Test] + public void RetainsMergedIncrementAfterMergingMainIntoDescendant() + { + var configuration = GitFlowConfigurationBuilder.New + .WithIsMainBranch(true) + .WithBranch("main", builder => builder + .WithIncrement(IncrementStrategy.Patch) + .WithPreventIncrementOfMergedBranch(true) + .WithPreventIncrementWhenBranchMerged(true) + .WithIsMainBranch(null) + ).WithBranch("release", builder => builder + .WithIncrement(IncrementStrategy.Minor) + .WithIsMainBranch(false) + ).WithBranch("feature", builder => builder + .WithIncrement(IncrementStrategy.Patch) + .WithIsMainBranch(false) + ).Build(); + + using var fixture = new EmptyRepositoryFixture("main"); + fixture.MakeATaggedCommit("1.0.0"); + fixture.BranchTo("feature/foo"); + fixture.MakeACommit(); + fixture.Checkout("main"); + fixture.BranchTo("release/minor"); + fixture.MakeACommit(); + fixture.MergeTo("main", removeBranchAfterMerging: true); + fixture.AssertFullSemver("1.1.0-2", configuration); + fixture.Checkout("feature/foo"); + fixture.MergeNoFF("main"); + + fixture.AssertFullSemver("1.1.0-foo.1+4", configuration); + } + + [Test] + public void RejectsUnrelatedMergeBeforeMergingMainIntoDescendant() + { + var configuration = GitFlowConfigurationBuilder.New + .WithBranch("main", builder => builder + .WithIncrement(IncrementStrategy.Patch) + .WithPreventIncrementOfMergedBranch(true) + ).WithBranch("release", builder => builder + .WithIncrement(IncrementStrategy.Minor) + ).WithBranch("feature", builder => builder + .WithIncrement(IncrementStrategy.Patch) + ).Build(); + + using var fixture = new EmptyRepositoryFixture("main"); + fixture.MakeATaggedCommit("1.0.0"); + fixture.BranchTo("feature/foo"); + fixture.MakeACommit(); + fixture.Checkout("main"); + fixture.BranchTo("release/minor"); + fixture.MakeACommit(); + fixture.MergeTo("main", removeBranchAfterMerging: true); + fixture.Checkout("feature/foo"); + fixture.BranchTo("feature/side"); + fixture.MakeACommit(); + fixture.MergeTo("feature/foo", removeBranchAfterMerging: true); + fixture.MergeNoFF("main"); + + fixture.AssertFullSemver("1.0.1-foo.1+6", configuration); + } + + [Test] + public void StopsMergedSourceContributionsAtInterveningTargetTag() + { + var configuration = GitFlowConfigurationBuilder.New + .WithBranch("main", builder => builder + .WithIncrement(IncrementStrategy.Patch) + .WithPreventIncrementOfMergedBranch(true) + ).WithBranch("feature", builder => builder + .WithIncrement(IncrementStrategy.Patch) + ).WithBranch("hotfix", builder => builder + .WithIncrement(IncrementStrategy.Patch) + ).Build(); + + using var fixture = new EmptyRepositoryFixture("main"); + fixture.MakeATaggedCommit("2.0.0"); + fixture.BranchTo("feature/foo"); + fixture.MakeACommit("Breaking change +semver: major"); + fixture.MergeTo("main", removeBranchAfterMerging: true); + fixture.ApplyTag("1.0.0"); + fixture.BranchTo("hotfix/foo"); + fixture.MakeACommit("Hotfix +semver: patch"); + fixture.MergeTo("main", removeBranchAfterMerging: true); + + fixture.AssertFullSemver("2.0.1-4", configuration); + } + + [Test] + public void SkipsTargetSegmentsPrunedByInterveningTag() + { + var configuration = GitFlowConfigurationBuilder.New + .WithBranch("main", builder => builder + .WithIncrement(IncrementStrategy.Major) + .WithPreventIncrementOfMergedBranch(true) + ).WithBranch("hotfix", builder => builder + .WithIncrement(IncrementStrategy.Patch) + ).Build(); + + using var fixture = new EmptyRepositoryFixture("main"); + fixture.MakeATaggedCommit("2.0.0"); + fixture.MakeACommit(); + fixture.ApplyTag("1.0.0"); + fixture.BranchTo("hotfix/foo"); + fixture.MakeACommit(); + fixture.MergeTo("main", removeBranchAfterMerging: true); + + fixture.AssertFullSemver("2.0.1-3", configuration); + } + + [Test] + public void PreservesCommitMessageDirectivesFromUnrecognizedMergedHistory() + { + var configuration = GitFlowConfigurationBuilder.New + .WithBranch("main", builder => builder + .WithIncrement(IncrementStrategy.Patch) + .WithPreventIncrementOfMergedBranch(true) + ).WithBranch("hotfix", builder => builder + .WithIncrement(IncrementStrategy.Patch) + ).Build(); + + using var fixture = new EmptyRepositoryFixture("main"); + fixture.MakeATaggedCommit("1.0.0"); + fixture.BranchTo("topic/foo"); + fixture.MakeACommit("Breaking change +semver: major"); + fixture.Checkout("main"); + fixture.Repository.MergeNoFF("topic/foo", "Integrate topic"); + fixture.BranchTo("hotfix/foo"); + fixture.MakeACommit(); + fixture.MergeTo("main", removeBranchAfterMerging: true); + + fixture.AssertFullSemver("2.0.0-4", configuration); + } + + [Test] + public void PreservesCommitOrderAcrossUnrecognizedMergedHistory() + { + var configuration = GitFlowConfigurationBuilder.New + .WithBranch("main", builder => builder + .WithIncrement(IncrementStrategy.Patch) + .WithPreventIncrementOfMergedBranch(true) + ).WithBranch("hotfix", builder => builder + .WithIncrement(IncrementStrategy.Patch) + ).Build(); + + using var fixture = new EmptyRepositoryFixture("main"); + fixture.MakeATaggedCommit("1.0.0"); + fixture.BranchTo("topic/foo"); + fixture.MakeACommit("Reset to patch =semver: patch"); + fixture.Checkout("main"); + fixture.MakeACommit("Breaking change +semver: major"); + fixture.Repository.MergeNoFF("topic/foo", "Integrate topic"); + fixture.BranchTo("hotfix/foo"); + fixture.MakeACommit(); + fixture.MergeTo("main", removeBranchAfterMerging: true); + + fixture.AssertFullSemver("2.0.0-5", configuration); + } + + [Test] + public void PreservesCommitOrderAcrossRecognizedMergeBoundary() + { + var configuration = GitFlowConfigurationBuilder.New + .WithBranch("main", builder => builder + .WithIncrement(IncrementStrategy.Patch) + .WithPreventIncrementOfMergedBranch(true) + ).WithBranch("feature", builder => builder + .WithIncrement(IncrementStrategy.Major) + ).Build(); + + using var fixture = new EmptyRepositoryFixture("main"); + fixture.MakeATaggedCommit("1.0.0"); + fixture.BranchTo("topic/foo"); + fixture.MakeACommit("Reset to patch =semver: patch"); + fixture.Checkout("main"); + fixture.BranchTo("feature/foo"); + fixture.MakeACommit(); + fixture.MergeTo("main", removeBranchAfterMerging: true); + fixture.Repository.MergeNoFF("topic/foo", "Integrate topic"); + + fixture.AssertFullSemver("2.0.0-4", configuration); + } + + [Test] + public void PreservesSideHistoryOfIgnoredUnrecognizedMerge() + { + using var fixture = new EmptyRepositoryFixture("main"); + fixture.MakeATaggedCommit("1.0.0"); + fixture.BranchTo("topic/foo"); + fixture.MakeACommit("Breaking change +semver: major"); + fixture.Checkout("main"); + fixture.Repository.MergeNoFF("topic/foo", "Integrate topic"); + var ignoredMerge = fixture.Repository.Head.Tip; + fixture.BranchTo("hotfix/foo"); + fixture.MakeACommit(); + fixture.MergeTo("main", removeBranchAfterMerging: true); + + var configuration = GitFlowConfigurationBuilder.New + .WithIgnoreConfiguration(new IgnoreConfiguration { Shas = [ignoredMerge.Sha] }) + .WithBranch("main", builder => builder + .WithIncrement(IncrementStrategy.Patch) + .WithPreventIncrementOfMergedBranch(true) + ).WithBranch("hotfix", builder => builder + .WithIncrement(IncrementStrategy.Patch) + ).Build(); + + fixture.AssertFullSemver("2.0.0-3", configuration); + } + + [Test] + public void ResolvesInheritedIncrementFromHistoricalMergedBranchTip() + { + var configuration = GitFlowConfigurationBuilder.New + .WithBranch("main", builder => builder + .WithIncrement(IncrementStrategy.Patch) + .WithPreventIncrementOfMergedBranch(true) + ).WithBranch("develop", builder => builder + .WithIncrement(IncrementStrategy.Minor) + ).WithBranch("feature", builder => builder + .WithIncrement(IncrementStrategy.Inherit) + ).Build(); + + using var fixture = new EmptyRepositoryFixture("main"); + fixture.MakeATaggedCommit("1.0.0"); + fixture.BranchTo("develop"); + fixture.MakeACommit(); + fixture.BranchTo("feature/foo"); + fixture.MakeACommit(); + fixture.MergeTo("main", removeBranchAfterMerging: true); + fixture.BranchTo("feature/foo"); + fixture.MakeACommit(); + fixture.Checkout("main"); + + fixture.AssertFullSemver("1.1.0-3", configuration); + } + + [Test] + public void PrefersHistoricalSourceOverLaterAbsorbingBranch() + { + var configuration = GitFlowConfigurationBuilder.New + .WithBranch("main", builder => builder + .WithIncrement(IncrementStrategy.Patch) + .WithPreventIncrementOfMergedBranch(true) + ).WithBranch("develop", builder => builder + .WithIncrement(IncrementStrategy.Minor) + ).WithBranch("support", builder => builder + .WithRegularExpression("^support$") + .WithIncrement(IncrementStrategy.Major) + ).WithBranch("feature", builder => builder + .WithIncrement(IncrementStrategy.Inherit) + .WithSourceBranches("develop", "support") + ).Build(); + + using var fixture = new EmptyRepositoryFixture("main"); + fixture.MakeATaggedCommit("1.0.0"); + fixture.CreateBranch("support"); + fixture.BranchTo("develop"); + fixture.MakeACommit(); + fixture.BranchTo("feature/foo"); + fixture.MakeACommit(); + fixture.MergeTo("main"); + fixture.Checkout("feature/foo"); + fixture.MergeTo("support", removeBranchAfterMerging: true); + fixture.Checkout("main"); + + fixture.AssertFullSemver("1.1.0-3", configuration); + } + + [Test] + public void ResolvesRetainedInheritedBranchFromHistoricalSource() + { + var configuration = GitFlowConfigurationBuilder.New + .WithBranch("main", builder => builder + .WithIncrement(IncrementStrategy.Patch) + .WithPreventIncrementOfMergedBranch(true) + ).WithBranch("develop", builder => builder + .WithIncrement(IncrementStrategy.Minor) + ).WithBranch("support", builder => builder + .WithRegularExpression("^support$") + .WithIncrement(IncrementStrategy.Major) + ).WithBranch("feature", builder => builder + .WithIncrement(IncrementStrategy.Inherit) + .WithSourceBranches("develop", "support") + ).Build(); + + using var fixture = new EmptyRepositoryFixture("main"); + fixture.MakeATaggedCommit("1.0.0"); + fixture.CreateBranch("support"); + fixture.BranchTo("develop"); + fixture.MakeACommit(); + fixture.BranchTo("feature/foo"); + fixture.MakeACommit(); + fixture.MergeTo("main"); + fixture.Checkout("feature/foo"); + fixture.MergeTo("support"); + fixture.Checkout("main"); + + fixture.AssertFullSemver("1.1.0-3", configuration); + } + + [TestCase(false)] + [TestCase(true)] + public void UsesGlobalFallbackForOrphanedInheritedSource(bool removeBranchAfterMerging) + { + var configuration = GitFlowConfigurationBuilder.New + .WithIncrement(IncrementStrategy.Minor) + .WithBranch("main", builder => builder + .WithIncrement(IncrementStrategy.Patch) + .WithPreventIncrementOfMergedBranch(true) + ).WithBranch("topic", builder => builder + .WithRegularExpression("^topics?[/-](?.+)") + .WithIncrement(IncrementStrategy.Inherit) + .WithSourceBranches() + ).Build(); + + using var fixture = new EmptyRepositoryFixture("main"); + fixture.MakeATaggedCommit("1.0.0"); + fixture.BranchTo("topic/foo"); + fixture.MakeACommit(); + fixture.MergeTo("main", removeBranchAfterMerging); + + fixture.AssertFullSemver("1.1.0-2", configuration); + } + + [Test] + public void SkipsUnresolvedFallbackForOrphanedInheritedSource() + { + var configuration = GitFlowConfigurationBuilder.New + .WithBranch("main", builder => builder + .WithIncrement(IncrementStrategy.Patch) + .WithPreventIncrementOfMergedBranch(true) + ).WithBranch("topic", builder => builder + .WithRegularExpression("^topics?[/-](?.+)") + .WithIncrement(IncrementStrategy.Inherit) + .WithSourceBranches() + ).Build(); + + using var fixture = new EmptyRepositoryFixture("main"); + fixture.MakeATaggedCommit("1.0.0"); + fixture.BranchTo("topic/foo"); + fixture.MakeACommit(); + fixture.MergeTo("main", removeBranchAfterMerging: true); + + fixture.AssertFullSemver("1.0.1-2", configuration); + } + + [Test] + public void ResolvesNestedInheritanceFromHistoricalSourceState() + { + var configuration = GitFlowConfigurationBuilder.New + .WithBranch("main", builder => builder + .WithIncrement(IncrementStrategy.Patch) + .WithPreventIncrementOfMergedBranch(true) + ).WithBranch("develop", builder => builder + .WithIncrement(IncrementStrategy.Minor) + ).WithBranch("support", builder => builder + .WithRegularExpression("^support$") + .WithIncrement(IncrementStrategy.Major) + ).WithBranch("integration", builder => builder + .WithRegularExpression("^integration$") + .WithIncrement(IncrementStrategy.Inherit) + .WithSourceBranches("develop", "support") + ).WithBranch("feature", builder => builder + .WithIncrement(IncrementStrategy.Inherit) + .WithSourceBranches("integration") + ).Build(); + + using var fixture = new EmptyRepositoryFixture("main"); + fixture.MakeATaggedCommit("1.0.0"); + fixture.CreateBranch("support"); + fixture.BranchTo("develop"); + fixture.MakeACommit(); + fixture.BranchTo("integration"); + fixture.MakeACommit(); + fixture.BranchTo("feature/foo"); + fixture.MakeACommit(); + fixture.MergeTo("main", removeBranchAfterMerging: true); + fixture.Checkout("support"); + fixture.MakeACommit(); + fixture.MergeTo("integration"); + fixture.Checkout("main"); + + fixture.AssertFullSemver("1.1.0-4", configuration); + } + + [Test] + public void ResolvesAllSiblingHistoricalInheritancePaths() + { + var configuration = GitFlowConfigurationBuilder.New + .WithBranch("main", builder => builder + .WithIncrement(IncrementStrategy.Patch) + .WithPreventIncrementOfMergedBranch(true) + ).WithBranch("develop", builder => builder + .WithIncrement(IncrementStrategy.Minor) + ).WithBranch("integration-a", builder => builder + .WithRegularExpression("^integration-a$") + .WithIncrement(IncrementStrategy.Inherit) + .WithSourceBranches("develop") + .WithPreventIncrementWhenBranchMerged(true) + ).WithBranch("integration-b", builder => builder + .WithRegularExpression("^integration-b$") + .WithIncrement(IncrementStrategy.Inherit) + .WithSourceBranches("develop") + .WithPreventIncrementWhenBranchMerged(false) + ).WithBranch("aggregate", builder => builder + .WithRegularExpression("^aggregate$") + .WithIncrement(IncrementStrategy.Inherit) + .WithSourceBranches("integration-a", "integration-b") + ).WithBranch("feature", builder => builder + .WithIncrement(IncrementStrategy.Inherit) + .WithSourceBranches("aggregate") + ).Build(); + + using var fixture = new EmptyRepositoryFixture("main"); + fixture.MakeATaggedCommit("1.0.0"); + fixture.BranchTo("develop"); + fixture.MakeACommit(); + fixture.CreateBranch("integration-a"); + fixture.CreateBranch("integration-b"); + fixture.BranchTo("aggregate"); + fixture.BranchTo("feature/foo"); + fixture.MakeACommit(); + fixture.MergeTo("main", removeBranchAfterMerging: true); + fixture.Checkout("aggregate"); + fixture.MakeACommit(); + fixture.Checkout("main"); + + fixture.AssertFullSemver("1.1.0-3", configuration); + } + + [Test] + public void ResolvesAllSiblingInheritancePathsForRetainedTip() + { + var configuration = GitFlowConfigurationBuilder.New + .WithBranch("main", builder => builder + .WithIncrement(IncrementStrategy.Patch) + .WithPreventIncrementOfMergedBranch(true) + ).WithBranch("develop", builder => builder + .WithIncrement(IncrementStrategy.Minor) + ).WithBranch("integration-a", builder => builder + .WithRegularExpression("^integration-a$") + .WithIncrement(IncrementStrategy.Inherit) + .WithSourceBranches("develop") + .WithPreventIncrementWhenBranchMerged(true) + ).WithBranch("integration-b", builder => builder + .WithRegularExpression("^integration-b$") + .WithIncrement(IncrementStrategy.Inherit) + .WithSourceBranches("develop") + .WithPreventIncrementWhenBranchMerged(false) + ).WithBranch("aggregate", builder => builder + .WithRegularExpression("^aggregate$") + .WithIncrement(IncrementStrategy.Inherit) + .WithSourceBranches("integration-a", "integration-b") + ).Build(); + + using var fixture = new EmptyRepositoryFixture("main"); + fixture.MakeATaggedCommit("1.0.0"); + fixture.BranchTo("develop"); + fixture.MakeACommit(); + fixture.CreateBranch("integration-a"); + fixture.CreateBranch("integration-b"); + fixture.BranchTo("aggregate"); + fixture.MakeACommit(); + fixture.MergeTo("main"); + + fixture.AssertFullSemver("1.1.0-3", configuration); + } +} diff --git a/src/GitVersion.Core.Tests/IntegrationTests/PullRequestScenarios.cs b/src/GitVersion.Core.Tests/IntegrationTests/PullRequestScenarios.cs index 17cba2fa5a..8aa715a36a 100644 --- a/src/GitVersion.Core.Tests/IntegrationTests/PullRequestScenarios.cs +++ b/src/GitVersion.Core.Tests/IntegrationTests/PullRequestScenarios.cs @@ -49,7 +49,7 @@ public void EnsurePullRequestWithIncrementMajorOnMainAndMinorOnFeatureBranch() fixture.MergeNoFF("feature/foo"); // ✅ succeeds as expected - fixture.AssertFullSemver("2.0.0-2", configuration); + fixture.AssertFullSemver("1.1.0-2", configuration); } [Test] diff --git a/src/GitVersion.Core.Tests/IntegrationTests/VersionInMergedBranchNameScenarios.cs b/src/GitVersion.Core.Tests/IntegrationTests/VersionInMergedBranchNameScenarios.cs index 90830d7144..fc27d1c515 100644 --- a/src/GitVersion.Core.Tests/IntegrationTests/VersionInMergedBranchNameScenarios.cs +++ b/src/GitVersion.Core.Tests/IntegrationTests/VersionInMergedBranchNameScenarios.cs @@ -25,9 +25,9 @@ public void DoesNotTakeVersionFromNameOfNonReleaseBranch() fixture.AssertFullSemver("1.1.0-alpha.5"); } - [TestCase("release")] - [TestCase("hotfix")] - public void DoesNotTakeVersionFromBranchWithAccidentalVersion(string branch) + [TestCase("release", "1.1.0-2")] + [TestCase("hotfix", "1.0.1-2")] + public void DoesNotTakeVersionFromBranchWithAccidentalVersion(string branch, string expectedVersion) { using var fixture = new EmptyRepositoryFixture(); @@ -37,7 +37,7 @@ public void DoesNotTakeVersionFromBranchWithAccidentalVersion(string branch) fixture.Checkout("main"); fixture.MergeNoFF($"{branch}/downgrade-some-lib-to-3.2.1"); - fixture.AssertFullSemver("1.0.1-2"); + fixture.AssertFullSemver(expectedVersion); } [Test] diff --git a/src/GitVersion.Core.Tests/VersionCalculation/IncrementStrategyFinderTests.cs b/src/GitVersion.Core.Tests/VersionCalculation/IncrementStrategyFinderTests.cs new file mode 100644 index 0000000000..903c41e48e --- /dev/null +++ b/src/GitVersion.Core.Tests/VersionCalculation/IncrementStrategyFinderTests.cs @@ -0,0 +1,38 @@ +using GitVersion.Configuration; +using GitVersion.Git; +using GitVersion.VersionCalculation; + +namespace GitVersion.Tests.VersionCalculation; + +[TestFixture] +[Parallelizable(ParallelScope.All)] +public class IncrementStrategyFinderTests +{ + [Test] + public void ParsesCachedCommitWithTheRequestedConfiguration() + { + var commit = Substitute.For(); + commit.Sha.Returns("0123456789012345678901234567890123456789"); + commit.Message.Returns("feature: custom increment"); + + var repositoryStore = Substitute.For(); + var finder = new IncrementStrategyFinder( + new(() => throw new InvalidOperationException()), + repositoryStore, + new TaggedSemanticVersionRepository( + NullLogger.Instance, repositoryStore), + Substitute.For(), + Substitute.For()); + var nonMatchingConfiguration = GitFlowConfigurationBuilder.New + .WithMinorVersionBumpMessage("^minor:") + .Build(); + var matchingConfiguration = GitFlowConfigurationBuilder.New + .WithMinorVersionBumpMessage("^feature:") + .Build(); + + finder.GetIncrementForcedByCommit(commit, nonMatchingConfiguration).Increment + .ShouldBe(VersionField.None); + finder.GetIncrementForcedByCommit(commit, matchingConfiguration).Increment + .ShouldBe(VersionField.Minor); + } +} diff --git a/src/GitVersion.Core/VersionCalculation/EffectiveBranchConfigurationFinder.cs b/src/GitVersion.Core/VersionCalculation/EffectiveBranchConfigurationFinder.cs index b66c6af3ec..feac386118 100644 --- a/src/GitVersion.Core/VersionCalculation/EffectiveBranchConfigurationFinder.cs +++ b/src/GitVersion.Core/VersionCalculation/EffectiveBranchConfigurationFinder.cs @@ -64,7 +64,9 @@ private IEnumerable GetEffectiveConfigurationsRecu foreach (var sourceBranch in sourceBranches) { foreach (var effectiveConfiguration - in GetEffectiveConfigurationsRecursive(sourceBranch, configuration, branchConfiguration, traversedBranches, resolvePullRequestTarget: false)) + in GetEffectiveConfigurationsRecursive( + sourceBranch, configuration, branchConfiguration, + new(traversedBranches, traversedBranches.Comparer), resolvePullRequestTarget: false)) { yield return effectiveConfiguration; } diff --git a/src/GitVersion.Core/VersionCalculation/IncrementStrategyFinder.cs b/src/GitVersion.Core/VersionCalculation/IncrementStrategyFinder.cs index 4b35dabb2d..b300900449 100644 --- a/src/GitVersion.Core/VersionCalculation/IncrementStrategyFinder.cs +++ b/src/GitVersion.Core/VersionCalculation/IncrementStrategyFinder.cs @@ -6,16 +6,30 @@ namespace GitVersion.VersionCalculation; internal class IncrementStrategyFinder( + Lazy contextLazy, IRepositoryStore repositoryStore, - ITaggedSemanticVersionRepository taggedSemanticVersionRepository) + ITaggedSemanticVersionRepository taggedSemanticVersionRepository, + IEffectiveBranchConfigurationFinder effectiveBranchConfigurationFinder, + IEnvironment environment) : IIncrementStrategyFinder { - private readonly Dictionary commitIncrementCache = []; + private readonly Dictionary commitIncrementCache = []; + private readonly Dictionary<(string Commit, bool IsMergedTipBaseVersionSource, EffectiveConfiguration Target), + MergedBranchIncrement[]> mergedBranchIncrementCache = []; + private readonly Dictionary<(string Branch, string? Tip), EffectiveConfiguration[]> effectiveConfigurationCache = []; + private readonly Dictionary> firstParentHistoryCache = []; private readonly Dictionary> headCommitsMapCache = []; private readonly Dictionary headCommitsCache = []; + private readonly Dictionary<(string Commit, EffectiveConfiguration Target), bool> compatibleMainBranchHistoryCache = []; + private readonly Dictionary> reachableCommitCache = []; + private readonly Lazy contextLazy = contextLazy.NotNull(); private readonly IRepositoryStore repositoryStore = repositoryStore.NotNull(); private readonly ITaggedSemanticVersionRepository taggedSemanticVersionRepository = taggedSemanticVersionRepository.NotNull(); + private readonly IEffectiveBranchConfigurationFinder effectiveBranchConfigurationFinder = effectiveBranchConfigurationFinder.NotNull(); + private readonly IEnvironment environment = environment.NotNull(); + + private GitVersionContext Context => this.contextLazy.Value; public VersionField DetermineIncrementedField( ICommit currentCommit, ICommit? baseVersionSource, bool shouldIncrement, EffectiveConfiguration configuration, string? label) @@ -23,14 +37,39 @@ public VersionField DetermineIncrementedField( currentCommit.NotNull(); configuration.NotNull(); - var commitMessageIncrement = FindCommitMessageIncrement(configuration, baseVersionSource, currentCommit, label); + var targetIncrement = DetermineIncrementedFieldInternal( + currentCommit, baseVersionSource, shouldIncrement, configuration, label); + + if (!configuration.TrackMergeMessage || !HasCompatibleMainBranchHistory(currentCommit, configuration)) + { + return targetIncrement.Increment; + } + + var increments = GetIncrementsFromCommitHistory( + currentCommit, baseVersionSource, shouldIncrement, configuration, label, targetIncrement); + return ConsolidateIncrements(increments, targetIncrement).Increment; + } + + private CommitMessageIncrement DetermineIncrementedFieldInternal( + ICommit currentCommit, ICommit? baseVersionSource, bool shouldIncrement, + EffectiveConfiguration configuration, string? label, + IReadOnlySet? includedCommits = null) + { + var commitMessageIncrement = FindCommitMessageIncrement( + configuration, baseVersionSource, currentCommit, label, includedCommits); + return DetermineIncrementedField(commitMessageIncrement, shouldIncrement, configuration); + } + + private static CommitMessageIncrement DetermineIncrementedField( + CommitMessageIncrement? commitMessageIncrement, bool shouldIncrement, EffectiveConfiguration configuration) + { var defaultIncrement = configuration.Increment.ToVersionField(); // use the default branch configuration increment strategy if there are no commit message overrides if (commitMessageIncrement == null) { - return shouldIncrement ? defaultIncrement : VersionField.None; + return new(shouldIncrement ? defaultIncrement : VersionField.None, VersionBumpNeedsToBeReset: false); } // don't increment for less than the branch configuration increment, if the absence of commit messages would have @@ -38,12 +77,569 @@ public VersionField DetermineIncrementedField( if (shouldIncrement && !commitMessageIncrement.Value.VersionBumpNeedsToBeReset && commitMessageIncrement.Value.Increment < defaultIncrement) { - return defaultIncrement; + return new(defaultIncrement, VersionBumpNeedsToBeReset: false); + } + + return commitMessageIncrement.Value; + } + + private IEnumerable GetIncrementsFromCommitHistory( + ICommit currentCommit, ICommit? baseVersionSource, bool shouldIncrement, + EffectiveConfiguration targetConfiguration, string? targetLabel, CommitMessageIncrement targetIncrement) + { + var commitLog = this.repositoryStore + .GetCommitLog(baseVersionSource, currentCommit, targetConfiguration.Ignore); + var includedCommits = commitLog.Select(commit => commit.Sha).ToHashSet(); + var history = GetFirstParentCommitHistory( + currentCommit, baseVersionSource, targetConfiguration, includedCommits).ToArray(); + + if (!history.Any(item => item.MergedBranch is not null)) + { + yield return targetIncrement; + yield break; + } + + var targetCommitHistory = GetCommitHistory( + targetConfiguration.TagPrefixPattern, + targetConfiguration.SemanticVersionFormat, + baseVersionSource, + currentCommit, + targetLabel, + targetConfiguration.Ignore) + .Select(commit => commit.Sha) + .ToHashSet(); + var commitOrder = commitLog + .Select((commit, index) => (commit.Sha, Index: index)) + .ToDictionary(item => item.Sha, item => item.Index); + var orderedHistory = history + .SelectMany(entry => entry.MergedBranch is not null + ? [new IncrementHistoryEntry(entry.Commit, entry.MergedBranch)] + : entry.TargetCommits.Select(commit => new IncrementHistoryEntry(commit, MergedBranch: null))) + .Where(entry => targetCommitHistory.Contains(entry.Commit.Sha)) + .GroupBy(entry => entry.Commit.Sha) + .Select(group => group.OrderByDescending(entry => entry.MergedBranch is not null).First()) + .OrderBy(entry => commitOrder[entry.Commit.Sha]); + var defaultTargetIncrement = DetermineIncrementedField( + commitMessageIncrement: null, shouldIncrement, targetConfiguration).Increment; + List targetSegment = []; + + foreach (var entry in orderedHistory) + { + if (entry.MergedBranch is not { } mergedBranch) + { + targetSegment.Add(entry.Commit); + continue; + } + + if (targetSegment.Count != 0) + { + yield return GetTargetIncrement( + targetSegment, targetCommitHistory, commitOrder, shouldIncrement, targetConfiguration); + targetSegment.Clear(); + } + + var targetMergeMessageIncrement = FindCommitMessageIncrement( + targetConfiguration, [entry.Commit], targetCommitHistory); + if (targetMergeMessageIncrement is not null) + { + yield return DetermineIncrementedField( + targetMergeMessageIncrement, shouldIncrement, targetConfiguration); + } + + var sourceIncrements = GetMergedBranchIncrements( + entry.Commit, mergedBranch, baseVersionSource, targetConfiguration); + if (sourceIncrements.Length != 0) + { + yield return ConsolidateMergedBranchIncrements( + sourceIncrements, targetConfiguration, defaultTargetIncrement); + } + } + + if (targetSegment.Count != 0) + { + yield return GetTargetIncrement( + targetSegment, targetCommitHistory, commitOrder, shouldIncrement, targetConfiguration); + } + } + + private IEnumerable GetFirstParentCommitHistory( + ICommit currentCommit, ICommit? baseVersionSource, EffectiveConfiguration targetConfiguration, + IReadOnlySet includedCommits) + { + var commitsReachableFromBase = GetReachableCommitShas(baseVersionSource); + for (ICommit? commit = currentCommit; commit is not null; commit = commit.Parents.FirstOrDefault()) + { + if (commitsReachableFromBase.Contains(commit.Sha)) + { + yield break; + } + + var isCommitIncluded = includedCommits.Contains(commit.Sha); + ReferenceName? mergedBranch = null; + if (isCommitIncluded + && commit.IsMergeCommit + && commit.Parents.Count == 2 + && MergeMessage.TryParse(commit, Context.Configuration, out var mergeMessage)) + { + mergedBranch = mergeMessage.MergedBranch; + } + + ICommit[] targetCommits = isCommitIncluded ? [commit] : []; + if (commit.IsMergeCommit && mergedBranch is null) + { + var firstParent = commit.Parents[0]; + targetCommits = + [ + .. targetCommits, + .. commit.Parents.Skip(1) + .SelectMany(parent => this.repositoryStore.GetCommitLog( + firstParent, parent, targetConfiguration.Ignore)) + .DistinctBy(parent => parent.Sha) + ]; + } + + if (targetCommits.Length == 0) + { + continue; + } + + yield return new(commit, mergedBranch, targetCommits); + } + } + + private HashSet GetReachableCommitShas(ICommit? commit) + { + if (commit is null) + { + return []; + } + + return this.reachableCommitCache.GetOrAdd(commit.Sha, () => + { + HashSet result = []; + var pending = new Stack(); + pending.Push(commit); + + while (pending.TryPop(out var current)) + { + if (!result.Add(current.Sha)) + { + continue; + } + + foreach (var parent in current.Parents) + { + pending.Push(parent); + } + } + + return result; + }); + } + + private CommitMessageIncrement GetTargetIncrement( + IEnumerable targetCommits, IReadOnlySet targetCommitHistory, + IReadOnlyDictionary commitOrder, + bool shouldIncrement, EffectiveConfiguration targetConfiguration) => + DetermineIncrementedField( + FindCommitMessageIncrement( + targetConfiguration, + targetCommits + .Where(commit => targetCommitHistory.Contains(commit.Sha)) + .DistinctBy(commit => commit.Sha) + .OrderBy(commit => commitOrder[commit.Sha]), + targetCommitHistory), + shouldIncrement, + targetConfiguration); + + private MergedBranchIncrement[] GetMergedBranchIncrements( + ICommit mergeCommit, ReferenceName mergedBranch, ICommit? baseVersionSource, + EffectiveConfiguration targetConfiguration) => + this.mergedBranchIncrementCache.GetOrAdd( + (mergeCommit.Sha, mergeCommit.Parents[1].Equals(baseVersionSource), targetConfiguration), () => + { + var sourceBranchConfiguration = Context.Configuration.GetBranchConfiguration(mergedBranch); + var mergeBase = this.repositoryStore.FindMergeBase( + mergeCommit.Parents[0], mergeCommit.Parents[1]); + + return [.. GetSourceConfigurations( + mergedBranch, mergeCommit.Parents[1], sourceBranchConfiguration) + .Select(sourceConfiguration => GetMergedBranchIncrement( + mergeCommit.Parents[1], mergedBranch, baseVersionSource, mergeBase, + sourceBranchConfiguration, sourceConfiguration, targetConfiguration))]; + }); + + private MergedBranchIncrement GetMergedBranchIncrement( + ICommit mergedBranchTip, ReferenceName mergedBranch, ICommit? baseVersionSource, ICommit? mergeBase, + IBranchConfiguration sourceBranchConfiguration, EffectiveConfiguration sourceConfiguration, + EffectiveConfiguration targetConfiguration) + { + var sourceLabel = sourceConfiguration.GetBranchSpecificLabel( + mergedBranch, null, this.environment); + var preventIncrementWhenBranchMerged = ResolvePreventIncrementWhenBranchMerged( + sourceBranchConfiguration, sourceConfiguration, targetConfiguration); + var shouldIncrement = ShouldIncrementTaggedCommit( + mergedBranchTip, baseVersionSource, sourceConfiguration, sourceLabel); + var sourceIncrement = DetermineIncrementedFieldInternal( + currentCommit: mergedBranchTip, + baseVersionSource: mergeBase, + shouldIncrement: shouldIncrement, + configuration: sourceConfiguration, + label: sourceLabel + ); + + if (sourceConfiguration.TrackMergeMessage + && HasCompatibleMainBranchHistory(mergedBranchTip, sourceConfiguration)) + { + sourceIncrement = ConsolidateIncrements( + GetIncrementsFromCommitHistory( + mergedBranchTip, mergeBase, shouldIncrement, + sourceConfiguration, sourceLabel, sourceIncrement), + sourceIncrement); + } + + return new(sourceIncrement, preventIncrementWhenBranchMerged); + } + + private bool? ResolvePreventIncrementWhenBranchMerged( + IBranchConfiguration sourceBranchConfiguration, EffectiveConfiguration sourceConfiguration, + EffectiveConfiguration targetConfiguration) + { + // Updating a descendant from main carries main's version floor; it does not complete main as a source branch. + if (sourceConfiguration.IsMainBranch && !targetConfiguration.IsMainBranch) + { + return null; + } + + return sourceBranchConfiguration.PreventIncrement.WhenBranchMerged + ?? (sourceBranchConfiguration.Increment == IncrementStrategy.Inherit + ? sourceConfiguration.PreventIncrementWhenBranchMerged + : Context.Configuration.PreventIncrement.WhenBranchMerged); + } + + private static CommitMessageIncrement ConsolidateIncrements( + IEnumerable increments, CommitMessageIncrement fallback) + { + var result = new CommitMessageIncrement(VersionField.None, VersionBumpNeedsToBeReset: false); + var hasIncrement = false; + foreach (var increment in increments) + { + hasIncrement = true; + result = result.Consolidate(increment); + if (increment.VersionBumpNeedsToBeReset) + { + break; + } } - return commitMessageIncrement.Value.Increment; + return hasIncrement ? result : fallback; + } + + private static CommitMessageIncrement ConsolidateMergedBranchIncrements( + IEnumerable sourceIncrements, + EffectiveConfiguration targetConfiguration, VersionField targetIncrement) + { + var result = new CommitMessageIncrement(VersionField.None, VersionBumpNeedsToBeReset: false); + foreach (var sourceIncrement in sourceIncrements) + { + result = result.Consolidate(SelectIncrement( + targetConfiguration.PreventIncrementOfMergedBranch, + sourceIncrement.PreventIncrementWhenBranchMerged, + targetIncrement, + sourceIncrement.Increment + )); + } + + return result; } + private bool ShouldIncrementTaggedCommit( + ICommit commit, ICommit? baseVersionSource, EffectiveConfiguration configuration, string? label) => + !commit.Equals(baseVersionSource) + || !configuration.PreventIncrementWhenCurrentCommitTagged + || !this.taggedSemanticVersionRepository + .GetTaggedSemanticVersions( + configuration.TagPrefixPattern, configuration.SemanticVersionFormat, configuration.Ignore)[commit] + .Where(versionWithTag => versionWithTag.Tag.Commit.When <= Context.CurrentCommit.When) + .Any(versionWithTag => versionWithTag.Value.IsMatchForBranchSpecificLabel(label)); + + private IEnumerable GetSourceConfigurations( + ReferenceName mergedBranch, ICommit mergedBranchTip, + IBranchConfiguration sourceBranchConfiguration) + { + var existingBranch = this.repositoryStore.Branches + .Where(candidate => candidate.Name.EquivalentTo(mergedBranch.WithoutOrigin) + && candidate.Tip?.Equals(mergedBranchTip) == true) + .MinBy(candidate => candidate.IsRemote); + + if (existingBranch is not null) + { + var configurations = GetEffectiveConfigurations(existingBranch); + if (configurations.Length != 0) + { + return configurations; + } + } + + if (sourceBranchConfiguration.Increment != IncrementStrategy.Inherit) + { + return [Context.Configuration.GetEffectiveConfiguration(mergedBranch)]; + } + + var inheritedConfigurations = FindClosestSourceBranches( + mergedBranchTip, sourceBranchConfiguration, Context.Configuration, + this.repositoryStore) + .SelectMany(source => GetEffectiveConfigurations(source.Branch, source.Tip)) + .Select(source => new EffectiveConfiguration( + Context.Configuration, sourceBranchConfiguration, source)) + .Distinct() + .ToArray(); + + if (inheritedConfigurations.Length != 0) + { + return inheritedConfigurations; + } + + var fallbackConfiguration = Context.Configuration.GetEffectiveConfiguration(mergedBranch); + return fallbackConfiguration.Increment == IncrementStrategy.Inherit + ? [] + : [fallbackConfiguration]; + } + + private EffectiveConfiguration[] GetEffectiveConfigurations(IBranch branch, ICommit? tip = null) + { + tip ??= branch.Tip; + return this.effectiveConfigurationCache.GetOrAdd( + (branch.Name.ToString(), tip?.Sha), + () => branch.Tip?.Equals(tip) == true + ? [.. this.effectiveBranchConfigurationFinder + .GetConfigurations(branch, Context.Configuration) + .Select(configuration => configuration.Value) + .Distinct()] + : [.. GetHistoricalEffectiveConfigurations( + branch, tip, new(StringComparer.OrdinalIgnoreCase)).Distinct()] + ); + } + + private IEnumerable GetHistoricalEffectiveConfigurations( + IBranch branch, ICommit? tip, HashSet traversedBranches) + { + if (tip is null || !traversedBranches.Add(branch.Name.WithoutOrigin)) + { + yield break; + } + + var branchConfiguration = Context.Configuration.GetBranchConfiguration(branch.Name); + if (branchConfiguration.Increment != IncrementStrategy.Inherit) + { + yield return new(Context.Configuration, branchConfiguration); + yield break; + } + + var sources = FindClosestSourceBranches( + tip, branchConfiguration, Context.Configuration, this.repositoryStore) + .ToArray(); + if (sources.Length == 0) + { + if (Context.Configuration.Increment != IncrementStrategy.Inherit) + { + yield return new(Context.Configuration, branchConfiguration); + } + yield break; + } + + foreach (var source in sources) + { + foreach (var parentConfiguration in GetHistoricalEffectiveConfigurations( + source.Branch, source.Tip, + new(traversedBranches, traversedBranches.Comparer))) + { + yield return new( + Context.Configuration, branchConfiguration, parentConfiguration); + } + } + } + + private IEnumerable FindClosestSourceBranches( + ICommit mergedBranchTip, IBranchConfiguration mergedBranchConfiguration, + IGitVersionConfiguration configuration, IRepositoryStore repositoryStore) + { + var candidates = repositoryStore.Branches + .Where(branch => (!configuration.Ignore.IsBranchIgnored(branch.Name) + || IsCurrentOrCompatibleMainBranch(branch)) + && IsConfiguredSourceBranch(branch, mergedBranchConfiguration, configuration)); + + var closestDistance = int.MaxValue; + List result = []; + foreach (var candidate in candidates) + { + if (candidate.Tip is null) + { + continue; + } + + if (FindFirstParentSource(mergedBranchTip, candidate.Tip) is not { } source) + { + continue; + } + if (source.Distance < closestDistance) + { + closestDistance = source.Distance; + result.Clear(); + } + if (source.Distance == closestDistance) + { + result.Add(new(candidate, source.Commit)); + } + } + + return result + .GroupBy(candidate => candidate.Branch.Name.WithoutOrigin, StringComparer.OrdinalIgnoreCase) + .Select(group => group.OrderBy(candidate => candidate.Branch.IsRemote).First()); + } + + private bool IsCurrentOrCompatibleMainBranch(IBranch branch) + { + if (branch.Name.EquivalentTo(Context.CurrentBranch.Name.WithoutOrigin)) + { + return true; + } + if (branch.Tip is not { } tip + || !GetEffectiveConfigurations(branch).Any(configuration => configuration.IsMainBranch) + || FindFirstParentSource(Context.CurrentCommit, tip) is not { } source) + { + return false; + } + return !ContainsNonMainMergeCommit( + Context.CurrentCommit, source.Distance, [GetFirstParentHistory(tip)]); + } + + private (ICommit Commit, int Distance)? FindFirstParentSource( + ICommit mergedBranchTip, ICommit sourceBranchTip) + { + var sourceHistory = GetFirstParentHistory(sourceBranchTip); + + var distance = 0; + for (ICommit? commit = mergedBranchTip; commit is not null; commit = commit.Parents.FirstOrDefault()) + { + if (sourceHistory.Contains(commit.Sha)) + { + return (commit, distance); + } + distance++; + } + return null; + } + + private bool HasCompatibleMainBranchHistory(ICommit commit, EffectiveConfiguration targetConfiguration) + { + if (IsPullRequestBranch(Context.CurrentBranch, Context.Configuration)) + { + return false; + } + + return this.compatibleMainBranchHistoryCache.GetOrAdd((commit.Sha, targetConfiguration), () => + { + var closestDistance = GetClosestMainBranchDistance(commit, targetConfiguration); + var mainBranchHistories = this.repositoryStore.Branches + .Where(branch => IsMainBranch(branch, targetConfiguration) && branch.Tip is not null) + .Select(branch => GetFirstParentHistory(branch.Tip!)) + .ToArray(); + + return closestDistance != int.MaxValue + && !ContainsNonMainMergeCommit(commit, closestDistance, mainBranchHistories); + }); + } + + private int GetClosestMainBranchDistance(ICommit commit, EffectiveConfiguration targetConfiguration) + { + var closestDistance = int.MaxValue; + foreach (var branch in this.repositoryStore.Branches) + { + if (!IsMainBranch(branch, targetConfiguration) + || branch.Tip is not { } tip + || FindFirstParentSource(commit, tip) is not { } source) + { + continue; + } + closestDistance = Math.Min(closestDistance, source.Distance); + } + return closestDistance; + } + + private bool IsMainBranch(IBranch branch, EffectiveConfiguration targetConfiguration) => + branch.Name.EquivalentTo(Context.CurrentBranch.Name.WithoutOrigin) + ? targetConfiguration.IsMainBranch + : GetEffectiveConfigurations(branch).Any(configuration => configuration.IsMainBranch); + + private HashSet GetFirstParentHistory(ICommit tip) => + this.firstParentHistoryCache.GetOrAdd(tip.Sha, () => + { + HashSet result = []; + for (ICommit? commit = tip; commit is not null; commit = commit.Parents.FirstOrDefault()) + { + result.Add(commit.Sha); + } + return result; + }); + + private static bool ContainsNonMainMergeCommit( + ICommit commit, int distance, IReadOnlyCollection> mainBranchHistories) + { + for (ICommit? current = commit; distance > 0; + current = current?.Parents.FirstOrDefault(), distance--) + { + if (current?.IsMergeCommit == true + && current.Parents.Skip(1).Any(parent => + mainBranchHistories.All(history => !history.Contains(parent.Sha)))) + { + return true; + } + } + return false; + } + + private static bool IsPullRequestBranch(IBranch branch, IGitVersionConfiguration configuration) => + branch.Name.IsPullRequest + || configuration.Branches.TryGetValue(ConfigurationConstants.PullRequestBranchKey, out var pullRequestConfiguration) + && pullRequestConfiguration.IsMatch(branch.Name.WithoutOrigin); + + private static bool IsConfiguredSourceBranch( + IBranch candidate, IBranchConfiguration mergedBranchConfiguration, + IGitVersionConfiguration configuration) => + mergedBranchConfiguration.SourceBranches.Any(sourceBranch => + configuration.Branches.TryGetValue(sourceBranch, out var sourceBranchConfiguration) + && sourceBranchConfiguration.IsMatch(candidate.Name.WithoutOrigin)); + + private static CommitMessageIncrement SelectIncrement( + bool preventIncrementOfMergedBranch, bool? preventIncrementWhenBranchMerged, + VersionField targetIncrement, CommitMessageIncrement sourceIncrement) + { + if (preventIncrementOfMergedBranch) + { + return preventIncrementWhenBranchMerged == true + ? new(targetIncrement, VersionBumpNeedsToBeReset: false) + : sourceIncrement; + } + + return preventIncrementWhenBranchMerged is null + ? new(targetIncrement.Consolidate(sourceIncrement.Increment), sourceIncrement.VersionBumpNeedsToBeReset) + : new(targetIncrement, VersionBumpNeedsToBeReset: false); + } + + private readonly record struct MergedBranchIncrement( + CommitMessageIncrement Increment, bool? PreventIncrementWhenBranchMerged); + + private readonly record struct HistoricalSourceBranch(IBranch Branch, ICommit Tip); + + private readonly record struct CommitHistoryEntry( + ICommit Commit, ReferenceName? MergedBranch, IReadOnlyList TargetCommits); + + private readonly record struct IncrementHistoryEntry(ICommit Commit, ReferenceName? MergedBranch); + + private readonly record struct CommitIncrementCacheKey( + string Commit, Regex Major, Regex Minor, Regex Patch, Regex NoBump, Regex Reset); + private CommitMessageIncrement? GetIncrementForCommits(EffectiveConfiguration configuration, ICommit[] commits) { commits.NotNull(); @@ -79,7 +675,8 @@ public VersionField DetermineIncrementedField( } private CommitMessageIncrement? FindCommitMessageIncrement( - EffectiveConfiguration configuration, ICommit? baseVersionSource, ICommit currentCommit, string? label) + EffectiveConfiguration configuration, ICommit? baseVersionSource, ICommit currentCommit, string? label, + IReadOnlySet? includedCommits = null) { if (configuration.CommitMessageIncrementing == CommitMessageIncrementMode.Disabled) { @@ -95,6 +692,11 @@ public VersionField DetermineIncrementedField( ignore: configuration.Ignore ); + if (includedCommits is not null) + { + commits = commits.Where(commit => includedCommits.Contains(commit.Sha)); + } + if (configuration.CommitMessageIncrementing == CommitMessageIncrementMode.MergeMessageOnly) { commits = commits.Where(c => c.Parents.Count > 1); @@ -105,6 +707,23 @@ public VersionField DetermineIncrementedField( ); } + private CommitMessageIncrement? FindCommitMessageIncrement( + EffectiveConfiguration configuration, IEnumerable commits, IReadOnlySet commitHistory) + { + if (configuration.CommitMessageIncrementing == CommitMessageIncrementMode.Disabled) + { + return null; + } + + commits = commits.Where(commit => commitHistory.Contains(commit.Sha)); + if (configuration.CommitMessageIncrementing == CommitMessageIncrementMode.MergeMessageOnly) + { + commits = commits.Where(commit => commit.Parents.Count > 1); + } + + return GetIncrementForCommits(configuration, [.. commits]); + } + private static Regex TryGetRegexOrDefault(string? messageRegex, Regex defaultRegex) => messageRegex == null ? defaultRegex @@ -117,6 +736,7 @@ private Dictionary.ValueCollection GetCommitHistory(string? tag [.. this.taggedSemanticVersionRepository .GetTaggedSemanticVersions(tagPrefix, semanticVersionFormat, ignore) .SelectMany(versionWithTags => versionWithTags) + .Where(versionWithTag => versionWithTag.Tag.Commit.When <= Context.CurrentCommit.When) .Where(versionWithTag => versionWithTag.Value.IsMatchForBranchSpecificLabel(label)) .Select(versionWithTag => versionWithTag.Tag.TargetSha)] ); @@ -188,8 +808,11 @@ private ICommit[] GetHeadCommits(ICommit? headCommit, IIgnoreConfiguration ignor [.. this.repositoryStore.GetCommitsReacheableFromHead(headCommit, ignore)]); private CommitMessageIncrement? GetIncrementFromCommit( - ICommit commit, Regex majorRegex, Regex minorRegex, Regex patchRegex, Regex noBumpRegex, Regex versionBumpResetRegex) => - this.commitIncrementCache.GetOrAdd(commit.Sha, () => + ICommit commit, Regex majorRegex, Regex minorRegex, Regex patchRegex, Regex noBumpRegex, Regex versionBumpResetRegex) + { + var key = new CommitIncrementCacheKey( + commit.Sha, majorRegex, minorRegex, patchRegex, noBumpRegex, versionBumpResetRegex); + return this.commitIncrementCache.GetOrAdd(key, () => { var increment = GetIncrementFromMessage(commit.Message, majorRegex, minorRegex, patchRegex, noBumpRegex); if (!increment.HasValue) @@ -199,6 +822,7 @@ private ICommit[] GetHeadCommits(ICommit? headCommit, IIgnoreConfiguration ignor return new(increment.Value, versionBumpResetRegex.IsMatch(commit.Message)); }); + } private static VersionField? GetIncrementFromMessage(string message, Regex majorRegex, Regex minorRegex, Regex patchRegex, Regex noBumpRegex) {