Skip to content

Feature/dynamic tag evaluation #2416

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 11 commits into from
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
using GitTools.Testing;
using GitVersion.Model.Configuration;
using NUnit.Framework;
using GitVersionCore.Tests.Helpers;
using LibGit2Sharp;
using NUnit.Framework;

namespace GitVersionCore.Tests.IntegrationTests
{
Expand Down Expand Up @@ -36,5 +37,34 @@ public void BranchVersionHavePrecedenceOverTagVersionIfVersionGreaterThanTag()

fixture.AssertFullSemver("1.0.0-beta.1+0");
}

[Test]
public void BetaBranchCreatedButStillOnTaggedAlphaCommitShouldCreateBetaVersion()
{
// Arrange
var config = new Config
{
Branches =
{
{ "release", new BranchConfig { Tag = "beta" } },
{ "develop", new BranchConfig { Tag = "alpha" } }
}
};

// Act
using var fixture = new BaseGitFlowRepositoryFixture("1.0.0");
fixture.Checkout("develop");
fixture.MakeATaggedCommit("1.1.0-alpha.1"); // assuming this has been build as 1.1.0-alpha.1

fixture.BranchTo("release/1.1.0"); // about to be released, no additional empty commit in this scenario!
fixture.Checkout("release/1.1.0"); // still on the same commit, but another branch, choosing to build same code as beta now

// Assert
fixture.AssertFullSemver("1.1.0-beta.1", config); //Tag is an "alpha" tag from develop branch, only "beta" tags should count when on release branch. If no beta tag found, build new beta version on release branch.

fixture.Checkout("develop"); // back to develop
fixture.AssertFullSemver("1.1.0-alpha.1", config); //will be 1.1.0-alpha.1 based on tag (as before)

}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,11 @@ public void ShouldNotUseNumberInFeatureBranchAsPreReleaseNumberOffDevelop()
fixture.Repository.MakeCommits(5);

fixture.AssertFullSemver("1.1.0-JIRA-123.1+5");

Commands.Checkout(fixture.Repository, "develop");
fixture.Repository.MergeNoFF("feature/JIRA-123");

fixture.AssertFullSemver("1.1.0-alpha.6");
}

[Test]
Expand All @@ -104,6 +109,11 @@ public void ShouldNotUseNumberInFeatureBranchAsPreReleaseNumberOffMaster()
fixture.Repository.MakeCommits(5);

fixture.AssertFullSemver("1.0.1-JIRA-123.1+5");

Commands.Checkout(fixture.Repository, "master");
fixture.Repository.MergeNoFF("feature/JIRA-123");

fixture.AssertFullSemver("1.0.1+6");
}

[Test]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -168,6 +168,61 @@ public void WhenReleaseBranchOffDevelopIsMergedIntoMasterAndDevelopVersionIsTake
fixture.AssertFullSemver("2.0.0+2");
}

[Test]
public void WhenReleaseBranchOffDevelopIsMergedFFIntoMasterAndDevelopVersionIsTakenWithIt()
{
var config = new Config
{
Branches =
{
{ "release", new BranchConfig { Tag = "beta" } },
{ "develop", new BranchConfig { Tag = "alpha" } }
}
};

using var fixture = new EmptyRepositoryFixture();
fixture.Repository.MakeATaggedCommit("1.0.3");
fixture.Repository.CreateBranch("develop");
fixture.Repository.MakeCommits(1);

fixture.Repository.CreateBranch("release-2.0.0");
fixture.Checkout("release-2.0.0");
fixture.Repository.MakeCommits(4);
fixture.Checkout("master");
fixture.Repository.Merge("release-2.0.0", Generate.SignatureNow());

fixture.AssertFullSemver("2.0.0+0", config);
}

[Test]
public void WhenTaggedReleaseBranchOffDevelopIsMergedFFIntoMasterAndDevelopVersionIsTakenWithIt()
{
var config = new Config
{
Branches =
{
{ "release", new BranchConfig { Tag = "beta" } },
{ "develop", new BranchConfig { Tag = "alpha" } }
}
};

using var fixture = new EmptyRepositoryFixture();
fixture.Repository.MakeATaggedCommit("1.0.3");
fixture.Repository.CreateBranch("develop");
fixture.Repository.MakeCommits(1);

fixture.Repository.CreateBranch("release-2.0.0");
fixture.Checkout("release-2.0.0");
fixture.Repository.MakeCommits(4);
fixture.Repository.MakeATaggedCommit("2.0.0-beta.1+4");
fixture.AssertFullSemver("2.0.0-beta.1+4", config);
fixture.Checkout("master");
fixture.Repository.Merge("release-2.0.0", Generate.SignatureNow());

// Do not take tag into account since tag is a "beta" tag on the "release" branch but now "master" is checked out
fixture.AssertFullSemver("2.0.0+0", config);
}

