Skip to content

Commit 84ad565

Browse files
committed
Ability to merge release back to develop
This preserves the correct version when merging a release back into develop. This also changes the semantics of the 0+1 part of the semantic version so that it represents the number of changes since the previous tagged release (e.g. version 1.0.0-beta.1+5 gets reset to 1.0.0-beta.2+0)
1 parent 2dc206d commit 84ad565

File tree

5 files changed

+59
-44
lines changed

5 files changed

+59
-44
lines changed

AcceptanceTests/GitFlow/PatchScenarios.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ public void PatchLatestReleaseExample()
2020
fixture.Repository.MakeACommit();
2121
fixture.AssertFullSemver("1.2.1-beta.1+1");
2222
fixture.Repository.ApplyTag("1.2.1-beta.1");
23-
fixture.AssertFullSemver("1.2.1-beta.2+1");
23+
fixture.AssertFullSemver("1.2.1-beta.1+1");
2424

2525
// Merge hotfix branch to master
2626
fixture.Repository.Checkout("master");

AcceptanceTests/GitFlow/UncycloScenarios.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ public void MinorReleaseExample()
7676

7777
// Apply beta.0 tag
7878
fixture.Repository.ApplyTag("1.3.0-beta.1");
79-
fixture.ExecuteGitVersion().OutputVariables[VariableProvider.FullSemVer].ShouldBe("1.3.0-beta.2+1");
79+
fixture.ExecuteGitVersion().OutputVariables[VariableProvider.FullSemVer].ShouldBe("1.3.0-beta.1+1");
8080

8181
// Merge release branch to master
8282
fixture.Repository.Checkout("master");

AcceptanceTests/GitHubFlow/ReleaseBranchTests.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ public void WhenReleaseBranchIsMergedIntoMasterVersionIsTakenWithIt()
4848
}
4949
}
5050

51-
[Fact(Skip = "Not supported yet")]
51+
[Fact]
5252
public void WhenMergingReleaseBackToDevShouldNotResetBetaVersion()
5353
{
5454
using (var fixture = new EmptyRepositoryFixture())
@@ -71,7 +71,7 @@ public void WhenMergingReleaseBackToDevShouldNotResetBetaVersion()
7171

7272
fixture.Repository.MakeCommits(1);
7373

74-
VerifyVersion(fixture, "2.0.0-beta.2+2");
74+
VerifyVersion(fixture, "2.0.0-beta.2+0");
7575

7676
//merge down to develop
7777
fixture.Repository.Checkout("develop");
@@ -80,7 +80,7 @@ public void WhenMergingReleaseBackToDevShouldNotResetBetaVersion()
8080
//but keep working on the release
8181
fixture.Repository.Checkout("release-2.0.0");
8282

83-
VerifyVersion(fixture, "2.0.0-beta.2+2");
83+
VerifyVersion(fixture, "2.0.0-beta.2+0");
8484
}
8585
}
8686

GitVersionCore/GitFlow/BranchFinders/OptionallyTaggedBranchVersionFinderBase.cs

Lines changed: 37 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ protected SemanticVersion FindVersion(
1212
BranchType branchType,
1313
string baseBranchName)
1414
{
15-
var nbHotfixCommits = NumberOfCommitsInBranchNotKnownFromBaseBranch(context.Repository, context.CurrentBranch, branchType, baseBranchName);
1615

1716
var versionString = context.CurrentBranch.GetSuffix(branchType);
1817
if (!versionString.Contains("."))
@@ -28,7 +27,12 @@ protected SemanticVersion FindVersion(
2827
if (branchType == BranchType.Unknown)
2928
version.PreReleaseTag = context.CurrentBranch.Name.Replace("-" + versionString, string.Empty) + ".1";
3029

31-
var tagVersion = RetrieveMostRecentOptionalTagVersion(context.Repository, version, context.CurrentBranch.Commits.Take(nbHotfixCommits + 1));
30+
var tagsApplicableToBranchVersion = context.Repository.SemVerTagsRelatedToVersion(version).OrderByDescending(tag => SemanticVersion.Parse(tag.Name)).ToList();
31+
var latestTaggedCommit = tagsApplicableToBranchVersion.Select(tag => tag.Target).FirstOrDefault();
32+
33+
var numberOfCommitsSinceLastTagOrBranchPoint = NumberOfCommitsSinceLastTagOrBranchPoint(context, tagsApplicableToBranchVersion, branchType, baseBranchName);
34+
35+
var tagVersion = RetrieveMostRecentOptionalTagVersion(tagsApplicableToBranchVersion);
3236

3337
var sha = context.CurrentCommit.Sha;
3438
var releaseDate = ReleaseDateFinder.Execute(context.Repository, sha, version.Patch);
@@ -39,63 +43,57 @@ protected SemanticVersion FindVersion(
3943
Patch = version.Patch,
4044
PreReleaseTag = version.PreReleaseTag,
4145
BuildMetaData = new SemanticVersionBuildMetaData(
42-
nbHotfixCommits, context.CurrentBranch.Name, releaseDate)
46+
numberOfCommitsSinceLastTagOrBranchPoint, context.CurrentBranch.Name, releaseDate)
4347
};
4448

4549
if (tagVersion != null)
4650
{
47-
tagVersion.PreReleaseTag.Number++;
51+
if (latestTaggedCommit != context.CurrentCommit)
52+
{
53+
tagVersion.PreReleaseTag.Number++;
54+
}
4855
semanticVersion.PreReleaseTag = tagVersion.PreReleaseTag;
4956
}
5057

5158
return semanticVersion;
59+
5260
}
5361

