public void VerifyMergingMainIntoAFeatureBranchWorksWithMultipleBranches() { using var fixture = new EmptyRepositoryFixture(); fixture.MakeACommit($"first in {MainBranch}"); fixture.BranchTo("feature/foo", "foo"); fixture.MakeACommit("first in foo"); fixture.BranchTo("feature/bar", "bar"); fixture.MakeACommit("first in bar"); fixture.Checkout(MainBranch); fixture.MakeACommit($"second in {MainBranch}"); fixture.Checkout("feature/foo"); fixture.MergeNoFF(MainBranch); fixture.MakeACommit("second in foo"); fixture.Checkout("feature/bar"); fixture.MergeNoFF(MainBranch); fixture.MakeACommit("second in bar"); fixture.Checkout(MainBranch); fixture.MakeATaggedCommit("1.0.0"); fixture.MergeNoFF("feature/foo"); fixture.MergeNoFF("feature/bar"); fixture.AssertFullSemver("1.0.2", config); }
public void GivenARemoteGitRepositoryTheLocalAndRemoteBranchAreTreatedAsSameParentWhenInheritingConfiguration() { using var remote = new EmptyRepositoryFixture(); remote.MakeATaggedCommit("1.0"); remote.BranchTo("develop"); remote.MakeACommit(); remote.Checkout("main"); remote.BranchTo("support/1.0.x"); remote.MakeATaggedCommit("1.0.1"); using var local = remote.CloneRepository(); CopyRemoteBranchesToHeads(local.Repository); local.BranchTo("bug/hotfix"); local.MakeACommit(); local.AssertFullSemver("1.0.2-bug-hotfix.1+1"); }
public void MergingFeatureBranchThatIncrementsMinorNumberIncrementsMinorVersionOfMain() { var currentConfig = new Config { VersioningMode = VersioningMode.Mainline, Branches = new Dictionary <string, BranchConfig> { { "feature", new BranchConfig { VersioningMode = VersioningMode.ContinuousDeployment, Increment = IncrementStrategy.Minor } } } }; using var fixture = new EmptyRepositoryFixture(); fixture.MakeACommit($"first in {MainBranch}"); fixture.MakeATaggedCommit("1.0.0"); fixture.AssertFullSemver("1.0.0", currentConfig); fixture.BranchTo("feature/foo", "foo"); fixture.MakeACommit("first in foo"); fixture.MakeACommit("second in foo"); fixture.AssertFullSemver("1.1.0-foo.2", currentConfig); fixture.Checkout(MainBranch); fixture.MergeNoFF("feature/foo"); fixture.AssertFullSemver("1.1.0", currentConfig); }
public void NormalisationOfTag() { using (var fixture = new EmptyRepositoryFixture(new Config())) { fixture.Repository.MakeACommit(); fixture.Repository.Checkout(fixture.Repository.CreateBranch("feature/foo")); fixture.Repository.MakeACommit(); fixture.BranchTo("release/2.0.0"); fixture.MakeACommit(); fixture.MakeATaggedCommit("2.0.0-rc.1"); fixture.Checkout("master"); fixture.MergeNoFF("release/2.0.0"); fixture.Repository.Branches.Remove(fixture.Repository.FindBranch("release/2.0.0")); var remoteTagSha = fixture.Repository.Tags["2.0.0-rc.1"].Target.Sha; using (var localFixture = fixture.CloneRepository()) { localFixture.Checkout(remoteTagSha); GitHelper.NormalizeGitDirectory(localFixture.RepositoryPath, new Authentication(), noFetch: false, currentBranch: string.Empty); localFixture.AssertFullSemver("2.0.0-rc.1"); } } }
public void WixVersionFileContentTest() { using (var fixture = new EmptyRepositoryFixture()) { fixture.MakeATaggedCommit("1.2.3"); fixture.MakeACommit(); var gitVersionExecutionResults = GitVersionHelper.ExecuteIn(fixture.RepositoryPath, arguments: null); VersionVariables vars = gitVersionExecutionResults.OutputVariables; GitVersionHelper.ExecuteIn(fixture.RepositoryPath, arguments: " -updatewixversionfile"); var gitVersionVarsInWix = GetGitVersionVarsInWixFile(Path.Combine(fixture.RepositoryPath, WixVersionFileName)); var gitVersionVars = VersionVariables.AvailableVariables; foreach (var variable in gitVersionVars) { string value; vars.TryGetValue(variable, out value); //Make sure the variable is present in the Wix file Assert.IsTrue(gitVersionVarsInWix.ContainsKey(variable)); //Make sure the values are equal Assert.AreEqual(value, gitVersionVarsInWix[variable]); } } }
public void NormalisationOfTag() { using (var fixture = new EmptyRepositoryFixture()) { fixture.Repository.MakeACommit(); fixture.Repository.Checkout(fixture.Repository.CreateBranch("feature/foo")); fixture.Repository.MakeACommit(); fixture.BranchTo("release/2.0.0"); fixture.MakeACommit(); fixture.MakeATaggedCommit("2.0.0-rc.1"); fixture.Checkout("master"); fixture.MergeNoFF("release/2.0.0"); fixture.Repository.Branches.Remove(fixture.Repository.Branches["release/2.0.0"]); var remoteTagSha = fixture.Repository.Tags["2.0.0-rc.1"].Target.Sha; using (var localFixture = fixture.CloneRepository()) { localFixture.Checkout(remoteTagSha); GitRepositoryHelper.NormalizeGitDirectory(localFixture.RepositoryPath, new AuthenticationInfo(), noFetch: false, currentBranch: string.Empty); localFixture.Repository.Head.FriendlyName.ShouldBe("(no branch)"); localFixture.Repository.Head.Tip.Sha.ShouldBe(remoteTagSha); } } }
public void VerifyForwardMerge() { using (var fixture = new EmptyRepositoryFixture()) { fixture.Repository.MakeACommit("1"); fixture.MakeATaggedCommit("1.0.0"); fixture.MakeACommit(); // 1.0.1 fixture.BranchTo("feature/foo", "foo"); fixture.MakeACommit(); fixture.AssertFullSemver(config, "1.0.2-foo.1"); fixture.MakeACommit(); fixture.AssertFullSemver(config, "1.0.2-foo.2"); fixture.Checkout("master"); fixture.MakeACommit(); fixture.AssertFullSemver(config, "1.0.2"); fixture.Checkout("feature/foo"); // This may seem surprising, but this happens because we branched off mainline // and incremented. Mainline has then moved on. We do not follow mainline // in feature branches, you need to merge mainline in to get the mainline version fixture.AssertFullSemver(config, "1.0.2-foo.2"); fixture.MergeNoFF("master"); fixture.AssertFullSemver(config, "1.0.3-foo.3"); } }
public void CanUseBranchNameOffAReleaseBranch() { var config = new Config { Branches = { { "release", new BranchConfig { Tag = "build" } }, { "feature", new BranchConfig { Tag = "useBranchName" } } } }; using var fixture = new EmptyRepositoryFixture(); fixture.MakeACommit(); fixture.BranchTo("release/0.3.0"); fixture.MakeATaggedCommit("v0.3.0-build.1"); fixture.MakeACommit(); fixture.BranchTo("feature/PROJ-1"); fixture.MakeACommit(); fixture.AssertFullSemver(config, "0.3.0-PROJ-1.1+2"); }
public void VerifySupportForwardMerge() { using (var fixture = new EmptyRepositoryFixture()) { fixture.Repository.MakeACommit("1"); fixture.MakeATaggedCommit("1.0.0"); fixture.MakeACommit(); // 1.0.1 fixture.BranchTo("support/1.0", "support10"); fixture.MakeACommit(); fixture.MakeACommit(); fixture.Checkout("master"); fixture.MakeACommit("+semver: minor"); fixture.AssertFullSemver(config, "1.1.0"); fixture.MergeNoFF("support/1.0"); fixture.AssertFullSemver(config, "1.1.1"); fixture.MakeACommit(); fixture.AssertFullSemver(config, "1.1.2"); fixture.Checkout("support/1.0"); fixture.AssertFullSemver(config, "1.0.4"); fixture.BranchTo("feature/foo", "foo"); fixture.MakeACommit(); fixture.MakeACommit(); fixture.AssertFullSemver(config, "1.0.4-foo.2"); // TODO This probably should be 1.0.5 } }
public void SupportBranches() { using (var fixture = new EmptyRepositoryFixture()) { fixture.Repository.MakeACommit("1"); fixture.MakeATaggedCommit("1.0.0"); fixture.MakeACommit(); // 1.0.1 fixture.MakeACommit(); // 1.0.2 fixture.AssertFullSemver(config, "1.0.2"); fixture.BranchTo("support/1.0", "support10"); fixture.AssertFullSemver(config, "1.0.3"); // Move master on fixture.Checkout("master"); fixture.MakeACommit("+semver: major"); // 2.0.0 (on master) fixture.AssertFullSemver(config, "2.0.0"); // Continue on support/1.0 fixture.Checkout("support/1.0"); fixture.MakeACommit(); // 1.0.4 fixture.MakeACommit(); // 1.0.5 fixture.AssertFullSemver(config, "1.0.5"); fixture.BranchTo("feature/foo", "foo"); fixture.AssertFullSemver(config, "1.0.5-foo.0"); fixture.MakeACommit(); fixture.AssertFullSemver(config, "1.0.5-foo.1"); fixture.MakeACommit(); fixture.AssertFullSemver(config, "1.0.5-foo.2"); fixture.Repository.CreatePullRequestRef("feature/foo", "support/1.0", normalise: true, prNumber: 7); fixture.AssertFullSemver(config, "1.0.5-PullRequest0007.3"); } }
public void NormalisationOfTag() { using (var fixture = new EmptyRepositoryFixture()) { fixture.Repository.MakeACommit(); Commands.Checkout(fixture.Repository, fixture.Repository.CreateBranch("feature/foo")); fixture.Repository.MakeACommit(); fixture.BranchTo("release/2.0.0"); fixture.MakeACommit(); fixture.MakeATaggedCommit("2.0.0-rc.1"); fixture.Checkout("master"); fixture.MergeNoFF("release/2.0.0"); fixture.Repository.Branches.Remove(fixture.Repository.Branches["release/2.0.0"]); var remoteTagSha = fixture.Repository.Tags["2.0.0-rc.1"].Target.Sha; using (var localFixture = fixture.CloneRepository()) { localFixture.Checkout(remoteTagSha); GitRepositoryHelper.NormalizeGitDirectory(localFixture.RepositoryPath, new AuthenticationInfo(), noFetch: false, currentBranch: string.Empty); localFixture.Repository.Head.FriendlyName.ShouldBe("(no branch)"); localFixture.Repository.Head.Tip.Sha.ShouldBe(remoteTagSha); } } }
public void VerifyDevelopTracksMainVersion() { using var fixture = new EmptyRepositoryFixture(); fixture.Repository.MakeACommit("1"); fixture.MakeATaggedCommit("1.0.0"); fixture.MakeACommit(); // branching increments the version fixture.BranchTo("develop"); fixture.AssertFullSemver("1.1.0-alpha.0", config); fixture.MakeACommit(); fixture.AssertFullSemver("1.1.0-alpha.1", config); // merging develop into main increments minor version on main fixture.Checkout(MainBranch); fixture.MergeNoFF("develop"); fixture.AssertFullSemver("1.1.0", config); // a commit on develop before the merge still has the same version number fixture.Checkout("develop"); fixture.AssertFullSemver("1.1.0-alpha.1", config); // moving on to further work on develop tracks main's version from the merge fixture.MakeACommit(); fixture.AssertFullSemver("1.2.0-alpha.1", config); // adding a commit to main increments patch fixture.Checkout(MainBranch); fixture.MakeACommit(); fixture.AssertFullSemver("1.1.1", config); // adding a commit to main doesn't change develop's version fixture.Checkout("develop"); fixture.AssertFullSemver("1.2.0-alpha.1", config); }
public void VerifyMergingMasterIntoAFeatureBranchWorksWithMultipleBranches() { using (var fixture = new EmptyRepositoryFixture()) { fixture.MakeACommit("first in master"); fixture.BranchTo("feature/foo", "foo"); fixture.MakeACommit("first in foo"); fixture.BranchTo("feature/bar", "bar"); fixture.MakeACommit("first in bar"); fixture.Checkout("master"); fixture.MakeACommit("second in master"); fixture.Checkout("feature/foo"); fixture.MergeNoFF("master"); fixture.MakeACommit("second in foo"); fixture.Checkout("feature/bar"); fixture.MergeNoFF("master"); fixture.MakeACommit("second in bar"); fixture.Checkout("master"); fixture.MakeATaggedCommit("1.0.0"); fixture.MergeNoFF("feature/foo"); fixture.MergeNoFF("feature/bar"); fixture.AssertFullSemver(config, "1.0.2"); } }
protected static EmptyRepositoryFixture CreateLocalRepositoryFixture() { var fixture = new EmptyRepositoryFixture(); fixture.MakeATaggedCommit("1.2.3"); fixture.MakeACommit(); return(fixture); }
public void WixVersionFileCreationTest() { using var fixture = new EmptyRepositoryFixture(); fixture.MakeATaggedCommit("1.2.3"); fixture.MakeACommit(); GitVersionHelper.ExecuteIn(fixture.RepositoryPath, arguments: " /updatewixversionfile"); Assert.IsTrue(File.Exists(Path.Combine(fixture.RepositoryPath, this.wixVersionFileName))); }
public void WhenPreventIncrementOfMergedBranchVersionIsSetToFalseForDevelopCommitsSinceVersionSourceShouldNotGoDownWhenMergingReleaseToDevelop() { var config = new Config { VersioningMode = VersioningMode.ContinuousDeployment, Branches = new Dictionary <string, BranchConfig> { { "develop", new BranchConfig { PreventIncrementOfMergedBranchVersion = false } }, } }; using var fixture = new EmptyRepositoryFixture(); const string ReleaseBranch = "release/1.1.0"; fixture.MakeACommit(); fixture.BranchTo("develop"); fixture.MakeATaggedCommit("1.0.0"); fixture.Repository.MakeCommits(1); // Create a release branch and make some commits fixture.BranchTo(ReleaseBranch); fixture.Repository.MakeCommits(3); // Simulate a GitFlow release finish. fixture.Checkout("master"); fixture.MergeNoFF(ReleaseBranch); fixture.ApplyTag("v1.1.0"); fixture.Checkout("develop"); // Simulate some work done on develop while the release branch was open. fixture.Repository.MakeCommits(2); fixture.MergeNoFF(ReleaseBranch); // Version numbers will still be correct when the release branch is around. fixture.AssertFullSemver("1.2.0-alpha.6"); fixture.AssertFullSemver("1.2.0-alpha.6", config); var versionSourceBeforeReleaseBranchIsRemoved = fixture.GetVersion(config).Sha; fixture.Repository.Branches.Remove(ReleaseBranch); var versionSourceAfterReleaseBranchIsRemoved = fixture.GetVersion(config).Sha; Assert.AreEqual(versionSourceBeforeReleaseBranchIsRemoved, versionSourceAfterReleaseBranchIsRemoved); fixture.AssertFullSemver("1.2.0-alpha.6"); fixture.AssertFullSemver("1.2.0-alpha.6", config); config.Branches = new Dictionary <string, BranchConfig> { { "develop", new BranchConfig { PreventIncrementOfMergedBranchVersion = true } }, }; fixture.AssertFullSemver("1.2.0-alpha.3", config); }
public void LogPathContainsForwardSlash() { using var fixture = new EmptyRepositoryFixture(); fixture.MakeATaggedCommit("1.2.3"); fixture.MakeACommit(); var result = GitVersionHelper.ExecuteIn(fixture.RepositoryPath, arguments: @" /l ""/tmp/path""", logToFile: false); result.ExitCode.ShouldBe(0); result.Output.ShouldContain(@"""MajorMinorPatch"": ""1.2.4"""); }
public void CheckBuildServerVerbosityConsole(string verbosityArg, string expectedOutput) { using var fixture = new EmptyRepositoryFixture(); fixture.MakeATaggedCommit("1.2.3"); fixture.MakeACommit(); var result = GitVersionHelper.ExecuteIn(fixture.RepositoryPath, arguments: $@" {verbosityArg} -output buildserver /l ""/tmp/path""", logToFile: false); result.ExitCode.ShouldBe(0); result.Output.ShouldContain(expectedOutput); }
public void LogPathContainsForwardSlash() { using (var fixture = new EmptyRepositoryFixture()) { fixture.MakeATaggedCommit("1.2.3"); fixture.MakeACommit(); var result = GitVersionHelper.ExecuteIn(fixture.RepositoryPath, arguments: @" /l ""/some/path""", logToFile: false); result.ExitCode.ShouldBe(0); result.Output.ShouldContain(@"""MajorMinorPatch"":""1.2.4"""); } }
public void CanUseCommitMessagesToBumpVersion() { using var fixture = new EmptyRepositoryFixture(); fixture.Repository.MakeACommit(); fixture.MakeATaggedCommit("1.0.0"); fixture.Repository.MakeACommit("+semver:minor"); fixture.AssertFullSemver("1.1.0+1"); fixture.Repository.MakeACommit("+semver:major"); fixture.AssertFullSemver("2.0.0+2"); }
public void TheReadmeSample() { using (var fixture = new EmptyRepositoryFixture()) { fixture.MakeACommit(); fixture.MakeACommit(); fixture.MakeATaggedCommit("1.0.0"); fixture.BranchTo("develop"); fixture.MakeACommit(); fixture.Checkout("master"); fixture.MergeNoFF("develop"); } }
public void CheckBuildServerVerbosityConsole(string verbosityArg, string expectedOutput) { using (var fixture = new EmptyRepositoryFixture()) { fixture.MakeATaggedCommit("1.2.3"); fixture.MakeACommit(); var result = GitVersionHelper.ExecuteIn(fixture.RepositoryPath, arguments: String.Format( @" {0} -output buildserver /l ""/some/path""", verbosityArg), logToFile: false); result.ExitCode.ShouldBe(0); result.Output.ShouldContain(expectedOutput); } }
public void PreviousPreReleaseTagShouldBeRespectedWhenCountingCommits() { using var fixture = new EmptyRepositoryFixture(); fixture.Repository.MakeACommit(); fixture.BranchTo("develop"); fixture.MakeATaggedCommit("1.0.0-alpha.3"); // manual bump version fixture.MakeACommit(); fixture.MakeACommit(); fixture.AssertFullSemver("1.0.0-alpha.5"); }
public void CanUseCommitMessagesToBumpVersion() { using (var fixture = new EmptyRepositoryFixture()) { fixture.Repository.MakeACommit(); fixture.MakeATaggedCommit("1.0.0"); fixture.Repository.MakeACommit("+semver:minor"); fixture.AssertFullSemver("1.1.0+1"); fixture.Repository.MakeACommit("+semver:major"); fixture.AssertFullSemver("2.0.0+2"); } }
public void VerifyPullRequestsActLikeContinuousDelivery() { using var fixture = new EmptyRepositoryFixture(); fixture.Repository.MakeACommit("1"); fixture.MakeATaggedCommit("1.0.0"); fixture.MakeACommit(); fixture.AssertFullSemver("1.0.1", config); fixture.BranchTo("feature/foo", "foo"); fixture.AssertFullSemver("1.0.2-foo.0", config); fixture.MakeACommit(); fixture.MakeACommit(); fixture.Repository.CreatePullRequestRef("feature/foo", MainBranch, normalise: true, prNumber: 8); fixture.AssertFullSemver("1.0.2-PullRequest0008.3", config); }
public void BranchVersionHavePrecedenceOverTagVersionIfVersionGreaterThanTag() { using var fixture = new EmptyRepositoryFixture(); fixture.Repository.MakeACommit(); fixture.Repository.CreateBranch("develop"); fixture.Checkout("develop"); fixture.MakeATaggedCommit("0.1.0-alpha.1"); // simulate merge from feature branch fixture.Repository.CreateBranch("release/1.0"); fixture.Checkout("release/1.0"); fixture.AssertFullSemver("1.0.0-beta.1+0"); }
public void TheReadmeSample() { using (LogHelper.Capture(_outputHelper, LogProvider.SetCurrentLogProvider)) { using (var fixture = new EmptyRepositoryFixture()) { fixture.MakeACommit(); fixture.MakeACommit(); fixture.MakeATaggedCommit("1.0.0"); fixture.BranchTo("develop"); fixture.MakeACommit(); fixture.Checkout("master"); fixture.MergeNoFF("develop"); } } }
public void CanUseCommitMessagesToBumpVersionBaseVersionTagIsAppliedToSameCommit() { using var fixture = new EmptyRepositoryFixture(); fixture.Repository.MakeACommit(); fixture.MakeATaggedCommit("1.0.0"); fixture.Repository.MakeACommit("+semver:minor"); fixture.AssertFullSemver("1.1.0+1"); fixture.ApplyTag("2.0.0"); fixture.Repository.MakeACommit("Hello"); // Default bump is patch fixture.AssertFullSemver("2.0.1+1"); }
public void WixVersionFileVarCountTest() { //Make sure we have captured all the version variables by count in the Wix version file using var fixture = new EmptyRepositoryFixture(); fixture.MakeATaggedCommit("1.2.3"); fixture.MakeACommit(); GitVersionHelper.ExecuteIn(fixture.RepositoryPath, arguments: null); GitVersionHelper.ExecuteIn(fixture.RepositoryPath, arguments: " /updatewixversionfile"); var gitVersionVarsInWix = GetGitVersionVarsInWixFile(Path.Combine(fixture.RepositoryPath, this.wixVersionFileName)); var gitVersionVars = VersionVariables.AvailableVariables; Assert.AreEqual(gitVersionVars.Count(), gitVersionVarsInWix.Count); }
public void VerifyDevelopFeatureTracksMasterVersion() { using (var fixture = new EmptyRepositoryFixture()) { fixture.Repository.MakeACommit("1"); fixture.MakeATaggedCommit("1.0.0"); fixture.MakeACommit(); // branching increments the version fixture.BranchTo("develop"); fixture.AssertFullSemver(config, "1.1.0-alpha.0"); fixture.MakeACommit(); fixture.AssertFullSemver(config, "1.1.0-alpha.1"); // merging develop into master increments minor version on master fixture.Checkout("master"); fixture.MergeNoFF("develop"); fixture.AssertFullSemver(config, "1.1.0"); // a commit on develop before the merge still has the same version number fixture.Checkout("develop"); fixture.AssertFullSemver(config, "1.1.0-alpha.1"); // a branch from develop before the merge tracks the pre-merge version from master // (note: the commit on develop looks like a commit to this branch, thus the .1) fixture.BranchTo("feature/foo"); fixture.AssertFullSemver(config, "1.0.2-foo.1"); // further work on the branch tracks the merged version from master fixture.MakeACommit(); fixture.AssertFullSemver(config, "1.1.1-foo.1"); // adding a commit to master increments patch fixture.Checkout("master"); fixture.MakeACommit(); fixture.AssertFullSemver(config, "1.1.1"); // adding a commit to master doesn't change the feature's version fixture.Checkout("feature/foo"); fixture.AssertFullSemver(config, "1.1.1-foo.1"); // merging the feature to develop increments develop fixture.Checkout("develop"); fixture.MergeNoFF("feature/foo"); fixture.AssertFullSemver(config, "1.2.0-alpha.2"); } }
public void CanUseCommitMessagesToBumpVersionBaseVersionTagIsAppliedToSameCommit() { using (var fixture = new EmptyRepositoryFixture()) { fixture.Repository.MakeACommit(); fixture.MakeATaggedCommit("1.0.0"); fixture.Repository.MakeACommit("+semver:minor"); fixture.AssertFullSemver("1.1.0+1"); fixture.ApplyTag("2.0.0"); fixture.Repository.MakeACommit("Hello"); // Default bump is patch fixture.AssertFullSemver("2.0.1+1"); } }
public void RunExecViaCommandLine() { using var fixture = new EmptyRepositoryFixture(); fixture.MakeATaggedCommit("1.2.3"); fixture.MakeACommit(); var buildFile = Path.Combine(fixture.RepositoryPath, "RunExecViaCommandLine.csproj"); File.Delete(buildFile); File.WriteAllText(buildFile, MsBuildProjectArgTest.TestProject); var exec = "dotnet"; var execArgs = "msbuild RunExecViaCommandLine.csproj /target:OutputResults"; var result = GitVersionHelper.ExecuteIn(fixture.RepositoryPath, exec, execArgs); result.ExitCode.ShouldBe(0, result.Log); result.Log.ShouldContain("GitVersion_FullSemVer: 1.2.4+1"); }
public void CanUseConventionalCommitsToBumpVersion() { var configuration = new Config { VersioningMode = GitVersion.VersionCalculation.VersioningMode.Mainline, // For future debugging of this regex: https://regex101.com/r/UfzIwS/1 MajorVersionBumpMessage = "(build|chore|ci|docs|feat|fix|perf|refactor|revert|style|test)(\\([\\w\\s]*\\))?(!:|:.*\\n\\n.*\\n\\n.*BREAKING.*).*", // For future debugging of this regex: https://regex101.com/r/9ccNam/1 MinorVersionBumpMessage = "(feat)(\\([\\w\\s]*\\))?:", // For future debugging of this regex: https://regex101.com/r/ALKccf/1 PatchVersionBumpMessage = "(build|chore|ci|docs|fix|perf|refactor|revert|style|test)(\\([\\w\\s]*\\))?:(.*\\n\\n.*\\n\\n.*BREAKING.*){0}" }; using var fixture = new EmptyRepositoryFixture(); fixture.Repository.MakeACommit(); fixture.MakeATaggedCommit("1.0.0"); fixture.Repository.MakeACommit("feat(Api): Added some new endpoints"); fixture.AssertFullSemver("1.1.0", configuration); // This tests if adding an exclamation mark after the type (breaking change) bumps the major version fixture.Repository.MakeACommit("feat(Api)!: Changed existing API models"); fixture.AssertFullSemver("2.0.0", configuration); // This tests if writing BREAKING CHANGE in the footer bumps the major version fixture.Repository.MakeACommit("feat: Changed existing API models\n\nSome more descriptive text\n\nBREAKING CHANGE"); fixture.AssertFullSemver("3.0.0", configuration); fixture.Repository.MakeACommit("chore: Cleaned up various things"); fixture.AssertFullSemver("3.0.1", configuration); fixture.Repository.MakeACommit("chore: Cleaned up more various things"); fixture.AssertFullSemver("3.0.2", configuration); fixture.Repository.MakeACommit("feat: Added some new functionality"); fixture.AssertFullSemver("3.1.0", configuration); fixture.Repository.MakeACommit("feat: Added even more new functionality"); fixture.AssertFullSemver("3.2.0", configuration); }
public void InheritVersionFromReleaseBranch() { using var fixture = new EmptyRepositoryFixture(); fixture.MakeATaggedCommit("1.0.0"); fixture.BranchTo("develop"); fixture.MakeACommit(); fixture.BranchTo("release/2.0.0"); fixture.MakeACommit(); fixture.MakeACommit(); fixture.Checkout("develop"); fixture.AssertFullSemver("1.1.0-alpha.1"); fixture.MakeACommit(); fixture.AssertFullSemver("2.1.0-alpha.1"); fixture.MergeNoFF("release/2.0.0"); fixture.AssertFullSemver("2.1.0-alpha.4"); fixture.BranchTo("feature/MyFeature"); fixture.MakeACommit(); fixture.AssertFullSemver("2.1.0-MyFeature.1+5"); }
public void VerifyMergingMainToFeatureDoesNotStopMainCommitsIncrementingVersion() { using var fixture = new EmptyRepositoryFixture(); fixture.MakeACommit($"first in {MainBranch}"); fixture.BranchTo("feature/foo", "foo"); fixture.MakeACommit("first in foo"); fixture.Checkout(MainBranch); fixture.MakeATaggedCommit("1.0.0"); fixture.MakeACommit($"third in {MainBranch}"); fixture.Checkout("feature/foo"); fixture.MergeNoFF(MainBranch); fixture.MakeACommit("second in foo"); fixture.Checkout(MainBranch); fixture.MergeNoFF("feature/foo"); fixture.AssertFullSemver("1.0.2", config); }
public void InheritVersionFromReleaseBranch() { using (var fixture = new EmptyRepositoryFixture()) { fixture.MakeATaggedCommit("1.0.0"); fixture.BranchTo("develop"); fixture.MakeACommit(); fixture.BranchTo("release/2.0.0"); fixture.MakeACommit(); fixture.MakeACommit(); fixture.Checkout("develop"); fixture.AssertFullSemver("1.1.0-alpha.1"); fixture.MakeACommit(); fixture.AssertFullSemver("2.1.0-alpha.1"); fixture.MergeNoFF("release/2.0.0"); fixture.AssertFullSemver("2.1.0-alpha.4"); fixture.BranchTo("feature/MyFeature"); fixture.MakeACommit(); fixture.AssertFullSemver("2.1.0-MyFeature.1+3"); } }
public void RunExecViaCommandLine() { using (var fixture = new EmptyRepositoryFixture()) { fixture.MakeATaggedCommit("1.2.3"); fixture.MakeACommit(); var buildFile = Path.Combine(fixture.RepositoryPath, "RunExecViaCommandLine.proj"); File.Delete(buildFile); const string buildFileContent = @"<?xml version=""1.0"" encoding=""utf-8""?> <Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003""> <Target Name=""OutputResults""> <Message Text=""GitVersion_FullSemVer: $(GitVersion_FullSemVer)""/> </Target> </Project>"; File.WriteAllText(buildFile, buildFileContent); var result = GitVersionHelper.ExecuteIn(fixture.RepositoryPath, SpecifiedArgumentRunner.BuildTool, "RunExecViaCommandLine.proj /target:OutputResults"); result.ExitCode.ShouldBe(0); result.Log.ShouldContain("GitVersion_FullSemVer: 1.2.4+1"); } }
public void VerifyMergingMasterToFeatureDoesNotStopMasterCommitsIncrementingVersion() { using (var fixture = new EmptyRepositoryFixture()) { fixture.MakeACommit("first in master"); fixture.BranchTo("feature/foo", "foo"); fixture.MakeACommit("first in foo"); fixture.Checkout("master"); fixture.MakeATaggedCommit("1.0.0"); fixture.MakeACommit("third in master"); fixture.Checkout("feature/foo"); fixture.MergeNoFF("master"); fixture.MakeACommit("second in foo"); fixture.Checkout("master"); fixture.MergeNoFF("feature/foo"); fixture.AssertFullSemver(config, "1.0.2"); } }
public void VerifyForwardMerge() { using (var fixture = new EmptyRepositoryFixture()) { fixture.Repository.MakeACommit("1"); fixture.MakeATaggedCommit("1.0.0"); fixture.MakeACommit(); // 1.0.1 fixture.BranchTo("feature/foo", "foo"); fixture.MakeACommit(); fixture.MakeACommit(); fixture.AssertFullSemver(config, "1.0.2-foo.2"); fixture.Checkout("master"); fixture.MakeACommit(); fixture.AssertFullSemver(config, "1.0.2"); fixture.Checkout("feature/foo"); fixture.MergeNoFF("master"); fixture.AssertFullSemver(config, "1.0.3-foo.3"); } }
public void VerifyPullRequestsActLikeContinuousDelivery() { using (var fixture = new EmptyRepositoryFixture()) { fixture.Repository.MakeACommit("1"); fixture.MakeATaggedCommit("1.0.0"); fixture.MakeACommit(); fixture.AssertFullSemver(config, "1.0.1"); fixture.BranchTo("feature/foo", "foo"); fixture.MakeACommit(); fixture.MakeACommit(); fixture.Repository.CreatePullRequestRef("feature/foo", "master", normalise: true, prNumber: 8); fixture.AssertFullSemver(config, "1.0.2-PullRequest0008.3"); } }
public void MergedFeatureBranchesToMasterImpliesRelease() { using (var fixture = new EmptyRepositoryFixture()) { fixture.Repository.MakeACommit("1"); fixture.MakeATaggedCommit("1.0.0"); fixture.BranchTo("feature/foo", "foo"); fixture.MakeACommit("2"); fixture.AssertFullSemver(config, "1.0.1-foo.1"); fixture.MakeACommit("2.1"); fixture.AssertFullSemver(config, "1.0.1-foo.2"); fixture.Checkout("master"); fixture.MergeNoFF("feature/foo"); fixture.AssertFullSemver(config, "1.0.1"); fixture.BranchTo("feature/foo2", "foo2"); fixture.MakeACommit("3 +semver: minor"); fixture.AssertFullSemver(config, "1.1.0-foo2.1"); fixture.Checkout("master"); fixture.MergeNoFF("feature/foo2"); fixture.AssertFullSemver(config, "1.1.0"); fixture.BranchTo("feature/foo3", "foo3"); fixture.MakeACommit("4"); fixture.Checkout("master"); fixture.MergeNoFF("feature/foo3"); fixture.SequenceDiagram.NoteOver("Merge message contains '+semver: minor'", "master"); var commit = fixture.Repository.Head.Tip; // Put semver increment in merge message fixture.Repository.Commit(commit.Message + " +semver: minor", commit.Author, commit.Committer, new CommitOptions { AmendPreviousCommit = true }); fixture.AssertFullSemver(config, "1.2.0"); fixture.BranchTo("feature/foo4", "foo4"); fixture.MakeACommit("5 +semver: major"); fixture.AssertFullSemver(config, "2.0.0-foo4.1"); fixture.Checkout("master"); fixture.MergeNoFF("feature/foo4"); fixture.AssertFullSemver(config, "2.0.0"); // We should evaluate any commits not included in merge commit calculations for direct commit/push or squash to merge commits fixture.MakeACommit("6 +semver: major"); fixture.AssertFullSemver(config, "3.0.0"); fixture.MakeACommit("7 +semver: minor"); fixture.AssertFullSemver(config, "3.1.0"); fixture.MakeACommit("8"); fixture.AssertFullSemver(config, "3.1.1"); // Finally verify that the merge commits still function properly fixture.BranchTo("feature/foo5", "foo5"); fixture.MakeACommit("9 +semver: minor"); fixture.AssertFullSemver(config, "3.2.0-foo5.1"); fixture.Checkout("master"); fixture.MergeNoFF("feature/foo5"); fixture.AssertFullSemver(config, "3.2.0"); // One more direct commit for good measure fixture.MakeACommit("10 +semver: minor"); fixture.AssertFullSemver(config, "3.3.0"); // And we can commit without bumping semver fixture.MakeACommit("11 +semver: none"); fixture.AssertFullSemver(config, "3.3.0"); Console.WriteLine(fixture.SequenceDiagram.GetDiagram()); } }