[Test]
public void WhenReleaseBranchOffMasterIsMergedIntoMasterVersionIsTakenWithIt()
{
Expand Down
44 changes: 22 additions & 22 deletions src/GitVersionCore.Tests/VersionCalculation/SemanticVersionTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ public void ValidateVersionParsing(
{
fullFormattedVersionString ??= versionString;

SemanticVersion.TryParse(versionString, tagPrefixRegex, out var version).ShouldBe(true, versionString);
SemanticVersion.TryParse(versionString, tagPrefixRegex, tag, out var version).ShouldBe(true, versionString);
Assert.AreEqual(major, version.Major);
Assert.AreEqual(minor, version.Minor);
Assert.AreEqual(patch, version.Patch);
Expand All @@ -58,7 +58,7 @@ public void ValidateVersionParsing(
[TestCase("some-T-ext")]
public void ValidateInvalidVersionParsing(string versionString)
{
Assert.IsFalse(SemanticVersion.TryParse(versionString, null, out _), "TryParse Result");
Assert.IsFalse(SemanticVersion.TryParse(versionString, null, null, out _), "TryParse Result");
}

[Test]
Expand All @@ -74,16 +74,16 @@ public void LegacySemVerTest()
[Test]
public void VersionSorting()
{
SemanticVersion.Parse("1.0.0", null).ShouldBeGreaterThan(SemanticVersion.Parse("1.0.0-beta", null));
SemanticVersion.Parse("1.0.0-beta.2", null).ShouldBeGreaterThan(SemanticVersion.Parse("1.0.0-beta.1", null));
SemanticVersion.Parse("1.0.0-beta.1", null).ShouldBeLessThan(SemanticVersion.Parse("1.0.0-beta.2", null));
SemanticVersion.Parse("1.0.0", null, null).ShouldBeGreaterThan(SemanticVersion.Parse("1.0.0-beta", null, null));
SemanticVersion.Parse("1.0.0-beta.2", null, null).ShouldBeGreaterThan(SemanticVersion.Parse("1.0.0-beta.1", null, null));
SemanticVersion.Parse("1.0.0-beta.1", null, null).ShouldBeLessThan(SemanticVersion.Parse("1.0.0-beta.2", null, null));
}

[Test]
public void ToStringJTests()
{
Assert.AreEqual("1.2.3", SemanticVersion.Parse("1.2.3", null).ToString("j"));
Assert.AreEqual("1.2.3", SemanticVersion.Parse("1.2.3-beta.4", null).ToString("j"));
Assert.AreEqual("1.2.3", SemanticVersion.Parse("1.2.3", null, null).ToString("j"));
Assert.AreEqual("1.2.3", SemanticVersion.Parse("1.2.3-beta.4", null, "beta").ToString("j"));
var fullSemVer = new SemanticVersion
{
Major = 1,
Expand All @@ -103,8 +103,8 @@ public void ToStringJTests()
[Test]
public void ToStringSTests()
{
Assert.AreEqual("1.2.3", SemanticVersion.Parse("1.2.3", null).ToString("s"));
Assert.AreEqual("1.2.3-beta.4", SemanticVersion.Parse("1.2.3-beta.4", null).ToString("s"));
Assert.AreEqual("1.2.3", SemanticVersion.Parse("1.2.3", null, null).ToString("s"));
Assert.AreEqual("1.2.3-beta.4", SemanticVersion.Parse("1.2.3-beta.4", null, null).ToString("s"));
var fullSemVer = new SemanticVersion
{
Major = 1,
Expand Down Expand Up @@ -139,8 +139,8 @@ public void ToStringSTests()
[Test]
public void ToStringLTests()
{
Assert.AreEqual("1.2.3", SemanticVersion.Parse("1.2.3", null).ToString("l"));
Assert.AreEqual("1.2.3-beta4", SemanticVersion.Parse("1.2.3-beta.4", null).ToString("l"));
Assert.AreEqual("1.2.3", SemanticVersion.Parse("1.2.3", null, null).ToString("l"));
Assert.AreEqual("1.2.3-beta4", SemanticVersion.Parse("1.2.3-beta.4", null, null).ToString("l"));
var fullSemVer = new SemanticVersion
{
Major = 1,
Expand All @@ -160,8 +160,8 @@ public void ToStringLTests()
[Test]
public void ToStringLpTests()
{
Assert.AreEqual("1.2.3", SemanticVersion.Parse("1.2.3", null).ToString("lp"));
Assert.AreEqual("1.2.3-beta0004", SemanticVersion.Parse("1.2.3-beta.4", null).ToString("lp"));
Assert.AreEqual("1.2.3", SemanticVersion.Parse("1.2.3", null, null).ToString("lp"));
Assert.AreEqual("1.2.3-beta0004", SemanticVersion.Parse("1.2.3-beta.4", null, null).ToString("lp"));
var fullSemVer = new SemanticVersion
{
Major = 1,
Expand All @@ -181,9 +181,9 @@ public void ToStringLpTests()
[Test]
public void ToStringTests()
{
Assert.AreEqual("1.2.3", SemanticVersion.Parse("1.2.3", null).ToString());
Assert.AreEqual("1.2.3-beta.4", SemanticVersion.Parse("1.2.3-beta.4", null).ToString());
Assert.AreEqual("1.2.3-beta.4", SemanticVersion.Parse("1.2.3-beta.4+5", null).ToString());
Assert.AreEqual("1.2.3", SemanticVersion.Parse("1.2.3", null, null).ToString());
Assert.AreEqual("1.2.3-beta.4", SemanticVersion.Parse("1.2.3-beta.4", null, null).ToString());
Assert.AreEqual("1.2.3-beta.4", SemanticVersion.Parse("1.2.3-beta.4+5", null, null).ToString());
var fullSemVer = new SemanticVersion
{
Major = 1,
Expand Down Expand Up @@ -218,9 +218,9 @@ public void ToStringTests()
[Test]
public void ToStringFTests()
{
Assert.AreEqual("1.2.3", SemanticVersion.Parse("1.2.3", null).ToString("f"));
Assert.AreEqual("1.2.3-beta.4", SemanticVersion.Parse("1.2.3-beta.4", null).ToString("f"));
Assert.AreEqual("1.2.3-beta.4+5", SemanticVersion.Parse("1.2.3-beta.4+5", null).ToString("f"));
Assert.AreEqual("1.2.3", SemanticVersion.Parse("1.2.3", null, null).ToString("f"));
Assert.AreEqual("1.2.3-beta.4", SemanticVersion.Parse("1.2.3-beta.4", null, null).ToString("f"));
Assert.AreEqual("1.2.3-beta.4+5", SemanticVersion.Parse("1.2.3-beta.4+5", null, null).ToString("f"));
var fullSemVer = new SemanticVersion
{
Major = 1,
Expand All @@ -240,9 +240,9 @@ public void ToStringFTests()
[Test]
public void ToStringITests()
{
Assert.AreEqual("1.2.3-beta.4", SemanticVersion.Parse("1.2.3-beta.4", null).ToString("i"));
Assert.AreEqual("1.2.3", SemanticVersion.Parse("1.2.3", null).ToString("i"));
Assert.AreEqual("1.2.3-beta.4+5", SemanticVersion.Parse("1.2.3-beta.4+5", null).ToString("i"));
Assert.AreEqual("1.2.3-beta.4", SemanticVersion.Parse("1.2.3-beta.4", null, null).ToString("i"));
Assert.AreEqual("1.2.3", SemanticVersion.Parse("1.2.3", null, null).ToString("i"));
Assert.AreEqual("1.2.3-beta.4+5", SemanticVersion.Parse("1.2.3-beta.4+5", null, null).ToString("i"));
var fullSemVer = new SemanticVersion
{
Major = 1,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ public void ShouldCreateAssemblyInfoFileWhenNotExistsAndEnsureAssemblyInfo(strin
var workingDir = Path.GetTempPath();
var assemblyInfoFile = "VersionAssemblyInfo." + fileExtension;
var fullPath = Path.Combine(workingDir, assemblyInfoFile);
var variables = variableProvider.GetVariablesFor(SemanticVersion.Parse("1.0.0", "v"), new TestEffectiveConfiguration(), false);
var variables = variableProvider.GetVariablesFor(SemanticVersion.Parse("1.0.0", "v", null), new TestEffectiveConfiguration(), false);

using var assemblyInfoFileUpdater = new AssemblyInfoFileUpdater(log, fileSystem);
assemblyInfoFileUpdater.Execute(variables, new AssemblyInfoContext(workingDir, true, assemblyInfoFile));
Expand All @@ -64,7 +64,7 @@ public void ShouldCreateAssemblyInfoFileAtPathWhenNotExistsAndEnsureAssemblyInfo
var workingDir = Path.GetTempPath();
var assemblyInfoFile = Path.Combine("src", "Project", "Properties", "VersionAssemblyInfo." + fileExtension);
var fullPath = Path.Combine(workingDir, assemblyInfoFile);
var variables = variableProvider.GetVariablesFor(SemanticVersion.Parse("1.0.0", "v"), new TestEffectiveConfiguration(), false);
var variables = variableProvider.GetVariablesFor(SemanticVersion.Parse("1.0.0", "v", null), new TestEffectiveConfiguration(), false);

using var assemblyInfoFileUpdater = new AssemblyInfoFileUpdater(log, fileSystem);
assemblyInfoFileUpdater.Execute(variables, new AssemblyInfoContext(workingDir, true, assemblyInfoFile));
Expand All @@ -85,7 +85,7 @@ public void ShouldCreateAssemblyInfoFilesAtPathWhenNotExistsAndEnsureAssemblyInf
"AssemblyInfo." + fileExtension,
Path.Combine("src", "Project", "Properties", "VersionAssemblyInfo." + fileExtension)
};
var variables = variableProvider.GetVariablesFor(SemanticVersion.Parse("1.0.0", "v"), new TestEffectiveConfiguration(), false);
var variables = variableProvider.GetVariablesFor(SemanticVersion.Parse("1.0.0", "v", null), new TestEffectiveConfiguration(), false);

using var assemblyInfoFileUpdater = new AssemblyInfoFileUpdater(log, fileSystem);
assemblyInfoFileUpdater.Execute(variables, new AssemblyInfoContext(workingDir, true, assemblyInfoFiles.ToArray()));
Expand All @@ -105,7 +105,7 @@ public void ShouldNotCreateAssemblyInfoFileWhenNotExistsAndNotEnsureAssemblyInfo
var workingDir = Path.GetTempPath();
var assemblyInfoFile = "VersionAssemblyInfo." + fileExtension;
var fullPath = Path.Combine(workingDir, assemblyInfoFile);
var variables = variableProvider.GetVariablesFor(SemanticVersion.Parse("1.0.0", "v"), new TestEffectiveConfiguration(), false);
var variables = variableProvider.GetVariablesFor(SemanticVersion.Parse("1.0.0", "v", null), new TestEffectiveConfiguration(), false);

using var assemblyInfoFileUpdater = new AssemblyInfoFileUpdater(log, fileSystem);
assemblyInfoFileUpdater.Execute(variables, new AssemblyInfoContext(workingDir, false, assemblyInfoFile));
Expand All @@ -120,7 +120,7 @@ public void ShouldNotCreateAssemblyInfoFileForUnknownSourceCodeAndEnsureAssembly
var workingDir = Path.GetTempPath();
var assemblyInfoFile = "VersionAssemblyInfo.js";
var fullPath = Path.Combine(workingDir, assemblyInfoFile);
var variables = variableProvider.GetVariablesFor(SemanticVersion.Parse("1.0.0", "v"), new TestEffectiveConfiguration(), false);
var variables = variableProvider.GetVariablesFor(SemanticVersion.Parse("1.0.0", "v", null), new TestEffectiveConfiguration(), false);

using var assemblyInfoFileUpdater = new AssemblyInfoFileUpdater(log, fileSystem);
assemblyInfoFileUpdater.Execute(variables, new AssemblyInfoContext(workingDir, true, assemblyInfoFile));
Expand All @@ -134,7 +134,7 @@ public void ShouldStartSearchFromWorkingDirectory()
fileSystem = Substitute.For<IFileSystem>();
var workingDir = Path.GetTempPath();
var assemblyInfoFiles = Array.Empty<string>();
var variables = variableProvider.GetVariablesFor(SemanticVersion.Parse("1.0.0", "v"), new TestEffectiveConfiguration(), false);
var variables = variableProvider.GetVariablesFor(SemanticVersion.Parse("1.0.0", "v", null), new TestEffectiveConfiguration(), false);

using var assemblyInfoFileUpdater = new AssemblyInfoFileUpdater(log, fileSystem);
assemblyInfoFileUpdater.Execute(variables, new AssemblyInfoContext(workingDir, false, assemblyInfoFiles.ToArray()));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -177,7 +177,7 @@ public void UpdateProjectXmlVersionElementWithStandardXmlInsertsElement(string x
{
using var projectFileUpdater = new ProjectFileUpdater(log, fileSystem);

var variables = variableProvider.GetVariablesFor(SemanticVersion.Parse("2.0.0", "v"), new TestEffectiveConfiguration(), false);
var variables = variableProvider.GetVariablesFor(SemanticVersion.Parse("2.0.0", "v", null), new TestEffectiveConfiguration(), false);
var xmlRoot = XElement.Parse(xml);
projectFileUpdater.UpdateProjectVersionElement(xmlRoot, ProjectFileUpdater.AssemblyVersionElement, variables.AssemblySemVer);

Expand Down Expand Up @@ -207,7 +207,7 @@ public void UpdateProjectXmlVersionElementWithStandardXmlModifiesElement(string
{
using var projectFileUpdater = new ProjectFileUpdater(log, fileSystem);

var variables = variableProvider.GetVariablesFor(SemanticVersion.Parse("2.0.0", "v"), new TestEffectiveConfiguration(), false);
var variables = variableProvider.GetVariablesFor(SemanticVersion.Parse("2.0.0", "v", null), new TestEffectiveConfiguration(), false);
var xmlRoot = XElement.Parse(xml);
projectFileUpdater.UpdateProjectVersionElement(xmlRoot, ProjectFileUpdater.AssemblyVersionElement, variables.AssemblySemVer);

Expand Down Expand Up @@ -240,7 +240,7 @@ public void UpdateProjectXmlVersionElementWithDuplicatePropertyGroupsModifiesLas
{
using var projectFileUpdater = new ProjectFileUpdater(log, fileSystem);

var variables = variableProvider.GetVariablesFor(SemanticVersion.Parse("2.0.0", "v"), new TestEffectiveConfiguration(), false);
var variables = variableProvider.GetVariablesFor(SemanticVersion.Parse("2.0.0", "v", null), new TestEffectiveConfiguration(), false);
var xmlRoot = XElement.Parse(xml);
projectFileUpdater.UpdateProjectVersionElement(xmlRoot, ProjectFileUpdater.AssemblyVersionElement, variables.AssemblySemVer);

Expand Down Expand Up @@ -275,7 +275,7 @@ public void UpdateProjectXmlVersionElementWithMultipleVersionElementsLastOneIsMo
{
using var projectFileUpdater = new ProjectFileUpdater(log, fileSystem);

var variables = variableProvider.GetVariablesFor(SemanticVersion.Parse("2.0.0", "v"), new TestEffectiveConfiguration(), false);
var variables = variableProvider.GetVariablesFor(SemanticVersion.Parse("2.0.0", "v", null), new TestEffectiveConfiguration(), false);
var xmlRoot = XElement.Parse(xml);
projectFileUpdater.UpdateProjectVersionElement(xmlRoot, ProjectFileUpdater.AssemblyVersionElement, variables.AssemblySemVer);

Expand Down
5 changes: 4 additions & 1 deletion src/GitVersionCore/Configuration/ConfigExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -126,7 +126,10 @@ public static string GetBranchSpecificTag(this EffectiveConfiguration configurat
}
if (tagToUse.Contains("{BranchName}"))
{
log.Info("Using branch name to calculate version tag");
if (log != null)
{
log.Info("Using branch name to calculate version tag");
}

var branchName = branchNameOverride ?? branchFriendlyName;
if (!string.IsNullOrWhiteSpace(configuration.BranchPrefixToTrim))
Expand Down
2 changes: 1 addition & 1 deletion src/GitVersionCore/Configuration/Init/SetNextVersion.cs
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ protected override StepResult HandleResult(string result, Queue<ConfigInitWizard
return StepResult.Ok();
}

if (!SemanticVersion.TryParse(result, string.Empty, out var semVer))
if (!SemanticVersion.TryParse(result, string.Empty, null, out var semVer))
return StepResult.InvalidResponseSelected();

config.NextVersion = semVer.ToString("t");
Expand Down
Loading