diff --git a/src/Cli/AppRunner.cs b/src/Cli/AppRunner.cs index a342b64..8ce0ff8 100644 --- a/src/Cli/AppRunner.cs +++ b/src/Cli/AppRunner.cs @@ -98,8 +98,8 @@ namespace Cli .Title("[red]Error evaluating version from newest tag.[/]\nAdd new version tag **AND** push to origin?)") .PageSize(10) .AddChoices( - new Selection("yes", new Version(0, 1, 0)), - new Selection("yes", new Version(0, 1, 0, 1)), + new Selection("yes", new Version(0, 1, 0, true)), + new Selection("yes", new Version(0, 1, 0, 1, true)), new Selection("no", null) ) ); diff --git a/src/Cli/Cli.csproj b/src/Cli/Cli.csproj index 7a8d774..2c9a5ac 100644 --- a/src/Cli/Cli.csproj +++ b/src/Cli/Cli.csproj @@ -9,7 +9,7 @@ Novaloop.UpdateTag Updates the tag of a repo to the next chosen version according the semver symantic. semver;update-tag;tag;git - 0.3.1 + 0.4.0 Matthias Langhard Novaloop AG https://gitlab.com/novaloop-oss/novaloop.update-tag diff --git a/src/Core/Models/Version.cs b/src/Core/Models/Version.cs index f7ee780..6a5030d 100644 --- a/src/Core/Models/Version.cs +++ b/src/Core/Models/Version.cs @@ -13,37 +13,41 @@ namespace Application.Models /// public class Version { - public Version(int major, int minor, int patch) + public Version(int major, int minor, int patch, bool hasVPrefix) { Major = major; Minor = minor; Patch = patch; + _hasVPrefix = hasVPrefix; } - public Version(int major, int minor, int patch, int? rc) + public Version(int major, int minor, int patch, int? rc, bool hasVPrefix) { Major = major; Minor = minor; Patch = patch; Rc = rc; + _hasVPrefix = hasVPrefix; } - public Version(int major, int minor, int patch, string rc, string service) + public Version(int major, int minor, int patch, string rc, string service, bool hasVPrefix) { Major = major; Minor = minor; Patch = patch; Rc = rc == null ? null : ExtractNumberFromRcString(rc); Service = service ?? ""; + _hasVPrefix = hasVPrefix; } - public Version(int major, int minor, int patch, int? rc, string service) + public Version(int major, int minor, int patch, int? rc, string service, bool hasVPrefix) { Major = major; Minor = minor; Patch = patch; Rc = rc; Service = service ?? ""; + _hasVPrefix = hasVPrefix; } private static int? ExtractNumberFromRcString(string rc) @@ -58,12 +62,16 @@ namespace Application.Models public int Patch { get; private set; } public int? Rc { get; private set; } public string Service { get; private set; } - + private readonly bool _hasVPrefix; public override string ToString() { var sb = new StringBuilder(); - sb.Append('v'); + if (_hasVPrefix) + { + sb.Append('v'); + } + sb.Append(Major); sb.Append('.'); sb.Append(Minor); @@ -88,7 +96,7 @@ namespace Application.Models private Version Copy() { - return new Version(Major, Minor, Patch, Rc, Service); + return new Version(Major, Minor, Patch, Rc, Service, _hasVPrefix); } public Version NextMajor() @@ -191,7 +199,7 @@ namespace Application.Models throw new ArgumentException("Cannot release RC. Not an RC."); } - var nextVersion = new Version(Major, Minor, Patch, (string)null, Service); + var nextVersion = new Version(Major, Minor, Patch, (string)null, Service, _hasVPrefix); return nextVersion; } diff --git a/src/Infrastructure/Services/GitRepoReadService.cs b/src/Infrastructure/Services/GitRepoReadService.cs index 6f8b99b..1a7808f 100644 --- a/src/Infrastructure/Services/GitRepoReadService.cs +++ b/src/Infrastructure/Services/GitRepoReadService.cs @@ -1,3 +1,4 @@ +using System; using System.Collections.Generic; using System.Threading.Tasks; using Application.Interfaces; @@ -27,21 +28,23 @@ namespace Infrastructure.Services { if (TryParse(tag.FriendlyName, out var semver)) { - yield return new Version(semver.Major, semver.Minor, semver.Patch, semver.Prerelease, semver.Build); + yield return semver; } } } - private static bool TryParse(string version, out SemVersion semverVersion) + private static bool TryParse(string versionStr, out Version version) { try { - semverVersion = SemVersion.Parse(version.TrimStart('v').TrimStart('V')); + var semver = SemVersion.Parse(versionStr.TrimStart('v').TrimStart('V')); + var hasVPrefix = versionStr.StartsWith("v", StringComparison.InvariantCultureIgnoreCase); + version = new Version(semver.Major, semver.Minor, semver.Patch, semver.Prerelease, semver.Build, hasVPrefix); return true; } catch { - semverVersion = null; + version = null; return false; } } diff --git a/tests/update-tag.tests/GetVersionInformationFromRepoTests.cs b/tests/update-tag.tests/GetVersionInformationFromRepoTests.cs index f153d02..b41c22e 100644 --- a/tests/update-tag.tests/GetVersionInformationFromRepoTests.cs +++ b/tests/update-tag.tests/GetVersionInformationFromRepoTests.cs @@ -16,12 +16,12 @@ namespace UpdateTag.Tests // Arrange var mockedVersionList = new List { - new Version(0, 1, 5), - new Version(0, 1, 7), - new Version(0, 2, 0), - new Version(0, 2, 0, 0), - new Version(0, 2, 0, 1), - new Version(0, 2, 0, 2) + new Version(0, 1, 5, false), + new Version(0, 1, 7, false), + new Version(0, 2, 0, false), + new Version(0, 2, 0, 0, false), + new Version(0, 2, 0, 1, false), + new Version(0, 2, 0, 2, false) }; var gitRepoMock = new Mock(); gitRepoMock.Setup(m => m.GetAllVersions(It.IsAny())) @@ -33,7 +33,31 @@ namespace UpdateTag.Tests var versionInformation = await handler.Handle(query, CancellationToken.None); // Assert - Assert.Equal("v0.2.0", versionInformation.CurrentVersion.ToString()); + Assert.Equal("0.2.0", versionInformation.CurrentVersion.ToString()); + } + + [Theory] + [InlineData(0, 2, 0, true, "v0.2.0")] + [InlineData(0, 2, 0, false, "0.2.0")] + public async void AddVPrefixToNextVersionIfCurrentVersionHasOne(int major, int minor, int patch, bool hasVPrefix, + string expectedVersionOutput) + { + // Arrange + var mockedVersionList = new List + { + new Version(major, minor, patch, hasVPrefix) + }; + var gitRepoMock = new Mock(); + gitRepoMock.Setup(m => m.GetAllVersions(It.IsAny())) + .Returns(mockedVersionList); + var handler = new GetVersionInformationFromRepo(gitRepoMock.Object); + var query = new GetVersionInformationFromRepo.Query(""); + + // Act + var versionInformation = await handler.Handle(query, CancellationToken.None); + + // Assert + Assert.Equal(expectedVersionOutput, versionInformation.CurrentVersion.ToString()); } } } \ No newline at end of file diff --git a/tests/update-tag.tests/VersionInformationTests.cs b/tests/update-tag.tests/VersionInformationTests.cs index 4c546e5..e719b87 100644 --- a/tests/update-tag.tests/VersionInformationTests.cs +++ b/tests/update-tag.tests/VersionInformationTests.cs @@ -11,15 +11,15 @@ namespace UpdateTag.Tests { // Arrange - var version = new Version(1, 0, 1, 1); + var version = new Version(1, 0, 1, 1, false); // Act var versionInformation = new VersionInformation(version); var versions = versionInformation.NextVersions.Select(nv => nv.Version.ToString()).ToList(); // Assert - Assert.Contains("v1.0.1-RC.2", versions); // next rc - Assert.Contains("v1.0.1", versions); // release rc + Assert.Contains("1.0.1-RC.2", versions); // next rc + Assert.Contains("1.0.1", versions); // release rc Assert.Equal(2, versions.Count); } @@ -28,7 +28,7 @@ namespace UpdateTag.Tests { // Arrange - var version = new Version(1, 0, 1); + var version = new Version(1, 0, 1, false); // Act var versionInformation = new VersionInformation(version); @@ -36,12 +36,12 @@ namespace UpdateTag.Tests // Assert - Assert.Contains("v1.0.2-RC.0", versions); // patch RC - Assert.Contains("v1.1.0-RC.0", versions); // minor RC - Assert.Contains("v2.0.0-RC.0", versions); // major RC - Assert.Contains("v1.0.2", versions); // next patch - Assert.Contains("v1.1.0", versions); // next minor - Assert.Contains("v2.0.0", versions); // next major + Assert.Contains("1.0.2-RC.0", versions); // patch RC + Assert.Contains("1.1.0-RC.0", versions); // minor RC + Assert.Contains("2.0.0-RC.0", versions); // major RC + Assert.Contains("1.0.2", versions); // next patch + Assert.Contains("1.1.0", versions); // next minor + Assert.Contains("2.0.0", versions); // next major Assert.Equal(6, versions.Count); } } diff --git a/tests/update-tag.tests/VersionTests.cs b/tests/update-tag.tests/VersionTests.cs index 8b72bb4..4902c1a 100644 --- a/tests/update-tag.tests/VersionTests.cs +++ b/tests/update-tag.tests/VersionTests.cs @@ -6,82 +6,82 @@ namespace UpdateTag.Tests public class VersionTests { [Theory] - [InlineData(1, 0, 0, "", "", "v2.0.0")] - [InlineData(1, 1, 0, "", "", "v2.0.0")] - [InlineData(1, 1, 1, "", "", "v2.0.0")] + [InlineData(1, 0, 0, "", "", "2.0.0")] + [InlineData(1, 1, 0, "", "", "2.0.0")] + [InlineData(1, 1, 1, "", "", "2.0.0")] public void NextMajor(int major, int minor, int patch, string rc, string service, string expected) { - var version = new Version(major, minor, patch, rc, service).NextMajor(); + var version = new Version(major, minor, patch, rc, service, false).NextMajor(); Assert.Equal(expected, version.ToString()); } [Theory] - [InlineData(1, 0, 0, "", "", "v1.1.0")] - [InlineData(1, 1, 0, "", "", "v1.2.0")] - [InlineData(1, 1, 1, "", "", "v1.2.0")] + [InlineData(1, 0, 0, "", "", "1.1.0")] + [InlineData(1, 1, 0, "", "", "1.2.0")] + [InlineData(1, 1, 1, "", "", "1.2.0")] public void NextMinor(int major, int minor, int patch, string rc, string service, string expected) { - var version = new Version(major, minor, patch, rc, service).NextMinor(); + var version = new Version(major, minor, patch, rc, service, false).NextMinor(); Assert.Equal(expected, version.ToString()); } [Theory] - [InlineData(1, 0, 0, "", "", "v1.0.1")] - [InlineData(1, 1, 0, "", "", "v1.1.1")] - [InlineData(1, 1, 1, "", "", "v1.1.2")] + [InlineData(1, 0, 0, "", "", "1.0.1")] + [InlineData(1, 1, 0, "", "", "1.1.1")] + [InlineData(1, 1, 1, "", "", "1.1.2")] public void NextPatch(int major, int minor, int patch, string rc, string service, string expected) { - var version = new Version(major, minor, patch, rc, service).NextPatch(); + var version = new Version(major, minor, patch, rc, service, false).NextPatch(); Assert.Equal(expected, version.ToString()); } [Theory] - [InlineData(1, 1, 1, "RC.4", "", "v1.1.1-RC.5")] - [InlineData(1, 1, 1, "RC.4", "ErpNext", "v1.1.1-RC.5+ErpNext")] + [InlineData(1, 1, 1, "RC.4", "", "1.1.1-RC.5")] + [InlineData(1, 1, 1, "RC.4", "ErpNext", "1.1.1-RC.5+ErpNext")] public void NextRc(int major, int minor, int patch, string rc, string service, string expected) { - var version = new Version(major, minor, patch, rc, service).NextRc(); + var version = new Version(major, minor, patch, rc, service, false).NextRc(); Assert.Equal(expected, version.ToString()); } [Theory] - [InlineData(1, 1, 1, null, "", "v1.1.2-RC.0")] - [InlineData(1, 1, 1, null, "ErpNext", "v1.1.2-RC.0+ErpNext")] + [InlineData(1, 1, 1, null, "", "1.1.2-RC.0")] + [InlineData(1, 1, 1, null, "ErpNext", "1.1.2-RC.0+ErpNext")] public void CreatePatchRc(int major, int minor, int patch, string rc, string service, string expected) { - var version = new Version(major, minor, patch, rc, service).CreatePatchRc(); + var version = new Version(major, minor, patch, rc, service, false).CreatePatchRc(); Assert.Equal(expected, version.ToString()); } [Theory] - [InlineData(1, 1, 1, null, "", "v1.2.0-RC.0")] - [InlineData(1, 1, 1, null, "ErpNext", "v1.2.0-RC.0+ErpNext")] + [InlineData(1, 1, 1, null, "", "1.2.0-RC.0")] + [InlineData(1, 1, 1, null, "ErpNext", "1.2.0-RC.0+ErpNext")] public void CreateMinorRc(int major, int minor, int patch, string rc, string service, string expected) { - var version = new Version(major, minor, patch, rc, service).CreateMinorRc(); + var version = new Version(major, minor, patch, rc, service, false).CreateMinorRc(); Assert.Equal(expected, version.ToString()); } [Theory] - [InlineData(1, 1, 1, null, "", "v2.0.0-RC.0")] - [InlineData(1, 1, 1, null, "ErpNext", "v2.0.0-RC.0+ErpNext")] + [InlineData(1, 1, 1, null, "", "2.0.0-RC.0")] + [InlineData(1, 1, 1, null, "ErpNext", "2.0.0-RC.0+ErpNext")] public void CreateMajroRc(int major, int minor, int patch, string rc, string service, string expected) { - var version = new Version(major, minor, patch, rc, service).CreateMajorRc(); + var version = new Version(major, minor, patch, rc, service, false).CreateMajorRc(); Assert.Equal(expected, version.ToString()); } [Theory] - [InlineData(1, 1, 1, "RC.4", "", "v1.1.1")] - [InlineData(1, 1, 1, "RC.4", "ErpNext", "v1.1.1+ErpNext")] + [InlineData(1, 1, 1, "RC.4", "", "1.1.1")] + [InlineData(1, 1, 1, "RC.4", "ErpNext", "1.1.1+ErpNext")] public void ReleaseRc(int major, int minor, int patch, string rc, string service, string expected) { - var version = new Version(major, minor, patch, rc, service).ReleaseRc(); + var version = new Version(major, minor, patch, rc, service, false).ReleaseRc(); Assert.Equal(expected, version.ToString()); } }