54-
bool IsMostRecentCommitTagged(GitVersionContext context, out SemanticVersion version)
62+
SemanticVersion RetrieveMostRecentOptionalTagVersion(IEnumerable<Tag> tagsApplicableToBranchVersion)
5563
{
56-
var currentCommit = context.CurrentBranch.Commits.First();
64+
return tagsApplicableToBranchVersion.Select(tag => SemanticVersion.Parse(tag.Name)).OrderByDescending(version => version).FirstOrDefault();
65+
}
5766

58-
var tags = context.Repository.Tags
59-
.Where(tag => tag.PeeledTarget() == currentCommit)
60-
.ToList();
6167

62-
foreach (var tag in tags)
68+
int NumberOfCommitsSinceLastTagOrBranchPoint(GitVersionContext context, ICollection<Tag> tagsInDescVersionOrder, BranchType branchType, string baseBranchName)
69+
{
70+
if (!tagsInDescVersionOrder.Any())
6371
{
64-
if (SemanticVersion.TryParse(tag.Name, out version))
65-
{
66-
return true;
67-
}
72+
return NumberOfCommitsInBranchNotKnownFromBaseBranch(context.Repository, context.CurrentBranch, branchType, baseBranchName);
6873
}
69-
70-
version = null;
71-
return false;
72-
}
73-
74-
SemanticVersion RetrieveMostRecentOptionalTagVersion(
75-
IRepository repository, SemanticVersion branchVersion, IEnumerable<Commit> take)
76-
{
77-
foreach (var commit in take)
74+
75+
var mostRecentTag = tagsInDescVersionOrder.First();
76+
var ancestor = mostRecentTag;
77+
if (mostRecentTag.Target == context.CurrentCommit)
7878
{
79-
foreach (var tag in repository.TagsByDate(commit))
79+
var previousTag = tagsInDescVersionOrder.Skip(1).FirstOrDefault();
80+
if (previousTag != null)
8081
{
81-
SemanticVersion version;
82-
if (!SemanticVersion.TryParse(tag.Name, out version))
83-
{
84-
continue;
85-
}
86-
87-
if (branchVersion.Major != version.Major ||
88-
branchVersion.Minor != version.Minor ||
89-
branchVersion.Patch != version.Patch)
90-
{
91-
continue;
92-
}
93-
94-
return version;
82+
ancestor = previousTag;
83+
}
84+
else
85+
{
86+
return NumberOfCommitsInBranchNotKnownFromBaseBranch(context.Repository, context.CurrentBranch, branchType, baseBranchName);
9587
}
9688
}
89+
var filter = new CommitFilter
90+
{
91+
Since = context.CurrentCommit,
92+
Until = ancestor.Target,
93+
SortBy = CommitSortStrategies.Topological | CommitSortStrategies.Time
94+
};
9795

98-
return null;
96+
return context.Repository.Commits.QueryBy(filter).Count() - 1;
9997
}
10098

10199
void EnsureVersionIsValid(SemanticVersion version, Branch branch, BranchType branchType)

GitVersionCore/LibGitExtensions.cs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,23 @@ public static SemanticVersion NewestSemVerTag(this IRepository repository, Commi
3737
return null;
3838
}
3939

40+
public static IEnumerable<Tag> SemVerTagsRelatedToVersion(this IRepository repository, SemanticVersion version)
41+
{
42+
foreach (var tag in repository.Tags)
43+
{
44+
SemanticVersion tagVersion = null;
45+
if (SemanticVersion.TryParse(tag.Name, out tagVersion))
46+
{
47+
if (version.Major == tagVersion.Major &&
48+
version.Minor == tagVersion.Minor &&
49+
version.Patch == tagVersion.Patch)
50+
{
51+
yield return tag;
52+
}
53+
}
54+
}
55+
}
56+
4057
public static IEnumerable<Tag> TagsByDate(this IRepository repository, Commit commit)
4158
{
4259
return repository.Tags

0 commit comments

Comments
 (0)