diff --git a/src/GitVersionTask.Tests/GetVersionTaskTests.cs b/src/GitVersionTask.Tests/GetVersionTaskTests.cs index a3f6d5c7d1..bf2d995164 100644 --- a/src/GitVersionTask.Tests/GetVersionTaskTests.cs +++ b/src/GitVersionTask.Tests/GetVersionTaskTests.cs @@ -1,7 +1,6 @@ -using System.Linq; +using System.Linq; using GitVersion; using GitVersionTask; -using Microsoft.Build.Framework; using NUnit.Framework; using Shouldly; @@ -11,13 +10,12 @@ public class GetVersionTaskTests : TestBase [Test] public void OutputsShouldMatchVariableProvider() { - var taskProperties = typeof(GetVersion) + var taskProperties = typeof( GetVersion.Output ) .GetProperties() - .Where(p => p.GetCustomAttributes(typeof(OutputAttribute), false).Any()) - .Select(p => p.Name); + .Select( p => p.Name ); var variablesProperties = VersionVariables.AvailableVariables; - taskProperties.ShouldBe(variablesProperties, ignoreOrder: true); + taskProperties.ShouldBe( variablesProperties, ignoreOrder: true ); } } diff --git a/src/GitVersionTask.Tests/GitVersionTask.Tests.csproj b/src/GitVersionTask.Tests/GitVersionTask.Tests.csproj index 3c18824740..7a1a43f9d4 100644 --- a/src/GitVersionTask.Tests/GitVersionTask.Tests.csproj +++ b/src/GitVersionTask.Tests/GitVersionTask.Tests.csproj @@ -17,7 +17,6 @@ - diff --git a/src/GitVersionTask.Tests/InvalidFileCheckerTests.cs b/src/GitVersionTask.Tests/InvalidFileCheckerTests.cs index e8877d2f94..6531d1b34a 100644 --- a/src/GitVersionTask.Tests/InvalidFileCheckerTests.cs +++ b/src/GitVersionTask.Tests/InvalidFileCheckerTests.cs @@ -1,8 +1,6 @@ using System; using System.IO; using GitVersion; -using GitVersionTask.Tests.Mocks; -using Microsoft.Build.Framework; using NUnit.Framework; [TestFixture] @@ -14,93 +12,93 @@ public class InvalidFileCheckerTests : TestBase [SetUp] public void CreateTemporaryProject() { - projectDirectory = Path.Combine(Path.GetTempPath(), Guid.NewGuid().ToString()); - projectFile = Path.Combine(projectDirectory, "Fake.csproj"); + projectDirectory = Path.Combine( Path.GetTempPath(), Guid.NewGuid().ToString() ); + projectFile = Path.Combine( projectDirectory, "Fake.csproj" ); - Directory.CreateDirectory(projectDirectory); + Directory.CreateDirectory( projectDirectory ); - File.Create(projectFile).Close(); + File.Create( projectFile ).Close(); } [TearDown] public void Cleanup() { - Directory.Delete(projectDirectory, true); + Directory.Delete( projectDirectory, true ); } [Test] public void VerifyIgnoreNonAssemblyInfoFile() { - using (var writer = File.CreateText(Path.Combine(projectDirectory, "SomeOtherFile.cs"))) + using ( var writer = File.CreateText( Path.Combine( projectDirectory, "SomeOtherFile.cs" ) ) ) { - writer.Write(@" + writer.Write( @" using System; using System.Reflection; [assembly: AssemblyVersion(""1.0.0.0"")] -"); +" ); } - InvalidFileChecker.CheckForInvalidFiles(new ITaskItem[] { new MockTaskItem { ItemSpec = "SomeOtherFile.cs" } }, projectFile); + InvalidFileChecker.CheckForInvalidFiles( new[] { "SomeOtherFile.cs" }, projectFile ); } [Test] - public void VerifyAttributeFoundCSharp([Values("AssemblyVersion", "AssemblyFileVersion", "AssemblyInformationalVersion", "System.Reflection.AssemblyVersion")]string attribute) + public void VerifyAttributeFoundCSharp( [Values( "AssemblyVersion", "AssemblyFileVersion", "AssemblyInformationalVersion", "System.Reflection.AssemblyVersion" )]string attribute ) { - using (var writer = File.CreateText(Path.Combine(projectDirectory, "AssemblyInfo.cs"))) + using ( var writer = File.CreateText( Path.Combine( projectDirectory, "AssemblyInfo.cs" ) ) ) { - writer.Write(@" + writer.Write( @" using System; using System.Reflection; [assembly:{0}(""1.0.0.0"")] -", attribute); +", attribute ); } - var ex = Assert.Throws(() => InvalidFileChecker.CheckForInvalidFiles(new ITaskItem[] { new MockTaskItem { ItemSpec = "AssemblyInfo.cs" } }, projectFile), attribute); - Assert.That(ex.Message, Is.EqualTo("File contains assembly version attributes which conflict with the attributes generated by GitVersion AssemblyInfo.cs")); + var ex = Assert.Throws( () => InvalidFileChecker.CheckForInvalidFiles( new[] { "AssemblyInfo.cs" }, projectFile ), attribute ); + Assert.That( ex.Message, Is.EqualTo( "File contains assembly version attributes which conflict with the attributes generated by GitVersion AssemblyInfo.cs" ) ); } [Test] - public void VerifyUnformattedAttributeFoundCSharp([Values("AssemblyVersion", "AssemblyFileVersion", "AssemblyInformationalVersion", "System . Reflection . AssemblyVersion")]string attribute) + public void VerifyUnformattedAttributeFoundCSharp( [Values( "AssemblyVersion", "AssemblyFileVersion", "AssemblyInformationalVersion", "System . Reflection . AssemblyVersion" )]string attribute ) { - using (var writer = File.CreateText(Path.Combine(projectDirectory, "AssemblyInfo.cs"))) + using ( var writer = File.CreateText( Path.Combine( projectDirectory, "AssemblyInfo.cs" ) ) ) { - writer.Write(@" + writer.Write( @" using System; using System.Reflection; [ assembly : {0} ( ""1.0.0.0"")] -", attribute); +", attribute ); } - var ex = Assert.Throws(() => InvalidFileChecker.CheckForInvalidFiles(new ITaskItem[] { new MockTaskItem { ItemSpec = "AssemblyInfo.cs" } }, projectFile), attribute); - Assert.That(ex.Message, Is.EqualTo("File contains assembly version attributes which conflict with the attributes generated by GitVersion AssemblyInfo.cs")); + var ex = Assert.Throws( () => InvalidFileChecker.CheckForInvalidFiles( new[] { "AssemblyInfo.cs" }, projectFile ), attribute ); + Assert.That( ex.Message, Is.EqualTo( "File contains assembly version attributes which conflict with the attributes generated by GitVersion AssemblyInfo.cs" ) ); } [Test] - public void VerifyCommentWorksCSharp([Values("AssemblyVersion", "AssemblyFileVersion", "AssemblyInformationalVersion")]string attribute) + public void VerifyCommentWorksCSharp( [Values( "AssemblyVersion", "AssemblyFileVersion", "AssemblyInformationalVersion" )]string attribute ) { - using (var writer = File.CreateText(Path.Combine(projectDirectory, "AssemblyInfo.cs"))) + using ( var writer = File.CreateText( Path.Combine( projectDirectory, "AssemblyInfo.cs" ) ) ) { - writer.Write(@" + writer.Write( @" using System; using System.Reflection; //[assembly: {0}(""1.0.0.0"")] -", attribute); +", attribute ); } - InvalidFileChecker.CheckForInvalidFiles(new ITaskItem[] { new MockTaskItem { ItemSpec = "AssemblyInfo.cs" } }, projectFile); + InvalidFileChecker.CheckForInvalidFiles( new[] { "AssemblyInfo.cs" }, projectFile ); } [Test] - public void VerifyStringWorksCSharp([Values("AssemblyVersion", "AssemblyFileVersion", "AssemblyInformationalVersion")]string attribute) + public void VerifyStringWorksCSharp( [Values( "AssemblyVersion", "AssemblyFileVersion", "AssemblyInformationalVersion" )]string attribute ) { - using (var writer = File.CreateText(Path.Combine(projectDirectory, "AssemblyInfo.cs"))) + using ( var writer = File.CreateText( Path.Combine( projectDirectory, "AssemblyInfo.cs" ) ) ) { - writer.Write(@" + writer.Write( @" using System; using System.Reflection; @@ -108,113 +106,113 @@ public class Temp {{ static const string Foo = ""[assembly: {0}(""""1.0.0.0"""")]""; }} -", attribute); +", attribute ); } - InvalidFileChecker.CheckForInvalidFiles(new ITaskItem[] { new MockTaskItem { ItemSpec = "AssemblyInfo.cs" } }, projectFile); + InvalidFileChecker.CheckForInvalidFiles( new[] { "AssemblyInfo.cs" }, projectFile ); } [Test] - public void VerifyIdentifierWorksCSharp([Values("AssemblyVersion", "AssemblyFileVersion", "AssemblyInformationalVersion")]string attribute) + public void VerifyIdentifierWorksCSharp( [Values( "AssemblyVersion", "AssemblyFileVersion", "AssemblyInformationalVersion" )]string attribute ) { - using (var writer = File.CreateText(Path.Combine(projectDirectory, "AssemblyInfo.cs"))) + using ( var writer = File.CreateText( Path.Combine( projectDirectory, "AssemblyInfo.cs" ) ) ) { - writer.Write(@" + writer.Write( @" using System; using System.Reflection; public class {0} {{ }} -", attribute); +", attribute ); } - InvalidFileChecker.CheckForInvalidFiles(new ITaskItem[] { new MockTaskItem { ItemSpec = "AssemblyInfo.cs" } }, projectFile); + InvalidFileChecker.CheckForInvalidFiles( new[] { "AssemblyInfo.cs" }, projectFile ); } [Test] - public void VerifyAttributeFoundVisualBasic([Values("AssemblyVersion", "AssemblyFileVersion", "AssemblyInformationalVersion", "System.Reflection.AssemblyVersion")]string attribute) + public void VerifyAttributeFoundVisualBasic( [Values( "AssemblyVersion", "AssemblyFileVersion", "AssemblyInformationalVersion", "System.Reflection.AssemblyVersion" )]string attribute ) { - using (var writer = File.CreateText(Path.Combine(projectDirectory, "AssemblyInfo.vb"))) + using ( var writer = File.CreateText( Path.Combine( projectDirectory, "AssemblyInfo.vb" ) ) ) { - writer.Write(@" + writer.Write( @" Imports System Imports System.Reflection -", attribute); +", attribute ); } - var ex = Assert.Throws(() => InvalidFileChecker.CheckForInvalidFiles(new ITaskItem[] { new MockTaskItem { ItemSpec = "AssemblyInfo.vb" } }, projectFile), attribute); - Assert.That(ex.Message, Is.EqualTo("File contains assembly version attributes which conflict with the attributes generated by GitVersion AssemblyInfo.vb")); + var ex = Assert.Throws( () => InvalidFileChecker.CheckForInvalidFiles( new[] { "AssemblyInfo.vb" }, projectFile ), attribute ); + Assert.That( ex.Message, Is.EqualTo( "File contains assembly version attributes which conflict with the attributes generated by GitVersion AssemblyInfo.vb" ) ); } [Test] - public void VerifyUnformattedAttributeFoundVisualBasic([Values("AssemblyVersion", "AssemblyFileVersion", "AssemblyInformationalVersion", "System . Reflection . AssemblyVersion")]string attribute) + public void VerifyUnformattedAttributeFoundVisualBasic( [Values( "AssemblyVersion", "AssemblyFileVersion", "AssemblyInformationalVersion", "System . Reflection . AssemblyVersion" )]string attribute ) { - using (var writer = File.CreateText(Path.Combine(projectDirectory, "AssemblyInfo.vb"))) + using ( var writer = File.CreateText( Path.Combine( projectDirectory, "AssemblyInfo.vb" ) ) ) { - writer.Write(@" + writer.Write( @" Imports System Imports System.Reflection < Assembly : {0} ( ""1.0.0.0"")> -", attribute); +", attribute ); } - var ex = Assert.Throws(() => InvalidFileChecker.CheckForInvalidFiles(new ITaskItem[] { new MockTaskItem { ItemSpec = "AssemblyInfo.vb" } }, projectFile), attribute); - Assert.That(ex.Message, Is.EqualTo("File contains assembly version attributes which conflict with the attributes generated by GitVersion AssemblyInfo.vb")); + var ex = Assert.Throws( () => InvalidFileChecker.CheckForInvalidFiles( new[] { "AssemblyInfo.vb" }, projectFile ), attribute ); + Assert.That( ex.Message, Is.EqualTo( "File contains assembly version attributes which conflict with the attributes generated by GitVersion AssemblyInfo.vb" ) ); } [Test] - public void VerifyCommentWorksVisualBasic([Values("AssemblyVersion", "AssemblyFileVersion", "AssemblyInformationalVersion")]string attribute) + public void VerifyCommentWorksVisualBasic( [Values( "AssemblyVersion", "AssemblyFileVersion", "AssemblyInformationalVersion" )]string attribute ) { - using (var writer = File.CreateText(Path.Combine(projectDirectory, "AssemblyInfo.vb"))) + using ( var writer = File.CreateText( Path.Combine( projectDirectory, "AssemblyInfo.vb" ) ) ) { - writer.Write(@" + writer.Write( @" Imports System Imports System.Reflection ' -", attribute); +", attribute ); } - InvalidFileChecker.CheckForInvalidFiles(new ITaskItem[] { new MockTaskItem { ItemSpec = "AssemblyInfo.vb" } }, projectFile); + InvalidFileChecker.CheckForInvalidFiles( new[] { "AssemblyInfo.vb" }, projectFile ); } [Test] - public void VerifyStringWorksVisualBasic([Values("AssemblyVersion", "AssemblyFileVersion", "AssemblyInformationalVersion")]string attribute) + public void VerifyStringWorksVisualBasic( [Values( "AssemblyVersion", "AssemblyFileVersion", "AssemblyInformationalVersion" )]string attribute ) { - using (var writer = File.CreateText(Path.Combine(projectDirectory, "AssemblyInfo.vb"))) + using ( var writer = File.CreateText( Path.Combine( projectDirectory, "AssemblyInfo.vb" ) ) ) { - writer.Write(@" + writer.Write( @" Imports System Imports System.Reflection Public Class Temp static const string Foo = """"; End Class -", attribute); +", attribute ); } - InvalidFileChecker.CheckForInvalidFiles(new ITaskItem[] { new MockTaskItem { ItemSpec = "AssemblyInfo.vb" } }, projectFile); + InvalidFileChecker.CheckForInvalidFiles( new[] { "AssemblyInfo.vb" }, projectFile ); } [Test] - public void VerifyIdentifierWorksVisualBasic([Values("AssemblyVersion", "AssemblyFileVersion", "AssemblyInformationalVersion")]string attribute) + public void VerifyIdentifierWorksVisualBasic( [Values( "AssemblyVersion", "AssemblyFileVersion", "AssemblyInformationalVersion" )]string attribute ) { - using (var writer = File.CreateText(Path.Combine(projectDirectory, "AssemblyInfo.vb"))) + using ( var writer = File.CreateText( Path.Combine( projectDirectory, "AssemblyInfo.vb" ) ) ) { - writer.Write(@" + writer.Write( @" Imports System Imports System.Reflection Public Class {0} End Class -", attribute); +", attribute ); } - InvalidFileChecker.CheckForInvalidFiles(new ITaskItem[] { new MockTaskItem { ItemSpec = "AssemblyInfo.vb" } }, projectFile); + InvalidFileChecker.CheckForInvalidFiles( new[] { "AssemblyInfo.vb" }, projectFile ); } } diff --git a/src/GitVersionTask.Tests/Mocks/MockBuildEngine.cs b/src/GitVersionTask.Tests/Mocks/MockBuildEngine.cs deleted file mode 100644 index 710462eff5..0000000000 --- a/src/GitVersionTask.Tests/Mocks/MockBuildEngine.cs +++ /dev/null @@ -1,45 +0,0 @@ -using System; -using System.Collections; -using Microsoft.Build.Framework; - -class MockBuildEngine : IBuildEngine -{ - public void LogErrorEvent(BuildErrorEventArgs e) - { } - - public void LogWarningEvent(BuildWarningEventArgs e) - { } - - public void LogMessageEvent(BuildMessageEventArgs e) - { } - - public void LogCustomEvent(CustomBuildEventArgs e) - { - throw new NotImplementedException(); - } - - public bool BuildProjectFile(string projectFileName, string[] targetNames, IDictionary globalProperties, IDictionary targetOutputs) - { - throw new NotImplementedException(); - } - - public bool ContinueOnError - { - get { throw new NotImplementedException(); } - } - - public int LineNumberOfTaskNode - { - get { throw new NotImplementedException(); } - } - - public int ColumnNumberOfTaskNode - { - get { throw new NotImplementedException(); } - } - - public string ProjectFileOfTaskNode - { - get { throw new NotImplementedException(); } - } -} \ No newline at end of file diff --git a/src/GitVersionTask.Tests/Mocks/MockTaskItem.cs b/src/GitVersionTask.Tests/Mocks/MockTaskItem.cs deleted file mode 100644 index 45a98850b9..0000000000 --- a/src/GitVersionTask.Tests/Mocks/MockTaskItem.cs +++ /dev/null @@ -1,40 +0,0 @@ -using System; -using System.Collections; -using Microsoft.Build.Framework; - -namespace GitVersionTask.Tests.Mocks -{ - class MockTaskItem : ITaskItem - { - public string ItemSpec { get; set; } - - public int MetadataCount { get; private set; } - - public ICollection MetadataNames { get; private set; } - - public IDictionary CloneCustomMetadata() - { - throw new NotImplementedException(); - } - - public void CopyMetadataTo(ITaskItem destinationItem) - { - throw new NotImplementedException(); - } - - public string GetMetadata(string metadataName) - { - throw new NotImplementedException(); - } - - public void RemoveMetadata(string metadataName) - { - throw new NotImplementedException(); - } - - public void SetMetadata(string metadataName, string metadataValue) - { - throw new NotImplementedException(); - } - } -} \ No newline at end of file diff --git a/src/GitVersionTask/GenerateGitVersionInformation.cs b/src/GitVersionTask/GenerateGitVersionInformation.cs index 2e37e3975f..c002731c5a 100644 --- a/src/GitVersionTask/GenerateGitVersionInformation.cs +++ b/src/GitVersionTask/GenerateGitVersionInformation.cs @@ -4,90 +4,96 @@ namespace GitVersionTask using System.IO; using GitVersion; using GitVersion.Helpers; - using Microsoft.Build.Framework; - public class GenerateGitVersionInformation : GitVersionTaskBase + public static class GenerateGitVersionInformation { - public GenerateGitVersionInformation() + public static Output Execute( + Input input + ) { - } - - [Required] - public string SolutionDirectory { get; set; } - - [Required] - public string ProjectFile { get; set; } - - [Required] - public string IntermediateOutputPath { get; set; } - - [Required] - public string Language { get; set; } - - [Output] - public string GitVersionInformationFilePath { get; set; } + if ( !input.ValidateInput() ) + { + throw new Exception( "Invalid input." ); + } - public bool NoFetch { get; set; } + var logger = new TaskLogger(); + Logger.SetLoggers( logger.LogInfo, logger.LogInfo, logger.LogWarning, s => logger.LogError( s ) ); + - public override bool Execute() - { + Output output = null; try { - InnerExecute(); - return true; + output = InnerExecute(input ); } catch (WarningException errorException) { - this.LogWarning(errorException.Message); - return true; + logger.LogWarning(errorException.Message); + output = new Output(); } catch (Exception exception) { - this.LogError("Error occurred: " + exception); - return false; + logger.LogError("Error occurred: " + exception); + throw; } - } - - void InnerExecute() - { - VersionVariables versionVariables; - if (!ExecuteCore.TryGetVersion(SolutionDirectory, out versionVariables, NoFetch, new Authentication())) + finally { - return; + Logger.Reset(); } - var fileExtension = GetFileExtension(); - var fileName = $"GitVersionInformation.g.{fileExtension}"; + return output; + } - if (IntermediateOutputPath == null) + private static Output InnerExecute( Input input ) + { + var execute = GitVersionTaskBase.CreateExecuteCore(); + if (!execute.TryGetVersion(input.SolutionDirectory, out var versionVariables, input.NoFetch, new Authentication())) { - fileName = $"GitVersionInformation_{Path.GetFileNameWithoutExtension(ProjectFile)}_{Path.GetRandomFileName()}.g.{fileExtension}"; + return null; } - var workingDirectory = IntermediateOutputPath ?? TempFileTracker.TempPath; - - GitVersionInformationFilePath = Path.Combine(workingDirectory, fileName); + var fileWriteInfo = input.IntermediateOutputPath.GetWorkingDirectoryAndFileNameAndExtension( + input.Language, + input.ProjectFile, + ( pf, ext ) => $"GitVersionInformation.g.{ext}", + ( pf, ext ) => $"GitVersionInformation_{Path.GetFileNameWithoutExtension( pf )}_{Path.GetRandomFileName()}.g.{ext}" + ); - var generator = new GitVersionInformationGenerator(fileName, workingDirectory, versionVariables, new FileSystem()); + var output = new Output() + { + GitVersionInformationFilePath = Path.Combine( fileWriteInfo.WorkingDirectory, fileWriteInfo.FileName ) + }; + var generator = new GitVersionInformationGenerator( fileWriteInfo.FileName, fileWriteInfo.WorkingDirectory, versionVariables, new FileSystem()); generator.Generate(); + + return output; } - string GetFileExtension() + public sealed class Input { - switch (Language) - { - case "C#": - return "cs"; + public string SolutionDirectory { get; set; } - case "F#": - return "fs"; + public string ProjectFile { get; set; } - case "VB": - return "vb"; + public string IntermediateOutputPath { get; set; } - default: - throw new Exception($"Unknown language detected: '{Language}'"); - } + public string Language { get; set; } + + public bool NoFetch { get; set; } + } + + private static Boolean ValidateInput( this Input input ) + { + return input != null + && !String.IsNullOrEmpty( input.SolutionDirectory ) + && !String.IsNullOrEmpty(input.ProjectFile) + // && !String.IsNullOrEmpty(input.IntermediateOutputPath) // This was marked as [Required] but it InnerExecute still seems to allow it to be null... ? + && !String.IsNullOrEmpty(input.Language) + ; + } + + public sealed class Output + { + public string GitVersionInformationFilePath { get; set; } } } } diff --git a/src/GitVersionTask/GetVersion.cs b/src/GitVersionTask/GetVersion.cs index 07f8be237f..d184204901 100644 --- a/src/GitVersionTask/GetVersion.cs +++ b/src/GitVersionTask/GetVersion.cs @@ -3,135 +3,127 @@ namespace GitVersionTask using System; using GitVersion; - using Microsoft.Build.Framework; - - public class GetVersion : GitVersionTaskBase + public static class GetVersion { - public GetVersion() + public static Output Execute( + Input input + ) { - } + if (!input.ValidateInput()) + { + throw new Exception( "Invalid input." ); + } + + var logger = new TaskLogger(); + Logger.SetLoggers( logger.LogInfo, logger.LogInfo, logger.LogWarning, s => logger.LogError( s ) ); + var execute = GitVersionTaskBase.CreateExecuteCore(); + + Output output = null; + try + { + if ( execute.TryGetVersion(input.SolutionDirectory, out var variables, input.NoFetch, new Authentication())) + { + var outputType = typeof( Output ); + output = new Output(); + foreach (var variable in variables) + { + outputType.GetProperty(variable.Key).SetValue( output, variable.Value, null); + } + } + } + catch (WarningException errorException) + { + logger.LogWarning(errorException.Message); + output = new Output(); + } + catch (Exception exception) + { + logger.LogError("Error occurred: " + exception); + throw; + } + finally + { + Logger.Reset(); + } - [Required] - public string SolutionDirectory { get; set; } + return output; + } - public bool NoFetch { get; set; } + public sealed class Input + { + public string SolutionDirectory { get; set; } - [Output] - public string Major { get; set; } + public bool NoFetch { get; set; } + } - [Output] - public string Minor { get; set; } + private static Boolean ValidateInput(this Input input) + { + return !String.IsNullOrEmpty( input?.SolutionDirectory ); + } - [Output] - public string Patch { get; set; } + public sealed class Output + { + public string Major { get; set; } - [Output] - public string PreReleaseTag { get; set; } + public string Minor { get; set; } - [Output] - public string PreReleaseTagWithDash { get; set; } + public string Patch { get; set; } - [Output] - public string PreReleaseLabel { get; set; } + public string PreReleaseTag { get; set; } - [Output] - public string PreReleaseNumber { get; set; } + public string PreReleaseTagWithDash { get; set; } - [Output] - public string WeightedPreReleaseNumber { get; set; } + public string PreReleaseLabel { get; set; } - [Output] - public string BuildMetaData { get; set; } + public string PreReleaseNumber { get; set; } - [Output] - public string BuildMetaDataPadded { get; set; } + public string WeightedPreReleaseNumber { get; set; } - [Output] - public string FullBuildMetaData { get; set; } + public string BuildMetaData { get; set; } - [Output] - public string MajorMinorPatch { get; set; } + public string BuildMetaDataPadded { get; set; } - [Output] - public string SemVer { get; set; } + public string FullBuildMetaData { get; set; } - [Output] - public string LegacySemVer { get; set; } + public string MajorMinorPatch { get; set; } - [Output] - public string LegacySemVerPadded { get; set; } + public string SemVer { get; set; } - [Output] - public string AssemblySemVer { get; set; } + public string LegacySemVer { get; set; } - [Output] - public string AssemblySemFileVer { get; set; } + public string LegacySemVerPadded { get; set; } - [Output] - public string FullSemVer { get; set; } + public string AssemblySemVer { get; set; } - [Output] - public string InformationalVersion { get; set; } + public string AssemblySemFileVer { get; set; } - [Output] - public string BranchName { get; set; } + public string FullSemVer { get; set; } - [Output] - public string Sha { get; set; } + public string InformationalVersion { get; set; } - [Output] - public string ShortSha { get; set; } + public string BranchName { get; set; } - [Output] - public string NuGetVersionV2 { get; set; } + public string Sha { get; set; } - [Output] - public string NuGetVersion { get; set; } + public string ShortSha { get; set; } - [Output] - public string NuGetPreReleaseTagV2 { get; set; } + public string NuGetVersionV2 { get; set; } - [Output] - public string NuGetPreReleaseTag { get; set; } + public string VersionSourceSha { get; set; } - [Output] - public string CommitDate { get; set; } + public string CommitsSinceVersionSource { get; set; } - [Output] - public string VersionSourceSha { get; set; } + public string NuGetVersion { get; set; } - [Output] - public string CommitsSinceVersionSource { get; set; } + public string NuGetPreReleaseTagV2 { get; set; } - [Output] - public string CommitsSinceVersionSourcePadded { get; set; } + public string NuGetPreReleaseTag { get; set; } - public override bool Execute() - { - try - { - VersionVariables variables; + public string CommitDate { get; set; } - if (ExecuteCore.TryGetVersion(SolutionDirectory, out variables, NoFetch, new Authentication())) - { - var thisType = typeof(GetVersion); - foreach (var variable in variables) - { - thisType.GetProperty(variable.Key).SetValue(this, variable.Value, null); - } - } - return true; - } - catch (WarningException errorException) - { - this.LogWarning(errorException.Message); - return true; - } - catch (Exception exception) - { - this.LogError("Error occurred: " + exception); - return false; - } + public string CommitsSinceVersionSourcePadded { get; set; } } } + + } diff --git a/src/GitVersionTask/GitVersionTask.csproj b/src/GitVersionTask/GitVersionTask.csproj index 39f6ddf96e..62265f9bf8 100644 --- a/src/GitVersionTask/GitVersionTask.csproj +++ b/src/GitVersionTask/GitVersionTask.csproj @@ -20,6 +20,7 @@ version=$(PackageVersion);configuration=$(Configuration);utilpackversion=$(PackageVersion_UtilPackNuGetMSBuild);libgit2sharpversion=$(PackageVersion_LibGit2Sharp);yamldotnetversion=$(PackageVersion_YamlDotNet) $(AssemblyName) + latest @@ -37,9 +38,7 @@ All - - - + all runtime; build; native; contentfiles; analyzers diff --git a/src/GitVersionTask/GitVersionTaskBase.cs b/src/GitVersionTask/GitVersionTaskBase.cs index caeb254ed2..45aa95ce68 100644 --- a/src/GitVersionTask/GitVersionTaskBase.cs +++ b/src/GitVersionTask/GitVersionTaskBase.cs @@ -1,45 +1,72 @@ -namespace GitVersionTask +namespace GitVersionTask { using GitVersion; using GitVersion.Helpers; + using System; + using System.IO; - using Microsoft.Build.Framework; - using Microsoft.Build.Utilities; - - public abstract class GitVersionTaskBase : Task + public static class GitVersionTaskBase { - readonly ExecuteCore executeCore; + public static ExecuteCore CreateExecuteCore() + => new ExecuteCore( new FileSystem() ); - protected GitVersionTaskBase() + private static string GetFileExtension( this String language ) { - var fileSystem = new FileSystem(); - executeCore = new ExecuteCore(fileSystem); - GitVersion.Logger.SetLoggers(this.LogDebug, this.LogInfo, this.LogWarning, s => this.LogError(s)); - } + switch ( language ) + { + case "C#": + return "cs"; - protected ExecuteCore ExecuteCore - { - get { return executeCore; } - } + case "F#": + return "fs"; - public void LogDebug(string message) - { - this.BuildEngine.LogMessageEvent(new BuildMessageEventArgs(message, string.Empty, "GitVersionTask", MessageImportance.Low)); - } + case "VB": + return "vb"; - public void LogWarning(string message) - { - this.BuildEngine.LogWarningEvent(new BuildWarningEventArgs(string.Empty, string.Empty, null, 0, 0, 0, 0, message, string.Empty, "GitVersionTask")); + default: + throw new Exception( $"Unknown language detected: '{language}'" ); + } } - public void LogInfo(string message) + public static FileWriteInfo GetWorkingDirectoryAndFileNameAndExtension( + this String intermediateOutputPath, + String language, + String projectFile, + Func fileNameWithIntermediatePath, + Func fileNameNoIntermediatePath + ) { - this.BuildEngine.LogMessageEvent(new BuildMessageEventArgs(message, string.Empty, "GitVersionTask", MessageImportance.Normal)); + var fileExtension = language.GetFileExtension(); + String workingDirectory, fileName; + if ( intermediateOutputPath == null ) + { + fileName = fileNameWithIntermediatePath(projectFile, fileExtension); + workingDirectory = TempFileTracker.TempPath; + } + else + { + workingDirectory = intermediateOutputPath; + fileName = fileNameNoIntermediatePath(projectFile, fileExtension); + } + return new FileWriteInfo(workingDirectory, fileName, fileExtension); } + } - public void LogError(string message, string file = null) + public sealed class FileWriteInfo + { + public FileWriteInfo( + String workingDirectory, + String fileName, + String fileExtension + ) { - this.BuildEngine.LogErrorEvent(new BuildErrorEventArgs(string.Empty, string.Empty, file, 0, 0, 0, 0, message, string.Empty, "GitVersionTask")); + this.WorkingDirectory = this.WorkingDirectory; + this.FileName = fileName; + this.FileExtension = fileExtension; } + + public String WorkingDirectory { get; } + public String FileName { get; } + public String FileExtension { get; } } -} \ No newline at end of file +} diff --git a/src/GitVersionTask/InvalidFileChecker.cs b/src/GitVersionTask/InvalidFileChecker.cs index d20be03e56..8cc308fddb 100644 --- a/src/GitVersionTask/InvalidFileChecker.cs +++ b/src/GitVersionTask/InvalidFileChecker.cs @@ -4,7 +4,6 @@ using System.Linq; using System.Text.RegularExpressions; using GitVersion; -using Microsoft.Build.Framework; public static class InvalidFileChecker { @@ -14,7 +13,7 @@ public static class InvalidFileChecker { ".vb", VisualBasicFileContainsVersionAttribute } }; - public static void CheckForInvalidFiles(IEnumerable compileFiles, string projectFile) + public static void CheckForInvalidFiles(IEnumerable compileFiles, string projectFile) { foreach (var compileFile in GetInvalidFiles(compileFiles, projectFile)) { @@ -98,9 +97,9 @@ static bool VisualBasicFileContainsVersionAttribute(string compileFile, string p \s*\(\s*\)\s*\> # End brackets ()>"); } - static IEnumerable GetInvalidFiles(IEnumerable compileFiles, string projectFile) + static IEnumerable GetInvalidFiles(IEnumerable compileFiles, string projectFile) { - return compileFiles.Select(x => x.ItemSpec) + return compileFiles .Where(compileFile => compileFile.Contains("AssemblyInfo")) .Where(s => FileContainsVersionAttribute(s, projectFile)); } diff --git a/src/GitVersionTask/NugetAssets/build/Infrastructure.props b/src/GitVersionTask/NugetAssets/build/Infrastructure.props index e5ff8092e1..93d9083b49 100644 --- a/src/GitVersionTask/NugetAssets/build/Infrastructure.props +++ b/src/GitVersionTask/NugetAssets/build/Infrastructure.props @@ -1,4 +1,4 @@ - + @@ -9,16 +9,16 @@ $(GitVersionTaskBuildTools_FunctionalityDir)obj/ - + $(PackageVersion_UtilPackNuGetMSBuild) - $(MSBuildThisFileDirectory)../../../utilpack.nuget.msbuild/$(UtilPackVersion)/build/UtilPack.NuGet.MSBuild.props + $(MSBuildThisFileDirectory)../../../nugetutils.msbuild.exec/$(UtilPackVersion)/build/NuGetUtils.MSBuild.Exec.props $([System.IO.Path]::GetFullPath('$(UtilPackNuGetMSBuildPropsPath)')) - true + true @@ -35,7 +35,7 @@ - + diff --git a/src/GitVersionTask/NugetAssets/build/functionality/GitVersionCommon.props b/src/GitVersionTask/NugetAssets/build/functionality/GitVersionCommon.props index 36b320e5a5..783dfcc277 100644 --- a/src/GitVersionTask/NugetAssets/build/functionality/GitVersionCommon.props +++ b/src/GitVersionTask/NugetAssets/build/functionality/GitVersionCommon.props @@ -1,4 +1,4 @@ - + $(MSBuildProjectDirectory)\..\ @@ -40,43 +40,55 @@ - $(UtilPackTaskFactoryParametersXML) + + $(UtilPackTaskFactoryParametersXML) + Execute + - $(UtilPackTaskFactoryParametersXML) + + $(UtilPackTaskFactoryParametersXML) + Execute + - $(UtilPackTaskFactoryParametersXML) + + $(UtilPackTaskFactoryParametersXML) + Execute + - $(UtilPackTaskFactoryParametersXML) + + $(UtilPackTaskFactoryParametersXML) + Execute + True - \ No newline at end of file + diff --git a/src/GitVersionTask/TaskLogger.cs b/src/GitVersionTask/TaskLogger.cs new file mode 100644 index 0000000000..baa46b9b09 --- /dev/null +++ b/src/GitVersionTask/TaskLogger.cs @@ -0,0 +1,32 @@ +using System; +using System.IO; + +class TaskLogger +{ + private readonly TextWriter stdout; + private readonly TextWriter stderr; + + public TaskLogger( + TextWriter paramStdout = null, + TextWriter paramStderr = null + ) + { + this.stdout = paramStdout ?? Console.Out; + this.stderr = paramStderr ?? Console.Error; + } + + public void LogWarning(string message) + { + this.stdout.WriteLine( message ); + } + + public void LogInfo(string message) + { + this.stdout.WriteLine( message ); + } + + public void LogError(string message) + { + this.stderr.WriteLine( message ); + } +} diff --git a/src/GitVersionTask/UpdateAssemblyInfo.cs b/src/GitVersionTask/UpdateAssemblyInfo.cs index 125575022c..fd3fdafe12 100644 --- a/src/GitVersionTask/UpdateAssemblyInfo.cs +++ b/src/GitVersionTask/UpdateAssemblyInfo.cs @@ -5,105 +5,113 @@ namespace GitVersionTask using GitVersion; using GitVersion.Helpers; - using Microsoft.Build.Framework; - public class UpdateAssemblyInfo : GitVersionTaskBase + public static class UpdateAssemblyInfo { - public UpdateAssemblyInfo() - { - } - - [Required] - public string SolutionDirectory { get; set; } - - [Required] - public string ProjectFile { get; set; } - [Required] - public string IntermediateOutputPath { get; set; } - - [Required] - public ITaskItem[] CompileFiles { get; set; } - - [Required] - public string Language { get; set; } - - [Output] - public string AssemblyInfoTempFilePath { get; set; } + public static Output Execute( + Input input + ) + { + if ( !input.ValidateInput() ) + { + throw new Exception( "Invalid input." ); + } - public bool NoFetch { get; set; } + var logger = new TaskLogger(); + Logger.SetLoggers( logger.LogInfo, logger.LogInfo, logger.LogWarning, s => logger.LogError( s ) ); - public override bool Execute() - { + Output output = null; try { - InnerExecute(); - return true; + output = InnerExecute( input ); } catch (WarningException errorException) { - this.LogWarning(errorException.Message); - return true; + logger.LogWarning(errorException.Message); + output = new Output(); } catch (Exception exception) { - this.LogError("Error occurred: " + exception); - return false; + logger.LogError("Error occurred: " + exception); + throw; } + finally + { + Logger.Reset(); + } + + return output; } - void InnerExecute() + private static Output InnerExecute( Input input ) { + var execute = GitVersionTaskBase.CreateExecuteCore(); + TempFileTracker.DeleteTempFiles(); - InvalidFileChecker.CheckForInvalidFiles(CompileFiles, ProjectFile); + InvalidFileChecker.CheckForInvalidFiles(input.CompileFiles, input.ProjectFile); - VersionVariables versionVariables; - if (!ExecuteCore.TryGetVersion(SolutionDirectory, out versionVariables, NoFetch, new Authentication())) + if (!execute.TryGetVersion( input.SolutionDirectory, out var versionVariables, input.NoFetch, new Authentication())) { - return; + return null; } - CreateTempAssemblyInfo(versionVariables); + return CreateTempAssemblyInfo(input, versionVariables); } - void CreateTempAssemblyInfo(VersionVariables versionVariables) + private static Output CreateTempAssemblyInfo( Input input, VersionVariables versionVariables) { - var fileExtension = GetFileExtension(); - var assemblyInfoFileName = $"GitVersionTaskAssemblyInfo.g.{fileExtension}"; - - if (IntermediateOutputPath == null) + var fileWriteInfo = input.IntermediateOutputPath.GetWorkingDirectoryAndFileNameAndExtension( + input.Language, + input.ProjectFile, + ( pf, ext ) => $"GitVersionTaskAssemblyInfo.g.{ext}", + ( pf, ext ) => $"AssemblyInfo_{Path.GetFileNameWithoutExtension( pf )}_{Path.GetRandomFileName()}.g.{ext}" + ); + + var output = new Output() { - assemblyInfoFileName = $"AssemblyInfo_{Path.GetFileNameWithoutExtension(ProjectFile)}_{Path.GetRandomFileName()}.g.{fileExtension}"; - } - - var workingDirectory = IntermediateOutputPath ?? TempFileTracker.TempPath; - - AssemblyInfoTempFilePath = Path.Combine(workingDirectory, assemblyInfoFileName); + AssemblyInfoTempFilePath = Path.Combine( fileWriteInfo.WorkingDirectory, fileWriteInfo.FileName ) + }; - using (var assemblyInfoFileUpdater = new AssemblyInfoFileUpdater(assemblyInfoFileName, workingDirectory, versionVariables, new FileSystem(), true)) + using (var assemblyInfoFileUpdater = new AssemblyInfoFileUpdater( fileWriteInfo.FileName, fileWriteInfo.WorkingDirectory, versionVariables, new FileSystem(), true)) { assemblyInfoFileUpdater.Update(); assemblyInfoFileUpdater.CommitChanges(); } + + return output; } - string GetFileExtension() + public sealed class Input { - switch(Language) - { - case "C#": - return "cs"; + public string SolutionDirectory { get; set; } - case "F#": - return "fs"; + public string ProjectFile { get; set; } - case "VB": - return "vb"; + public string IntermediateOutputPath { get; set; } - default: - throw new Exception($"Unknown language detected: '{Language}'"); - } + public String[] CompileFiles { get; set; } + + public string Language { get; set; } + + public bool NoFetch { get; set; } + } + + private static Boolean ValidateInput(this Input input) + { + return input != null + && !String.IsNullOrEmpty( input.SolutionDirectory ) + && !String.IsNullOrEmpty( input.ProjectFile ) + && !String.IsNullOrEmpty( input.IntermediateOutputPath ) + && input.CompileFiles != null + && !String.IsNullOrEmpty( input.Language ) + ; + } + + public sealed class Output + { + public string AssemblyInfoTempFilePath { get; set; } } } } diff --git a/src/GitVersionTask/UtilPack.Version.props b/src/GitVersionTask/UtilPack.Version.props index 109fbf9d1e..42fd789c7e 100644 --- a/src/GitVersionTask/UtilPack.Version.props +++ b/src/GitVersionTask/UtilPack.Version.props @@ -1,6 +1,6 @@ - 2.9.1 + 2.0.0 diff --git a/src/GitVersionTask/WriteVersionInfoToBuildLog.cs b/src/GitVersionTask/WriteVersionInfoToBuildLog.cs index b2412132a9..777dca7192 100644 --- a/src/GitVersionTask/WriteVersionInfoToBuildLog.cs +++ b/src/GitVersionTask/WriteVersionInfoToBuildLog.cs @@ -3,61 +3,91 @@ namespace GitVersionTask using System; using System.Collections.Generic; using GitVersion; - using Microsoft.Build.Framework; - public class WriteVersionInfoToBuildLog : GitVersionTaskBase + public static class WriteVersionInfoToBuildLog { - public WriteVersionInfoToBuildLog() + + public static Output Execute( + Input input + ) { - } + if ( !input.ValidateInput() ) + { + throw new Exception( "Invalid input." ); + } - [Required] - public string SolutionDirectory { get; set; } + var logger = new TaskLogger(); + Logger.SetLoggers( logger.LogInfo, logger.LogInfo, logger.LogWarning, s => logger.LogError( s ) ); - public bool NoFetch { get; set; } - public override bool Execute() - { + Output output = null; try { - InnerExecute(); - return true; + output = InnerExecute(logger, input); } catch (WarningException errorException) { - this.LogWarning(errorException.Message); - return true; + logger.LogWarning(errorException.Message); + output = new Output(); } catch (Exception exception) { - this.LogError("Error occurred: " + exception); - return false; + logger.LogError("Error occurred: " + exception); + throw; } + finally + { + Logger.Reset(); + } + + return output; } - void InnerExecute() + private static Output InnerExecute( + TaskLogger logger, + Input input + ) { - VersionVariables result; - if (!ExecuteCore.TryGetVersion(SolutionDirectory, out result, NoFetch, new Authentication())) + var execute = GitVersionTaskBase.CreateExecuteCore(); + if (!execute.TryGetVersion(input.SolutionDirectory, out var result, input.NoFetch, new Authentication())) { - return; + return null; } - WriteIntegrationParameters(BuildServerList.GetApplicableBuildServers(), result); + WriteIntegrationParameters(logger, BuildServerList.GetApplicableBuildServers(), result); + + return new Output(); } - void WriteIntegrationParameters(IEnumerable applicableBuildServers, VersionVariables variables) + private static void WriteIntegrationParameters(TaskLogger logger, IEnumerable applicableBuildServers, VersionVariables variables) { foreach (var buildServer in applicableBuildServers) { - this.LogInfo(string.Format("Executing GenerateSetVersionMessage for '{0}'.", buildServer.GetType().Name)); - this.LogInfo(buildServer.GenerateSetVersionMessage(variables)); - this.LogInfo(string.Format("Executing GenerateBuildLogOutput for '{0}'.", buildServer.GetType().Name)); + logger.LogInfo(string.Format("Executing GenerateSetVersionMessage for '{0}'.", buildServer.GetType().Name)); + logger.LogInfo(buildServer.GenerateSetVersionMessage(variables)); + logger.LogInfo(string.Format("Executing GenerateBuildLogOutput for '{0}'.", buildServer.GetType().Name)); foreach (var buildParameter in BuildOutputFormatter.GenerateBuildLogOutput(buildServer, variables)) { - this.LogInfo(buildParameter); + logger.LogInfo(buildParameter); } } } + + public sealed class Input + { + public string SolutionDirectory { get; set; } + + public bool NoFetch { get; set; } + } + + public static Boolean ValidateInput(this Input input) + { + return !String.IsNullOrEmpty( input?.SolutionDirectory ); + } + + public sealed class Output + { + // No output for this task + } } }