From dcb73812a73a944f484157e98fc07b657297a6b2 Mon Sep 17 00:00:00 2001 From: Jan Trebschuh Date: Tue, 13 Jun 2023 14:50:25 +0200 Subject: [PATCH 1/3] Setup Test for VersionPrefix and VersionSuffix Parsing --- dotnet-version-cli.sln | 56 ++++++++++++++-------------- test/CsProj/ProjectFileParserTest.cs | 34 +++++++++++++++++ 2 files changed, 62 insertions(+), 28 deletions(-) diff --git a/dotnet-version-cli.sln b/dotnet-version-cli.sln index 3d65f39..f40221e 100755 --- a/dotnet-version-cli.sln +++ b/dotnet-version-cli.sln @@ -1,10 +1,10 @@ Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 15 -VisualStudioVersion = 15.0.26228.4 +# Visual Studio Version 17 +VisualStudioVersion = 17.6.33723.286 MinimumVisualStudioVersion = 15.0.26124.0 -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "dotnet-version", "src\dotnet-version.csproj", "{F030BEE0-CA2F-43E2-A099-0EA07FD45393}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "dotnet-version", "src\dotnet-version.csproj", "{1AE7AFF7-E333-4205-AA1B-B8A8A79B4A87}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "dotnet-version-test", "test\dotnet-version-test.csproj", "{93AA179C-46C2-402A-BA58-7168F7F81FE2}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "dotnet-version-test", "test\dotnet-version-test.csproj", "{FB420ACF-9E12-42B6-B724-1EEE9CBF251E}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -16,30 +16,30 @@ Global Release|x86 = Release|x86 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution - {F030BEE0-CA2F-43E2-A099-0EA07FD45393}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {F030BEE0-CA2F-43E2-A099-0EA07FD45393}.Debug|Any CPU.Build.0 = Debug|Any CPU - {F030BEE0-CA2F-43E2-A099-0EA07FD45393}.Debug|x64.ActiveCfg = Debug|Any CPU - {F030BEE0-CA2F-43E2-A099-0EA07FD45393}.Debug|x64.Build.0 = Debug|Any CPU - {F030BEE0-CA2F-43E2-A099-0EA07FD45393}.Debug|x86.ActiveCfg = Debug|Any CPU - {F030BEE0-CA2F-43E2-A099-0EA07FD45393}.Debug|x86.Build.0 = Debug|Any CPU - {F030BEE0-CA2F-43E2-A099-0EA07FD45393}.Release|Any CPU.ActiveCfg = Release|Any CPU - {F030BEE0-CA2F-43E2-A099-0EA07FD45393}.Release|Any CPU.Build.0 = Release|Any CPU - {F030BEE0-CA2F-43E2-A099-0EA07FD45393}.Release|x64.ActiveCfg = Release|Any CPU - {F030BEE0-CA2F-43E2-A099-0EA07FD45393}.Release|x64.Build.0 = Release|Any CPU - {F030BEE0-CA2F-43E2-A099-0EA07FD45393}.Release|x86.ActiveCfg = Release|Any CPU - {F030BEE0-CA2F-43E2-A099-0EA07FD45393}.Release|x86.Build.0 = Release|Any CPU - {93AA179C-46C2-402A-BA58-7168F7F81FE2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {93AA179C-46C2-402A-BA58-7168F7F81FE2}.Debug|Any CPU.Build.0 = Debug|Any CPU - {93AA179C-46C2-402A-BA58-7168F7F81FE2}.Debug|x64.ActiveCfg = Debug|Any CPU - {93AA179C-46C2-402A-BA58-7168F7F81FE2}.Debug|x64.Build.0 = Debug|Any CPU - {93AA179C-46C2-402A-BA58-7168F7F81FE2}.Debug|x86.ActiveCfg = Debug|Any CPU - {93AA179C-46C2-402A-BA58-7168F7F81FE2}.Debug|x86.Build.0 = Debug|Any CPU - {93AA179C-46C2-402A-BA58-7168F7F81FE2}.Release|Any CPU.ActiveCfg = Release|Any CPU - {93AA179C-46C2-402A-BA58-7168F7F81FE2}.Release|Any CPU.Build.0 = Release|Any CPU - {93AA179C-46C2-402A-BA58-7168F7F81FE2}.Release|x64.ActiveCfg = Release|Any CPU - {93AA179C-46C2-402A-BA58-7168F7F81FE2}.Release|x64.Build.0 = Release|Any CPU - {93AA179C-46C2-402A-BA58-7168F7F81FE2}.Release|x86.ActiveCfg = Release|Any CPU - {93AA179C-46C2-402A-BA58-7168F7F81FE2}.Release|x86.Build.0 = Release|Any CPU + {1AE7AFF7-E333-4205-AA1B-B8A8A79B4A87}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {1AE7AFF7-E333-4205-AA1B-B8A8A79B4A87}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1AE7AFF7-E333-4205-AA1B-B8A8A79B4A87}.Debug|x64.ActiveCfg = Debug|Any CPU + {1AE7AFF7-E333-4205-AA1B-B8A8A79B4A87}.Debug|x64.Build.0 = Debug|Any CPU + {1AE7AFF7-E333-4205-AA1B-B8A8A79B4A87}.Debug|x86.ActiveCfg = Debug|Any CPU + {1AE7AFF7-E333-4205-AA1B-B8A8A79B4A87}.Debug|x86.Build.0 = Debug|Any CPU + {1AE7AFF7-E333-4205-AA1B-B8A8A79B4A87}.Release|Any CPU.ActiveCfg = Release|Any CPU + {1AE7AFF7-E333-4205-AA1B-B8A8A79B4A87}.Release|Any CPU.Build.0 = Release|Any CPU + {1AE7AFF7-E333-4205-AA1B-B8A8A79B4A87}.Release|x64.ActiveCfg = Release|Any CPU + {1AE7AFF7-E333-4205-AA1B-B8A8A79B4A87}.Release|x64.Build.0 = Release|Any CPU + {1AE7AFF7-E333-4205-AA1B-B8A8A79B4A87}.Release|x86.ActiveCfg = Release|Any CPU + {1AE7AFF7-E333-4205-AA1B-B8A8A79B4A87}.Release|x86.Build.0 = Release|Any CPU + {FB420ACF-9E12-42B6-B724-1EEE9CBF251E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {FB420ACF-9E12-42B6-B724-1EEE9CBF251E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {FB420ACF-9E12-42B6-B724-1EEE9CBF251E}.Debug|x64.ActiveCfg = Debug|Any CPU + {FB420ACF-9E12-42B6-B724-1EEE9CBF251E}.Debug|x64.Build.0 = Debug|Any CPU + {FB420ACF-9E12-42B6-B724-1EEE9CBF251E}.Debug|x86.ActiveCfg = Debug|Any CPU + {FB420ACF-9E12-42B6-B724-1EEE9CBF251E}.Debug|x86.Build.0 = Debug|Any CPU + {FB420ACF-9E12-42B6-B724-1EEE9CBF251E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {FB420ACF-9E12-42B6-B724-1EEE9CBF251E}.Release|Any CPU.Build.0 = Release|Any CPU + {FB420ACF-9E12-42B6-B724-1EEE9CBF251E}.Release|x64.ActiveCfg = Release|Any CPU + {FB420ACF-9E12-42B6-B724-1EEE9CBF251E}.Release|x64.Build.0 = Release|Any CPU + {FB420ACF-9E12-42B6-B724-1EEE9CBF251E}.Release|x86.ActiveCfg = Release|Any CPU + {FB420ACF-9E12-42B6-B724-1EEE9CBF251E}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/test/CsProj/ProjectFileParserTest.cs b/test/CsProj/ProjectFileParserTest.cs index 6d3d91d..d4df991 100644 --- a/test/CsProj/ProjectFileParserTest.cs +++ b/test/CsProj/ProjectFileParserTest.cs @@ -79,5 +79,39 @@ public void Works_when_no_packageId_or_title() parser.Load(csProjXml); Assert.Empty(parser.PackageName); } + + [Fact] + public void CanParse_when_versionprefix_is_set() + { + const string csProjXml = "" + + "" + + "netstandard1.6" + + "Unit.For.The.Win" + + "1.0.0" + + "" + + ""; + + parser.Load(csProjXml); + Assert.Empty(parser.PackageName); + Assert.Equal("1.0.0", parser.Version); + } + + + [Fact] + public void CanParse_when_versionprefix_and_versionsuffix_is_set() + { + const string csProjXml = "" + + "" + + "netstandard1.6" + + "Unit.For.The.Win" + + "1.0.0" + + "SNAPSHOT" + + "" + + ""; + + parser.Load(csProjXml); + Assert.Empty(parser.PackageName); + Assert.Equal("1.0.0-SNAPSHOT", parser.Version); + } } } From c815c00c20d37765af3cdf5f289cf79d1a169cb5 Mon Sep 17 00:00:00 2001 From: Jan Trebschuh Date: Wed, 14 Jun 2023 17:37:37 +0200 Subject: [PATCH 2/3] VersionPrefix and -Suffix Handling --- src/CsProj/ProjectFileParser.cs | 39 ++++++++--- src/CsProj/ProjectFileProperty.cs | 2 + src/CsProj/ProjectFileVersionPatcher.cs | 17 ++--- src/Program.cs | 2 +- src/VersionBump.cs | 7 +- src/VersionCli.cs | 24 ++++--- src/VersionCliArgs.cs | 9 ++- src/Versioning/SemVer.cs | 20 +++++- src/Versioning/SemVerBumper.cs | 5 +- test/CsProj/ProjectFileParserTest.cs | 44 ++++++------ test/CsProj/ProjectFileVersionPatcherTest.cs | 12 ++-- test/VersionCliTest.cs | 74 ++++++++++++-------- test/Versioning/SemVerBumperTests.cs | 4 +- 13 files changed, 162 insertions(+), 97 deletions(-) diff --git a/src/CsProj/ProjectFileParser.cs b/src/CsProj/ProjectFileParser.cs index 4732832..64188b9 100644 --- a/src/CsProj/ProjectFileParser.cs +++ b/src/CsProj/ProjectFileParser.cs @@ -8,31 +8,46 @@ namespace Skarp.Version.Cli.CsProj public class ProjectFileParser { public virtual string PackageName { get; private set; } - + public virtual string PackageVersion { get; private set; } - + public virtual string Version { get; private set; } - + + public virtual string VersionPrefix { get; private set; } + + public virtual string VersionSuffix { get; private set; } + + public ProjectFileProperty VersionSource { get + { + return !string.IsNullOrEmpty(Version) ? ProjectFileProperty.Version : ProjectFileProperty.VersionPrefix; + } + } + private IEnumerable _propertyGroup { get; set; } public virtual void Load(string xmlDocument, ProjectFileProperty property) { LoadPropertyGroup(xmlDocument); - var propertyElement = LoadProperty(property); - - switch(property) + XElement propertyElement = LoadProperty(property); + + switch (property) { case ProjectFileProperty.Version: - Version = propertyElement?.Value ?? "0.0.0"; + Version = propertyElement?.Value ?? string.Empty; break; case ProjectFileProperty.PackageVersion: - PackageVersion = propertyElement?.Value ?? Version; + PackageVersion = propertyElement?.Value ?? string.Empty; break; case ProjectFileProperty.Title: var defaultPropertyElement = LoadProperty(ProjectFileProperty.PackageId); PackageName = propertyElement?.Value ?? defaultPropertyElement?.Value ?? string.Empty; - + break; + case ProjectFileProperty.VersionPrefix: + VersionPrefix = propertyElement?.Value ?? string.Empty; + break; + case ProjectFileProperty.VersionSuffix: + VersionSuffix = propertyElement?.Value ?? string.Empty; break; } } @@ -47,8 +62,10 @@ public virtual void Load(string xmlDocument, params ProjectFileProperty[] proper ProjectFileProperty.Version, ProjectFileProperty.PackageId, ProjectFileProperty.PackageVersion, + ProjectFileProperty.VersionPrefix, + ProjectFileProperty.VersionSuffix }; - } + } // Try to load xmlDocument even if there is no properties to be loaded // in order to verify if project file is well formed LoadPropertyGroup(xmlDocument); @@ -61,7 +78,7 @@ public virtual void Load(string xmlDocument, params ProjectFileProperty[] proper private XElement LoadProperty(ProjectFileProperty property) { - var propertyElement = ( + XElement propertyElement = ( from prop in _propertyGroup.Elements() where prop.Name == property.ToString("g") select prop diff --git a/src/CsProj/ProjectFileProperty.cs b/src/CsProj/ProjectFileProperty.cs index 06fecc1..938f4d4 100644 --- a/src/CsProj/ProjectFileProperty.cs +++ b/src/CsProj/ProjectFileProperty.cs @@ -6,5 +6,7 @@ public enum ProjectFileProperty PackageVersion, PackageId, Title, + VersionPrefix, + VersionSuffix } } diff --git a/src/CsProj/ProjectFileVersionPatcher.cs b/src/CsProj/ProjectFileVersionPatcher.cs index e5446bb..7777ccf 100644 --- a/src/CsProj/ProjectFileVersionPatcher.cs +++ b/src/CsProj/ProjectFileVersionPatcher.cs @@ -14,7 +14,7 @@ public ProjectFileVersionPatcher(IFileSystemProvider fileSystem) { _fileSystem = fileSystem; } - + public virtual void Load(string xmlDocument) { _doc = XDocument.Parse(xmlDocument, LoadOptions.PreserveWhitespace); @@ -23,23 +23,20 @@ public virtual void Load(string xmlDocument) /// /// Replace the existing version number in the csproj xml with the new version /// - /// The old version number present in the xml - /// The new version number to persist in the csproj file + /// The new version number to persist in the csproj file /// - public virtual void PatchVersionField(string oldVersion, string newVersion) + public virtual void PatchField(string newValue, ProjectFileProperty versionField) { - var elementName = "Version"; - PatchGenericField(elementName, oldVersion, newVersion); + PatchGenericField(versionField.ToString(), newValue); } /// /// Helper method for patching up a generic XML field in the loaded XML /// /// The name to find and update or add it to the tree - /// Old value /// New value /// - private void PatchGenericField(string elementName, string oldVal, string newVal) + private void PatchGenericField(string elementName, string newVal) { if (_doc == null) { @@ -49,7 +46,7 @@ private void PatchGenericField(string elementName, string oldVal, string newVal) // If the element is not present, add it to the XML document (csproj file if (!ContainsElement(elementName)) { - AddMissingElementToCsProj(elementName, oldVal); + AddMissingElementToCsProj(elementName, newVal); } var elm = _doc.Descendants(elementName).First(); @@ -61,7 +58,7 @@ private bool ContainsElement(string elementName) var nodes = _doc.Descendants(elementName); return nodes.Any(); } - + private void AddMissingElementToCsProj(string elementName, string value) { // try to locate the PropertyGroup where the element belongs diff --git a/src/Program.cs b/src/Program.cs index df1d5ad..23f4141 100755 --- a/src/Program.cs +++ b/src/Program.cs @@ -171,7 +171,7 @@ string vcsTag if (Enum.TryParse(arg, true, out bump)) break; var ver = SemVer.FromString(arg); - args.SpecificVersionToApply = ver.ToSemVerVersionString(); + args.SpecificVersionToApply = ver.ToSemVerVersionString(null); bump = VersionBump.Specific; } diff --git a/src/VersionBump.cs b/src/VersionBump.cs index 8b5321b..ccc6004 100644 --- a/src/VersionBump.cs +++ b/src/VersionBump.cs @@ -28,6 +28,11 @@ public enum VersionBump /// /// Apply a specific, given, version to the project file /// - Specific + Specific, + + /// + /// Do not apply any changes. + /// + None } } \ No newline at end of file diff --git a/src/VersionCli.cs b/src/VersionCli.cs index bf885ff..7255e36 100644 --- a/src/VersionCli.cs +++ b/src/VersionCli.cs @@ -49,16 +49,18 @@ public VersionInfo Execute(VersionCliArgs args) } var csProjXml = _fileDetector.FindAndLoadCsProj(args.CsProjFilePath); - _fileParser.Load(csProjXml, ProjectFileProperty.Version, ProjectFileProperty.PackageVersion); + _fileParser.Load(csProjXml, args.ProjectFilePropertyName); + + + + var currentSemVer = SemVer.FromString(_fileParser.VersionSource == ProjectFileProperty.Version ? _fileParser.Version : _fileParser.VersionPrefix); - var semVer = _bumper.Bump( - SemVer.FromString(_fileParser.PackageVersion), + var bumpedSemVer = _bumper.Bump(currentSemVer, args.VersionBump, args.SpecificVersionToApply, args.BuildMeta, args.PreReleasePrefix ); - var versionString = semVer.ToSemVerVersionString(); var theOutput = new VersionInfo { @@ -67,8 +69,8 @@ public VersionInfo Execute(VersionCliArgs args) Name = ProductInfo.Name, Version = ProductInfo.Version }, - OldVersion = _fileParser.PackageVersion, - NewVersion = versionString, + OldVersion = currentSemVer.ToSemVerVersionString(_fileParser), + NewVersion = bumpedSemVer.ToSemVerVersionString(_fileParser), ProjectFile = _fileDetector.ResolvedCsProjFile, VersionStrategy = args.VersionBump.ToString().ToLowerInvariant() }; @@ -77,9 +79,9 @@ public VersionInfo Execute(VersionCliArgs args) { _fileVersionPatcher.Load(csProjXml); - _fileVersionPatcher.PatchVersionField( - _fileParser.Version, - versionString + _fileVersionPatcher.PatchField( + bumpedSemVer.ToSemVerVersionString(_fileParser), + _fileParser.VersionSource ); _fileVersionPatcher.Flush( @@ -101,11 +103,11 @@ public VersionInfo Execute(VersionCliArgs args) } else if (args.OutputFormat == OutputFormat.Bare) { - Console.WriteLine(versionString); + Console.WriteLine(bumpedSemVer.ToSemVerVersionString(_fileParser)); } else { - Console.WriteLine($"Bumped {_fileDetector.ResolvedCsProjFile} to version {versionString}"); + Console.WriteLine($"Bumped {_fileDetector.ResolvedCsProjFile} to version {bumpedSemVer.ToSemVerVersionString(_fileParser)}"); } return theOutput; diff --git a/src/VersionCliArgs.cs b/src/VersionCliArgs.cs index 7a9e04d..d64ece7 100644 --- a/src/VersionCliArgs.cs +++ b/src/VersionCliArgs.cs @@ -1,4 +1,6 @@ -namespace Skarp.Version.Cli +using Skarp.Version.Cli.CsProj; + +namespace Skarp.Version.Cli { public class VersionCliArgs { @@ -40,5 +42,10 @@ public class VersionCliArgs /// Override for the default `v` vcs tag /// public string VersionControlTag { get; set; } + + /// + /// Specify the Version-Tag that should be targeted. Default is PackageVersion + /// + public ProjectFileProperty ProjectFilePropertyName { get; set; } = ProjectFileProperty.PackageVersion; } } \ No newline at end of file diff --git a/src/Versioning/SemVer.cs b/src/Versioning/SemVer.cs index be47316..9293fb0 100644 --- a/src/Versioning/SemVer.cs +++ b/src/Versioning/SemVer.cs @@ -1,3 +1,4 @@ +using Skarp.Version.Cli.CsProj; using System; using System.Text; using System.Text.RegularExpressions; @@ -20,7 +21,7 @@ public class SemVer /// Serialize the parsed version information into a SemVer version string including pre and build meta /// /// - public string ToSemVerVersionString() + public string ToSemVerVersionString(ProjectFileParser projectFileParser) { var sb = new StringBuilder(); sb.Append($"{Major}.{Minor}.{Patch}"); @@ -34,9 +35,16 @@ public string ToSemVerVersionString() } } + if (projectFileParser != null + && projectFileParser.VersionSource == ProjectFileProperty.VersionPrefix + && !string.IsNullOrWhiteSpace(projectFileParser.VersionSuffix)) + { + sb.AppendFormat("-{0}", projectFileParser.VersionSuffix); + } + return sb.ToString(); } - + /// /// Create a new instance of a SemVer based off the version string /// @@ -57,10 +65,15 @@ public static SemVer FromString(string versionString) Minor = Convert.ToInt32(matches.Groups[2].Value), Patch = Convert.ToInt32(matches.Groups[3].Value), PreRelease = matches.Groups[4].Value, - BuildMeta = matches.Groups[5].Value, + BuildMeta = matches.Groups[5].Value }; } + public object Clone() + { + return this.MemberwiseClone(); + } + /// /// The parsed major version /// @@ -88,5 +101,6 @@ public static SemVer FromString(string versionString) /// Build mtadata semver 2 information (the stuff added with a + sign after PreRelease info) /// public string BuildMeta { get; set; } + } } \ No newline at end of file diff --git a/src/Versioning/SemVerBumper.cs b/src/Versioning/SemVerBumper.cs index 690e105..ea6cd9a 100644 --- a/src/Versioning/SemVerBumper.cs +++ b/src/Versioning/SemVerBumper.cs @@ -20,7 +20,7 @@ public SemVer Bump( string preReleasePrefix = "" ) { - var newVersion = SemVer.FromString(currentVersion.ToSemVerVersionString()); + var newVersion = (SemVer)currentVersion.Clone(); newVersion.BuildMeta = buildMeta; switch (bump) @@ -65,6 +65,9 @@ public SemVer Bump( HandleSpecificVersion(specificVersionToApply, newVersion); break; } + case VersionBump.None: + //Do nothing; + break; default: { throw new ArgumentOutOfRangeException(nameof(bump), $"VersionBump : {bump} not supported"); diff --git a/test/CsProj/ProjectFileParserTest.cs b/test/CsProj/ProjectFileParserTest.cs index d4df991..9a3c303 100644 --- a/test/CsProj/ProjectFileParserTest.cs +++ b/test/CsProj/ProjectFileParserTest.cs @@ -11,14 +11,14 @@ public class ProjectFileParserTest public ProjectFileParserTest() { parser = new ProjectFileParser(); - + } - + [Fact] public void CanParseWellFormedProjectFilesWithVersionTag() { - const string csProjXml = ""+ - "" + + const string csProjXml = "" + + "" + "netstandard1.6" + "Unit.For.The.Win" + "Unit.Testing.Library" + @@ -30,12 +30,12 @@ public void CanParseWellFormedProjectFilesWithVersionTag() parser.Load(csProjXml, ProjectFileProperty.Version, ProjectFileProperty.PackageVersion); Assert.Equal("1.0.0", parser.Version); Assert.Equal("1.0.0-1+master", parser.PackageVersion); - } + } [Fact] public void CanParse_when_version_and_package_version_missing() { - const string csProjXml = ""+ - "" + + const string csProjXml = "" + + "" + "netstandard1.6" + "Unit.For.The.Win" + "Unit.Testing.Library" + @@ -43,25 +43,25 @@ public void CanParse_when_version_and_package_version_missing() ""; parser.Load(csProjXml, ProjectFileProperty.Version, ProjectFileProperty.PackageVersion); - Assert.Equal("0.0.0", parser.Version); - Assert.Equal("0.0.0", parser.PackageVersion); + Assert.Empty(parser.Version); + Assert.Empty(parser.PackageVersion); } - - [Fact] + + [Fact] public void BailsOnMalformedProjectFile() { - const string csProjXml = ""+ - "" + + const string csProjXml = "" + + "" + "netstandard1.6" + "Unit.For.The.Win" + "Unit.Testing.Library" + "" + ""; - var ex = Assert.Throws(() => + var ex = Assert.Throws(() => parser.Load(csProjXml) ); - + Assert.Contains($"The provided csproj file seems malformed - no in the root", ex.Message); Assert.Equal("xmlDocument", ex.ParamName); } @@ -69,13 +69,13 @@ public void BailsOnMalformedProjectFile() [Fact] public void Works_when_no_packageId_or_title() { - const string csProjXml = ""+ - "" + + const string csProjXml = "" + + "" + "netstandard1.6" + "Unit.For.The.Win" + "" + ""; - + parser.Load(csProjXml); Assert.Empty(parser.PackageName); } @@ -93,7 +93,9 @@ public void CanParse_when_versionprefix_is_set() parser.Load(csProjXml); Assert.Empty(parser.PackageName); - Assert.Equal("1.0.0", parser.Version); + Assert.Equal("1.0.0", parser.VersionPrefix); + Assert.Empty(parser.VersionSuffix); + Assert.Empty(parser.Version); } @@ -111,7 +113,9 @@ public void CanParse_when_versionprefix_and_versionsuffix_is_set() parser.Load(csProjXml); Assert.Empty(parser.PackageName); - Assert.Equal("1.0.0-SNAPSHOT", parser.Version); + Assert.Equal("1.0.0", parser.VersionPrefix); + Assert.Equal("SNAPSHOT", parser.VersionSuffix); + Assert.Empty(parser.Version); } } } diff --git a/test/CsProj/ProjectFileVersionPatcherTest.cs b/test/CsProj/ProjectFileVersionPatcherTest.cs index 3ddfa51..6ed90a6 100644 --- a/test/CsProj/ProjectFileVersionPatcherTest.cs +++ b/test/CsProj/ProjectFileVersionPatcherTest.cs @@ -31,7 +31,7 @@ public ProjectFileVersionPatcherTest() [Fact] public void Throws_when_load_not_called() { - var ex = Record.Exception((() => _patcher.PatchVersionField("1.0.0", "2.0.0"))); + var ex = Record.Exception((() => _patcher.PatchField("2.0.0", ProjectFileProperty.Version))); Assert.IsAssignableFrom(ex); } @@ -40,7 +40,7 @@ public void Throws_when_load_not_called() public void CanPatchVersionOnWellFormedXml() { _patcher.Load(_projectXml); - _patcher.PatchVersionField("1.0.0", "1.1.0-0"); + _patcher.PatchField("1.1.0-0", ProjectFileProperty.Version); var newXml = _patcher.ToXmlString(); Assert.NotEqual(_projectXml, newXml); @@ -60,7 +60,7 @@ public void CanPatchWhenVersionIsMissing() ""; _patcher.Load(xml); - _patcher.PatchVersionField("1.0.0", "2.0.0"); + _patcher.PatchField("2.0.0", ProjectFileProperty.Version); var newXml = _patcher.ToXmlString(); Assert.Contains("2.0.0", newXml); } @@ -77,7 +77,7 @@ public void PreservesWhiteSpaceWhilePatching() ""; _patcher.Load(xml); - _patcher.PatchVersionField("1.0.0", "2.0.0"); + _patcher.PatchField("2.0.0", ProjectFileProperty.Version); var newXml = _patcher.ToXmlString(); Assert.Contains($"{Environment.NewLine}{Environment.NewLine}{Environment.NewLine}{Environment.NewLine}", newXml); @@ -94,7 +94,7 @@ public void HandlesMissingVersionWhenTargetFrameworksField() ""; _patcher.Load(xml); - _patcher.PatchVersionField("1.0.0", "2.0.0"); + _patcher.PatchField("2.0.0", ProjectFileProperty.Version); var newXml = _patcher.ToXmlString(); Assert.Contains("2.0.0", newXml); } @@ -107,7 +107,7 @@ public void BailsWhenUnableToLocatePropertyGroup() ""; _patcher.Load(xml); - var ex = Record.Exception(() => _patcher.PatchVersionField("1.0.0", "2.0.0")); + var ex = Record.Exception(() => _patcher.PatchField("2.0.0", ProjectFileProperty.Version)); var aex = Assert.IsAssignableFrom(ex); diff --git a/test/VersionCliTest.cs b/test/VersionCliTest.cs index 4d8af5a..32c4555 100644 --- a/test/VersionCliTest.cs +++ b/test/VersionCliTest.cs @@ -32,6 +32,8 @@ public VersionCliTest() A.CallTo(() => _fileParser.Load(A._)).DoesNothing(); A.CallTo(() => _fileParser.Version).Returns("1.2.1"); + A.CallTo(() => _fileParser.VersionPrefix).Returns("2.0.1"); + A.CallTo(() => _fileParser.VersionSuffix).Returns("DEVELOPMENT"); _cli = new VersionCli( _vcsTool, @@ -43,6 +45,18 @@ public VersionCliTest() ); } + [Fact] + public void VersionCli_Bump_VersionPrefix() + { + A.CallTo(() => _fileParser.Version).Returns(null); + A.CallTo(() => _fileParser.VersionPrefix).Returns("2.0.1"); + A.CallTo(() => _fileParser.VersionSuffix).Returns("DEVELOPMENT"); + + var output = _cli.Execute(new VersionCliArgs { OutputFormat = OutputFormat.Bare, VersionBump = VersionBump.None, DryRun = true }); + + Assert.Equal("2.0.1-DEVELOPMENT", output.OldVersion); + } + [Fact] public void VersionCli_throws_when_vcs_tool_is_not_present_and_doVcs_is_true() { @@ -105,9 +119,9 @@ public void VersionCli_can_bump_versions() _cli.Execute(new VersionCliArgs{VersionBump = VersionBump.Major, DoVcs = true, DryRun = false}); // Verify - A.CallTo(() => _filePatcher.PatchVersionField( - A.That.Matches(ver => ver == "1.2.1"), - A.That.Matches(newVer => newVer == "2.0.0") + A.CallTo(() => _filePatcher.PatchField( + A.That.Matches(newVer => newVer == "2.0.0"), + ProjectFileProperty.Version )) .MustHaveHappened(Repeated.Exactly.Once); @@ -144,9 +158,9 @@ public void VersionCli_can_bump_pre_release_versions() _cli.Execute(new VersionCliArgs{VersionBump = VersionBump.PreMajor, DoVcs = true, DryRun = false}); // Verify - A.CallTo(() => _filePatcher.PatchVersionField( - A.That.Matches(ver => ver == "1.2.1"), - A.That.Matches(newVer => newVer == "2.0.0-next.0") + A.CallTo(() => _filePatcher.PatchField( + A.That.Matches(newVer => newVer == "2.0.0-next.0"), + ProjectFileProperty.Version )) .MustHaveHappened(Repeated.Exactly.Once); @@ -183,9 +197,9 @@ public void VersionCli_can_bump_pre_release_with_custom_prefix() _cli.Execute(new VersionCliArgs{VersionBump = VersionBump.PreMajor, DoVcs = true, DryRun = false, PreReleasePrefix = "beta"}); // Verify - A.CallTo(() => _filePatcher.PatchVersionField( - A.That.Matches(ver => ver == "1.2.1"), - "2.0.0-beta.0" + A.CallTo(() => _filePatcher.PatchField( + "2.0.0-beta.0", + ProjectFileProperty.Version )) .MustHaveHappened(Repeated.Exactly.Once); @@ -222,9 +236,9 @@ public void VersionCli_can_bump_pre_release_with_build_meta_versions() _cli.Execute(new VersionCliArgs{VersionBump = VersionBump.PreMajor, DoVcs = true, DryRun = false, BuildMeta = "master"}); // Verify - A.CallTo(() => _filePatcher.PatchVersionField( - A.That.Matches(ver => ver == "1.2.1"), - A.That.Matches(newVer => newVer == "2.0.0-next.0+master") + A.CallTo(() => _filePatcher.PatchField( + A.That.Matches(newVer => newVer == "2.0.0-next.0+master"), + ProjectFileProperty.Version )) .MustHaveHappened(Repeated.Exactly.Once); @@ -261,9 +275,9 @@ public void VersionCli_can_bump_versions_can_skip_vcs() _cli.Execute(new VersionCliArgs{VersionBump = VersionBump.Major, DoVcs = false, DryRun = false}); // Verify - A.CallTo(() => _filePatcher.PatchVersionField( - A.That.Matches(ver => ver == "1.2.1"), - A.That.Matches(newVer => newVer == "2.0.0") + A.CallTo(() => _filePatcher.PatchField( + A.That.Matches(newVer => newVer == "2.0.0"), + ProjectFileProperty.Version )) .MustHaveHappened(Repeated.Exactly.Once); A.CallTo(() => _filePatcher.Flush( @@ -297,9 +311,9 @@ public void VersionCli_can_bump_versions_can_dry_run() Assert.Equal("2.0.0", info.NewVersion); // Verify - A.CallTo(() => _filePatcher.PatchVersionField( - A.That.Matches(ver => ver == "1.2.1"), - A.That.Matches(newVer => newVer == "2.0.0") + A.CallTo(() => _filePatcher.PatchField( + A.That.Matches(newVer => newVer == "2.0.0"), + ProjectFileProperty.Version )) .MustNotHaveHappened(); @@ -331,9 +345,9 @@ public void VersionCli_can_set_vcs_commit_message() _cli.Execute(new VersionCliArgs { VersionBump = VersionBump.Major, DoVcs = true, DryRun = false, CommitMessage = "commit message" }); // Verify - A.CallTo(() => _filePatcher.PatchVersionField( - A.That.Matches(ver => ver == "1.2.1"), - A.That.Matches(newVer => newVer == "2.0.0") + A.CallTo(() => _filePatcher.PatchField( + A.That.Matches(newVer => newVer == "2.0.0"), + ProjectFileProperty.Version )) .MustHaveHappened(Repeated.Exactly.Once); @@ -371,9 +385,9 @@ public void VersionCli_can_set_vcs_commit_message_with_variables() _cli.Execute(new VersionCliArgs { VersionBump = VersionBump.Major, DoVcs = true, DryRun = false, CommitMessage = "bump from v$oldVer to v$newVer at $projName" }); // Verify - A.CallTo(() => _filePatcher.PatchVersionField( - A.That.Matches(ver => ver == "1.2.1"), - A.That.Matches(newVer => newVer == "2.0.0") + A.CallTo(() => _filePatcher.PatchField( + A.That.Matches(newVer => newVer == "2.0.0"), + ProjectFileProperty.Version )) .MustHaveHappened(Repeated.Exactly.Once); @@ -410,9 +424,9 @@ public void VersionCli_can_set_vcs_tag() _cli.Execute(new VersionCliArgs { VersionBump = VersionBump.Major, DoVcs = true, DryRun = false, VersionControlTag = "vcs tag" }); // Verify - A.CallTo(() => _filePatcher.PatchVersionField( - A.That.Matches(ver => ver == "1.2.1"), - A.That.Matches(newVer => newVer == "2.0.0") + A.CallTo(() => _filePatcher.PatchField( + A.That.Matches(newVer => newVer == "2.0.0"), + ProjectFileProperty.Version )) .MustHaveHappened(Repeated.Exactly.Once); @@ -450,9 +464,9 @@ public void VersionCli_can_set_vcs_tag_with_variables() _cli.Execute(new VersionCliArgs { VersionBump = VersionBump.Major, DoVcs = true, DryRun = false, VersionControlTag = "bump from v$oldVer to v$newVer at $projName" }); // Verify - A.CallTo(() => _filePatcher.PatchVersionField( - A.That.Matches(ver => ver == "1.2.1"), - A.That.Matches(newVer => newVer == "2.0.0") + A.CallTo(() => _filePatcher.PatchField( + A.That.Matches(newVer => newVer == "2.0.0"), + ProjectFileProperty.Version )) .MustHaveHappened(Repeated.Exactly.Once); diff --git a/test/Versioning/SemVerBumperTests.cs b/test/Versioning/SemVerBumperTests.cs index f9e4684..9e96a3e 100644 --- a/test/Versioning/SemVerBumperTests.cs +++ b/test/Versioning/SemVerBumperTests.cs @@ -64,7 +64,7 @@ string expectedBuildMeta public void CanBumpAndSerializeStringVersion(string version, VersionBump bump, string expectedVersion) { var semver = _bumper.Bump(SemVer.FromString(version), bump); - Assert.Equal(expectedVersion, semver.ToSemVerVersionString()); + Assert.Equal(expectedVersion, semver.ToSemVerVersionString(null)); } [Theory] @@ -79,7 +79,7 @@ string prefix ) { var semver = _bumper.Bump(SemVer.FromString(version), bump, preReleasePrefix: prefix); - Assert.Equal(expectedVersion, semver.ToSemVerVersionString()); + Assert.Equal(expectedVersion, semver.ToSemVerVersionString(null)); } [Fact] From 260575185bae14611f553066a8cf7c24b30916db Mon Sep 17 00:00:00 2001 From: Jan Berude Date: Fri, 21 Jul 2023 15:39:47 +0200 Subject: [PATCH 3/3] version cli load version string --- src/VersionCli.cs | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/VersionCli.cs b/src/VersionCli.cs index 7255e36..23fef93 100644 --- a/src/VersionCli.cs +++ b/src/VersionCli.cs @@ -49,13 +49,19 @@ public VersionInfo Execute(VersionCliArgs args) } var csProjXml = _fileDetector.FindAndLoadCsProj(args.CsProjFilePath); - _fileParser.Load(csProjXml, args.ProjectFilePropertyName); + _fileParser.Load( + csProjXml, + args.ProjectFilePropertyName); - var currentSemVer = SemVer.FromString(_fileParser.VersionSource == ProjectFileProperty.Version ? _fileParser.Version : _fileParser.VersionPrefix); + var currentSemVer = SemVer.FromString( + _fileParser.VersionSource == ProjectFileProperty.Version ? + _fileParser.Version : + _fileParser.VersionPrefix); - var bumpedSemVer = _bumper.Bump(currentSemVer, + var bumpedSemVer = _bumper.Bump( + currentSemVer, args.VersionBump, args.SpecificVersionToApply, args.BuildMeta,