Skip to content

Commit 6abe670

Browse files
committed
Implement SemVer strict parsing
1 parent ebe272a commit 6abe670

19 files changed

+152
-86
lines changed

docs/input/docs/reference/configuration.md

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -543,7 +543,7 @@ branches:
543543

544544
Strategy which will look for tagged merge commits directly off the current
545545
branch. For example `develop` → `release/1.0.0` → merge into `main` and tag
546-
`1.0.0`. The tag is *not* on develop, but develop should be version `1.0.0` now.
546+
`1.0.0`. The tag is _not_ on develop, but develop should be version `1.0.0` now.
547547

548548
### tracks-release-branches
549549

@@ -572,6 +572,18 @@ is set, it would be added to the `PreReleaseNumber` to get a final
572572
`pre-release-weight` will be used in the calculation. Related Issues [1145]
573573
and [1366].
574574

575+
### semver-format
576+
577+
Specifies the semver format that is used when parsing the string.
578+
Can be `Strict` - using the [regex](https://regex101.com/r/Ly7O1x/3/)
579+
or `Loose` the old way of parsing. Example of invalid `Strict`, but valid `Loose`
580+
581+
```
582+
1.2-alpha4
583+
01.02.03-rc03
584+
1.2.3.4
585+
```
586+
575587
[1145]: https://github.com/GitTools/GitVersion/issues/1145
576588
[1366]: https://github.com/GitTools/GitVersion/issues/1366
577589
[2506]: https://github.com/GitTools/GitVersion/pull/2506#issuecomment-754754037

src/GitVersion.Core.Tests/Core/GitVersionExecutorTests.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -312,7 +312,7 @@ public void ConfigChangeInvalidatesCache()
312312
versionVariables.AssemblySemVer.ShouldBe("4.10.3.0");
313313

314314
var configPath = PathHelper.Combine(fixture.RepositoryPath, ConfigFileLocator.DefaultFileName);
315-
this.fileSystem.WriteAllText(configPath, "next-version: 5.0");
315+
this.fileSystem.WriteAllText(configPath, "next-version: 5.0.0");
316316

317317
gitVersionCalculator = GetGitVersionCalculator(gitVersionOptions, fs: this.fileSystem);
318318

src/GitVersion.Core.Tests/Helpers/TestEffectiveConfiguration.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ public TestEffectiveConfiguration(
6262
isRelease,
6363
commitDateFormat,
6464
updateBuildNumber,
65+
SemanticVersionFormat.Strict,
6566
0,
6667
0)
6768
{

src/GitVersion.Core.Tests/IntegrationTests/BranchWithoutCommitScenarios.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,8 @@ public void BranchVersionHavePrecedenceOverTagVersionIfVersionGreaterThanTag()
3131
fixture.Checkout("develop");
3232
fixture.MakeATaggedCommit("0.1.0-alpha.1"); // simulate merge from feature branch
3333

34-
fixture.Repository.CreateBranch("release/1.0");
35-
fixture.Checkout("release/1.0");
34+
fixture.Repository.CreateBranch("release/1.0.0");
35+
fixture.Checkout("release/1.0.0");
3636

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

src/GitVersion.Core.Tests/IntegrationTests/FeatureBranchScenarios.cs

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -263,7 +263,7 @@ public void ShouldPickUpVersionFromDevelopAfterReleaseBranchCreated()
263263
fixture.MakeACommit();
264264
fixture.BranchTo("develop");
265265
fixture.MakeACommit();
266-
fixture.BranchTo("release/1.0");
266+
fixture.BranchTo("release/1.0.0");
267267
fixture.MakeACommit();
268268
fixture.Checkout("develop");
269269
fixture.MakeACommit();
@@ -282,12 +282,12 @@ public void ShouldPickUpVersionFromDevelopAfterReleaseBranchMergedBack()
282282
fixture.MakeACommit();
283283
fixture.BranchTo("develop");
284284
fixture.MakeACommit();
285-
fixture.BranchTo("release/1.0");
285+
fixture.BranchTo("release/1.0.0");
286286
fixture.MakeACommit();
287287

288288
// merge release into develop
289289
fixture.Checkout("develop");
290-
fixture.MergeNoFF("release/1.0");
290+
fixture.MergeNoFF("release/1.0.0");
291291
fixture.AssertFullSemver("1.1.0-alpha.2");
292292

293293
// create a feature branch from develop and verify the version
@@ -317,7 +317,7 @@ public void ShouldPickUpVersionFromMainAfterReleaseBranchCreated()
317317
using var fixture = new EmptyRepositoryFixture();
318318
// Create release branch
319319
fixture.MakeACommit();
320-
fixture.BranchTo("release/1.0");
320+
fixture.BranchTo("release/1.0.0");
321321
fixture.MakeACommit();
322322
fixture.Checkout(MainBranch);
323323
fixture.MakeACommit();
@@ -348,12 +348,12 @@ public void ShouldPickUpVersionFromMainAfterReleaseBranchMergedBack()
348348
using var fixture = new EmptyRepositoryFixture();
349349
// Create release branch
350350
fixture.MakeACommit();
351-
fixture.BranchTo("release/1.0");
351+
fixture.BranchTo("release/1.0.0");
352352
fixture.MakeACommit();
353353

354354
// merge release into main
355355
fixture.Checkout(MainBranch);
356-
fixture.MergeNoFF("release/1.0");
356+
fixture.MergeNoFF("release/1.0.0");
357357
fixture.AssertFullSemver("1.0.1+2", config);
358358

359359
// create a feature branch from main and verify the version
@@ -372,7 +372,7 @@ public void ShouldPickUpVersionFromMainAfterReleaseBranchCreated()
372372
fixture.MakeACommit();
373373
fixture.BranchTo("develop");
374374
fixture.MakeACommit();
375-
fixture.BranchTo("release/1.0");
375+
fixture.BranchTo("release/1.0.0");
376376
fixture.MakeACommit();
377377
fixture.Checkout("develop");
378378
fixture.MakeACommit();
@@ -391,12 +391,12 @@ public void ShouldPickUpVersionFromDevelopAfterReleaseBranchMergedBack()
391391
fixture.MakeACommit();
392392
fixture.BranchTo("develop");
393393
fixture.MakeACommit();
394-
fixture.BranchTo("release/1.0");
394+
fixture.BranchTo("release/1.0.0");
395395
fixture.MakeACommit();
396396

397397
// merge release into develop
398398
fixture.Checkout("develop");
399-
fixture.MergeNoFF("release/1.0");
399+
fixture.MergeNoFF("release/1.0.0");
400400
fixture.AssertFullSemver("1.1.0-alpha.2");
401401

402402
// create a misnamed feature branch (i.e. it uses the default config) from develop and verify the version
@@ -427,7 +427,7 @@ public void ShouldPickUpVersionFromMainAfterReleaseBranchCreated()
427427
using var fixture = new EmptyRepositoryFixture();
428428
// Create release branch
429429
fixture.MakeACommit();
430-
fixture.BranchTo("release/1.0");
430+
fixture.BranchTo("release/1.0.0");
431431
fixture.MakeACommit();
432432
fixture.Checkout(MainBranch);
433433
fixture.MakeACommit();
@@ -458,12 +458,12 @@ public void ShouldPickUpVersionFromMainAfterReleaseBranchMergedBack()
458458
using var fixture = new EmptyRepositoryFixture();
459459
// Create release branch
460460
fixture.MakeACommit();
461-
fixture.BranchTo("release/1.0");
461+
fixture.BranchTo("release/1.0.0");
462462
fixture.MakeACommit();
463463

464464
// merge release into main
465465
fixture.Checkout(MainBranch);
466-
fixture.MergeNoFF("release/1.0");
466+
fixture.MergeNoFF("release/1.0.0");
467467
fixture.AssertFullSemver("1.0.1+2", config);
468468

469469
// create a misnamed feature branch (i.e. it uses the default config) from main and verify the version

src/GitVersion.Core.Tests/IntegrationTests/ReleaseBranchScenarios.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -485,11 +485,11 @@ public static void ReleaseBranchShouldUseBranchNameVersionDespiteBumpInPreviousC
485485
public void ReleaseBranchWithACommitShouldUseBranchNameVersionDespiteBumpInPreviousCommit()
486486
{
487487
using var fixture = new EmptyRepositoryFixture();
488-
fixture.Repository.MakeATaggedCommit("1.0");
488+
fixture.Repository.MakeATaggedCommit("1.0.0");
489489
fixture.Repository.MakeACommit("+semver:major");
490490
fixture.Repository.MakeACommit();
491491

492-
fixture.BranchTo("release/2.0");
492+
fixture.BranchTo("release/2.0.0");
493493

494494
fixture.Repository.MakeACommit();
495495

@@ -500,10 +500,10 @@ public void ReleaseBranchWithACommitShouldUseBranchNameVersionDespiteBumpInPrevi
500500
public void ReleaseBranchedAtCommitWithSemverMessageShouldUseBranchNameVersion()
501501
{
502502
using var fixture = new EmptyRepositoryFixture();
503-
fixture.Repository.MakeATaggedCommit("1.0");
503+
fixture.Repository.MakeATaggedCommit("1.0.0");
504504
fixture.Repository.MakeACommit("+semver:major");
505505

506-
fixture.BranchTo("release/2.0");
506+
fixture.BranchTo("release/2.0.0");
507507

508508
fixture.AssertFullSemver("2.0.0-beta.1+1");
509509
}

src/GitVersion.Core.Tests/IntegrationTests/RemoteRepositoryScenarios.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ public void GivenARemoteGitRepositoryWithCommitsThenClonedLocalShouldMatchRemote
2323
[Test]
2424
public void GivenARemoteGitRepositoryWithCommitsAndBranchesThenClonedLocalShouldMatchRemoteVersion()
2525
{
26-
const string targetBranch = "release-1.0";
26+
const string targetBranch = "release-1.0.0";
2727
using var fixture = new RemoteRepositoryFixture(
2828
path =>
2929
{

src/GitVersion.Core.Tests/IntegrationTests/SwitchingToGitFlowScenarios.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ public void WhenDevelopBranchedFromMainWithLegacyVersionTagsDevelopCanUseReachab
1313
{
1414
using var fixture = new EmptyRepositoryFixture();
1515
fixture.Repository.MakeCommits(5);
16-
fixture.Repository.MakeATaggedCommit("1.0.0.0");
16+
fixture.Repository.MakeATaggedCommit("1.0.0");
1717
fixture.Repository.MakeCommits(2);
1818
Commands.Checkout(fixture.Repository, fixture.Repository.CreateBranch("develop"));
1919
fixture.AssertFullSemver("1.1.0-alpha.2");

src/GitVersion.Core.Tests/Model/MergeMessageTests.cs

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -56,8 +56,8 @@ public void EmptyTagPrefix(string prefix)
5656
new object?[] { "Merge branch 'origin/feature/one'", "origin/feature/one", null, null },
5757
new object?[] { $"Merge tag 'v4.0.0' into {MainBranch}", "v4.0.0", MainBranch, new SemanticVersion(4) },
5858
new object?[] { $"Merge tag 'V4.0.0' into {MainBranch}", "V4.0.0", MainBranch, new SemanticVersion(4) },
59-
new object?[] { "Merge branch 'feature/4.1/one'", "feature/4.1/one", null, new SemanticVersion(4, 1) },
60-
new object?[] { "Merge branch 'origin/4.1/feature/one'", "origin/4.1/feature/one", null, new SemanticVersion(4, 1) },
59+
new object?[] { "Merge branch 'feature/4.1.0/one'", "feature/4.1.0/one", null, new SemanticVersion(4, 1) },
60+
new object?[] { "Merge branch 'origin/4.1.0/feature/one'", "origin/4.1.0/feature/one", null, new SemanticVersion(4, 1) },
6161
new object?[] { $"Merge tag 'v://10.10.10.10' into {MainBranch}", "v://10.10.10.10", MainBranch, null }
6262
};
6363

@@ -86,7 +86,7 @@ public void ParsesMergeMessage(
8686
new object?[] { "Merge pull request #1234 in feature/one", "feature/one", null, null, 1234 },
8787
new object?[] { "Merge pull request #1234 in v4.0.0", "v4.0.0", null, new SemanticVersion(4), 1234 },
8888
new object?[] { "Merge pull request #1234 from origin/feature/one", "origin/feature/one", null, null, 1234 },
89-
new object?[] { "Merge pull request #1234 in feature/4.1/one", "feature/4.1/one", null, new SemanticVersion(4,1), 1234 },
89+
new object?[] { "Merge pull request #1234 in feature/4.1.0/one", "feature/4.1.0/one", null, new SemanticVersion(4,1), 1234 },
9090
new object?[] { "Merge pull request #1234 in V://10.10.10.10", "V://10.10.10.10", null, null, 1234 },
9191
new object?[] { "Merge pull request #1234 from feature/one into dev", "feature/one", "dev", null, 1234 }
9292
};
@@ -116,8 +116,8 @@ public void ParsesGitHubPullMergeMessage(
116116
new object?[] { "Merge pull request #1234 from feature/one from feature/two to dev", "feature/two", "dev", null, 1234 },
117117
new object?[] { "Merge pull request #1234 in feature/one from feature/two to dev", "feature/two", "dev", null, 1234 },
118118
new object?[] { "Merge pull request #1234 in v4.0.0 from v4.1.0 to dev", "v4.1.0", "dev", new SemanticVersion(4,1), 1234 },
119-
new object?[] { "Merge pull request #1234 from origin/feature/one from origin/feature/4.2/two to dev", "origin/feature/4.2/two", "dev", new SemanticVersion(4,2), 1234 },
120-
new object?[] { "Merge pull request #1234 in feature/4.1/one from feature/4.2/two to dev", "feature/4.2/two", "dev", new SemanticVersion(4,2), 1234 },
119+
new object?[] { "Merge pull request #1234 from origin/feature/one from origin/feature/4.2.0/two to dev", "origin/feature/4.2.0/two", "dev", new SemanticVersion(4,2), 1234 },
120+
new object?[] { "Merge pull request #1234 in feature/4.1.0/one from feature/4.2.0/two to dev", "feature/4.2.0/two", "dev", new SemanticVersion(4,2), 1234 },
121121
new object?[] { $"Merge pull request #1234 from feature/one from feature/two to {MainBranch}" , "feature/two", MainBranch, null, 1234 },
122122
new object?[] { "Merge pull request #1234 in V4.1.0 from V://10.10.10.10 to dev", "V://10.10.10.10", "dev", null, 1234 },
123123
//TODO: Investigate successful bitbucket merge messages that may be invalid
@@ -147,11 +147,11 @@ public void ParsesBitBucketPullMergeMessage(
147147

148148
private static readonly object[] BitBucketPullMergeMessages_v7 =
149149
{
150-
new object[] { $@"Pull request #68: Release/2.2
150+
new object[] { $@"Pull request #68: Release/2.2.0
151151
152-
Merge in aaa/777 from release/2.2 to {MainBranch}
152+
Merge in aaa/777 from release/2.2.0 to {MainBranch}
153153
154-
* commit '750aa37753dec1a85b22cc16db851187649d9e97':", "release/2.2", MainBranch, new SemanticVersion(2,2), 68 }
154+
* commit '750aa37753dec1a85b22cc16db851187649d9e97':", "release/2.2.0", MainBranch, new SemanticVersion(2,2), 68 }
155155
};
156156

157157
[TestCaseSource(nameof(BitBucketPullMergeMessages_v7))]
@@ -179,8 +179,8 @@ public void ParsesBitBucketPullMergeMessage_v7(
179179
new object?[] { "Finish feature/one", "feature/one", null, null },
180180
new object?[] { "Finish origin/feature/one", "origin/feature/one", null, null },
181181
new object?[] { "Finish v4.0.0", "v4.0.0", null, new SemanticVersion(4) },
182-
new object?[] { "Finish feature/4.1/one", "feature/4.1/one", null, new SemanticVersion(4, 1) },
183-
new object?[] { "Finish origin/4.1/feature/one", "origin/4.1/feature/one", null, new SemanticVersion(4, 1) },
182+
new object?[] { "Finish feature/4.1.0/one", "feature/4.1.0/one", null, new SemanticVersion(4, 1) },
183+
new object?[] { "Finish origin/4.1.0/feature/one", "origin/4.1.0/feature/one", null, new SemanticVersion(4, 1) },
184184
new object?[] { "Finish V://10.10.10.10", "V://10.10.10.10", null, null },
185185
new object?[] { $"Finish V4.0.0 into {MainBranch}", "V4.0.0", MainBranch, new SemanticVersion(4) }
186186
};
@@ -210,8 +210,8 @@ public void ParsesSmartGitMergeMessage(
210210
new object?[] { "Merge remote-tracking branch 'origin/feature/one' into dev", "origin/feature/one", "dev", null },
211211
new object?[] { $"Merge remote-tracking branch 'v4.0.0' into {MainBranch}", "v4.0.0", MainBranch, new SemanticVersion(4) },
212212
new object?[] { $"Merge remote-tracking branch 'V4.0.0' into {MainBranch}", "V4.0.0", MainBranch, new SemanticVersion(4) },
213-
new object?[] { "Merge remote-tracking branch 'feature/4.1/one' into dev", "feature/4.1/one", "dev", new SemanticVersion(4, 1) },
214-
new object?[] { $"Merge remote-tracking branch 'origin/4.1/feature/one' into {MainBranch}", "origin/4.1/feature/one", MainBranch, new SemanticVersion(4, 1) },
213+
new object?[] { "Merge remote-tracking branch 'feature/4.1.0/one' into dev", "feature/4.1.0/one", "dev", new SemanticVersion(4, 1) },
214+
new object?[] { $"Merge remote-tracking branch 'origin/4.1.0/feature/one' into {MainBranch}", "origin/4.1.0/feature/one", MainBranch, new SemanticVersion(4, 1) },
215215
new object?[] { $"Merge remote-tracking branch 'v://10.10.10.10' into {MainBranch}", "v://10.10.10.10", MainBranch, null }
216216
};
217217

@@ -321,7 +321,7 @@ public void MatchesCaptureGroupsFromCustomMessages()
321321
};
322322
const int pr = 1234;
323323
const string target = MainBranch;
324-
const string source = "feature/2.0/example";
324+
const string source = "feature/2.0.0/example";
325325

326326
// Act
327327
var sut = new MergeMessage($"Merged PR #{pr} into {target} from {source}", this.config);

0 commit comments

Comments
 (0)