From 7102a27e651619d21902557fe81cb7ecf2ec3f5b Mon Sep 17 00:00:00 2001 From: Christoph Walcher Date: Sat, 26 Feb 2022 17:00:02 +0100 Subject: [PATCH] fix: detect versions in xml namespaced projects (#62) --- Versionize.Tests/ProjectsTests.cs | 30 +++++++++++-- Versionize.Tests/TestSupport/TempProject.cs | 30 +++++-------- Versionize/Project.cs | 49 +++++++++++---------- Versionize/Projects.cs | 6 +-- 4 files changed, 67 insertions(+), 48 deletions(-) diff --git a/Versionize.Tests/ProjectsTests.cs b/Versionize.Tests/ProjectsTests.cs index d100e5a..d24397f 100644 --- a/Versionize.Tests/ProjectsTests.cs +++ b/Versionize.Tests/ProjectsTests.cs @@ -1,7 +1,7 @@ -using Shouldly; +using NuGet.Versioning; +using Shouldly; using Versionize.Tests.TestSupport; using Xunit; -using Version = NuGet.Versioning.SemanticVersion; namespace Versionize.Tests; @@ -48,9 +48,31 @@ public void ShouldWriteAllVersionsToProjectFiles() TempProject.CreateCsharpProject(Path.Join(tempDir, "project2"), "1.1.1"); var projects = Projects.Discover(tempDir); - projects.WriteVersion(new Version(2, 0, 0)); + projects.WriteVersion(new SemanticVersion(2, 0, 0)); var updated = Projects.Discover(tempDir); - updated.Version.ShouldBe(Version.Parse("2.0.0")); + updated.Version.ShouldBe(SemanticVersion.Parse("2.0.0")); + } + + [Fact] + public void ShouldDetectVersionInNamespacedXmlProjects() + { + var tempDir = TempDir.Create(); + var version = SemanticVersion.Parse("1.0.0"); + + // Create .net project + var projectFileContents = +$@" + + ... + {version} + ... + +"; + + TempProject.CreateFromProjectContents(tempDir, "csproj", projectFileContents); + + var projects = Projects.Discover(tempDir); + projects.Version.ShouldBe(version); } } diff --git a/Versionize.Tests/TestSupport/TempProject.cs b/Versionize.Tests/TestSupport/TempProject.cs index d86adea..b1cfe8b 100644 --- a/Versionize.Tests/TestSupport/TempProject.cs +++ b/Versionize.Tests/TestSupport/TempProject.cs @@ -8,38 +8,32 @@ public static string CreateFsharpProject(string tempDir, string version = "1.0.0 { return Create(tempDir, "fsproj", version); } + public static string CreateCsharpProject(string tempDir, string version = "1.0.0") { return Create(tempDir, "csproj", version); } - private static string Create(string tempDir, string extension, string version = "1.0.0") + public static string Create(string tempDir, string extension, string version = "1.0.0") { - Directory.CreateDirectory(tempDir); - - var projectDirName = new DirectoryInfo(tempDir).Name; - var csProjFile = $"{tempDir}/{projectDirName}.{extension}"; - - // Create .net project var projectFileContents = - $@" +$@" {version} "; - File.WriteAllText(csProjFile, projectFileContents); - // Add version string to csproj - var doc = new XmlDocument { PreserveWhitespace = true }; + return CreateFromProjectContents(tempDir, extension, projectFileContents); + } - doc.Load(csProjFile); + public static string CreateFromProjectContents(string tempDir, string extension, string projectFileContents) + { + Directory.CreateDirectory(tempDir); - var projectNode = doc.SelectSingleNode("/Project/PropertyGroup"); - var versionNode = doc.CreateNode("element", "Version", ""); - versionNode.InnerText = version; - projectNode.AppendChild(versionNode); - using var tw = new XmlTextWriter(csProjFile, null); - doc.Save(tw); + var projectDirName = new DirectoryInfo(tempDir).Name; + var csProjFile = $"{tempDir}/{projectDirName}.{extension}"; + + File.WriteAllText(csProjFile, projectFileContents); return csProjFile; } diff --git a/Versionize/Project.cs b/Versionize/Project.cs index 707ff71..53c70d6 100644 --- a/Versionize/Project.cs +++ b/Versionize/Project.cs @@ -1,14 +1,14 @@ using System.Xml; -using Version = NuGet.Versioning.SemanticVersion; +using NuGet.Versioning; namespace Versionize; public class Project { public string ProjectFile { get; } - public Version Version { get; } + public SemanticVersion Version { get; } - private Project(string projectFile, Version version) + private Project(string projectFile, SemanticVersion version) { ProjectFile = projectFile; Version = version; @@ -34,20 +34,11 @@ public static bool IsVersionable(string projectFile) } } - private static Version ReadVersion(string projectFile) + private static SemanticVersion ReadVersion(string projectFile) { - XmlDocument doc = new XmlDocument { PreserveWhitespace = true }; + var doc = ReadProject(projectFile); - try - { - doc.Load(projectFile); - } - catch (Exception) - { - throw new InvalidOperationException($"Project {projectFile} is not a valid csproj file. Please make sure that you have a valid csproj file in place!"); - } - - var versionString = doc.SelectSingleNode("/Project/PropertyGroup/Version")?.InnerText; + var versionString = SelectVersionNode(doc)?.InnerText; if (string.IsNullOrWhiteSpace(versionString)) { @@ -56,7 +47,7 @@ private static Version ReadVersion(string projectFile) try { - return Version.Parse(versionString); + return SemanticVersion.Parse(versionString); } catch (Exception) { @@ -64,22 +55,34 @@ private static Version ReadVersion(string projectFile) } } - public void WriteVersion(Version nextVersion) + public void WriteVersion(SemanticVersion nextVersion) + { + var doc = ReadProject(ProjectFile); + + var versionElement = SelectVersionNode(doc); + versionElement.InnerText = nextVersion.ToString(); + + doc.Save(ProjectFile); + } + + private static XmlNode SelectVersionNode(XmlDocument doc) + { + return doc.SelectSingleNode("/*[local-name()='Project']/*[local-name()='PropertyGroup']/*[local-name()='Version']"); + } + + private static XmlDocument ReadProject(string projectFile) { var doc = new XmlDocument { PreserveWhitespace = true }; try { - doc.Load(ProjectFile); + doc.Load(projectFile); } catch (Exception) { - throw new InvalidOperationException($"Project {ProjectFile} is not a valid csproj file. Please make sure that you have a valid csproj file in place!"); + throw new InvalidOperationException($"Project {projectFile} is not a valid xml project file. Please make sure that you have a valid project file in place!"); } - var versionElement = doc.SelectSingleNode("/Project/PropertyGroup/Version"); - versionElement.InnerText = nextVersion.ToString(); - - doc.Save(ProjectFile); + return doc; } } diff --git a/Versionize/Projects.cs b/Versionize/Projects.cs index 6b55cb7..7b5f456 100644 --- a/Versionize/Projects.cs +++ b/Versionize/Projects.cs @@ -1,4 +1,4 @@ -using Version = NuGet.Versioning.SemanticVersion; +using NuGet.Versioning; namespace Versionize; @@ -28,7 +28,7 @@ public bool HasInconsistentVersioning() return _projects.Any(p => !p.Version.Equals(firstProjectVersion)); } - public Version Version { get => _projects.First().Version; } + public SemanticVersion Version { get => _projects.First().Version; } public static Projects Discover(string workingDirectory) { @@ -44,7 +44,7 @@ public static Projects Discover(string workingDirectory) return new Projects(projects); } - public void WriteVersion(Version nextVersion) + public void WriteVersion(SemanticVersion nextVersion) { foreach (var project in _projects) {