diff --git a/src/GitVersionTask.Tests/GetVersionTaskTests.cs b/src/GitVersionTask.Tests/GetVersionTaskTests.cs index a3f6d5c7d1..22fbaf54e5 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,9 +10,8 @@ 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); var variablesProperties = VersionVariables.AvailableVariables; diff --git a/src/GitVersionTask.Tests/GitVersionTask.Tests.csproj b/src/GitVersionTask.Tests/GitVersionTask.Tests.csproj index f28c446c74..5852a0f162 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..c25568137a 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] @@ -41,7 +39,7 @@ public void VerifyIgnoreNonAssemblyInfoFile() "); } - InvalidFileChecker.CheckForInvalidFiles(new ITaskItem[] { new MockTaskItem { ItemSpec = "SomeOtherFile.cs" } }, projectFile); + InvalidFileChecker.CheckForInvalidFiles(new[] { "SomeOtherFile.cs" }, projectFile); } [Test] @@ -57,7 +55,7 @@ public void VerifyAttributeFoundCSharp([Values("AssemblyVersion", "AssemblyFileV ", attribute); } - var ex = Assert.Throws(() => InvalidFileChecker.CheckForInvalidFiles(new ITaskItem[] { new MockTaskItem { ItemSpec = "AssemblyInfo.cs" } }, projectFile), attribute); + 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")); } @@ -75,7 +73,7 @@ public void VerifyUnformattedAttributeFoundCSharp([Values("AssemblyVersion", "As ", attribute); } - var ex = Assert.Throws(() => InvalidFileChecker.CheckForInvalidFiles(new ITaskItem[] { new MockTaskItem { ItemSpec = "AssemblyInfo.cs" } }, projectFile), attribute); + 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")); } @@ -92,7 +90,7 @@ public void VerifyCommentWorksCSharp([Values("AssemblyVersion", "AssemblyFileVer ", attribute); } - InvalidFileChecker.CheckForInvalidFiles(new ITaskItem[] { new MockTaskItem { ItemSpec = "AssemblyInfo.cs" } }, projectFile); + InvalidFileChecker.CheckForInvalidFiles(new[] { "AssemblyInfo.cs" }, projectFile); } [Test] @@ -111,7 +109,7 @@ public class Temp ", attribute); } - InvalidFileChecker.CheckForInvalidFiles(new ITaskItem[] { new MockTaskItem { ItemSpec = "AssemblyInfo.cs" } }, projectFile); + InvalidFileChecker.CheckForInvalidFiles(new[] { "AssemblyInfo.cs" }, projectFile); } [Test] @@ -129,7 +127,7 @@ public class {0} ", attribute); } - InvalidFileChecker.CheckForInvalidFiles(new ITaskItem[] { new MockTaskItem { ItemSpec = "AssemblyInfo.cs" } }, projectFile); + InvalidFileChecker.CheckForInvalidFiles(new[] { "AssemblyInfo.cs" }, projectFile); } [Test] @@ -145,7 +143,7 @@ Imports System.Reflection ", attribute); } - var ex = Assert.Throws(() => InvalidFileChecker.CheckForInvalidFiles(new ITaskItem[] { new MockTaskItem { ItemSpec = "AssemblyInfo.vb" } }, projectFile), attribute); + 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")); } @@ -163,7 +161,7 @@ Imports System.Reflection ", attribute); } - var ex = Assert.Throws(() => InvalidFileChecker.CheckForInvalidFiles(new ITaskItem[] { new MockTaskItem { ItemSpec = "AssemblyInfo.vb" } }, projectFile), attribute); + 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")); } @@ -180,7 +178,7 @@ Imports System.Reflection ", attribute); } - InvalidFileChecker.CheckForInvalidFiles(new ITaskItem[] { new MockTaskItem { ItemSpec = "AssemblyInfo.vb" } }, projectFile); + InvalidFileChecker.CheckForInvalidFiles(new[] { "AssemblyInfo.vb" }, projectFile); } [Test] @@ -198,7 +196,7 @@ End Class ", attribute); } - InvalidFileChecker.CheckForInvalidFiles(new ITaskItem[] { new MockTaskItem { ItemSpec = "AssemblyInfo.vb" } }, projectFile); + InvalidFileChecker.CheckForInvalidFiles(new[] { "AssemblyInfo.vb" }, projectFile); } [Test] @@ -215,6 +213,6 @@ End Class ", 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 6cb61e7034..fef30f5e89 100644 --- a/src/GitVersionTask/GenerateGitVersionInformation.cs +++ b/src/GitVersionTask/GenerateGitVersionInformation.cs @@ -1,42 +1,99 @@ namespace GitVersionTask { + using System; using System.IO; using GitVersion; using GitVersion.Helpers; - using Microsoft.Build.Framework; - public class GenerateGitVersionInformation : GitVersionTaskBase + public static class GenerateGitVersionInformation { - [Required] - public string ProjectFile { get; set; } + public static Output Execute( + Input input + ) + { + if ( !input.ValidateInput() ) + { + throw new Exception( "Invalid input." ); + } - [Required] - public string IntermediateOutputPath { get; set; } + var logger = new TaskLogger(); + Logger.SetLoggers( logger.LogInfo, logger.LogInfo, logger.LogWarning, s => logger.LogError( s ) ); - [Required] - public string Language { get; set; } - [Output] - public string GitVersionInformationFilePath { get; set; } + Output output = null; + try + { + output = InnerExecute(input ); + } + catch (WarningException errorException) + { + logger.LogWarning(errorException.Message); + output = new Output(); + } + catch (Exception exception) + { + logger.LogError("Error occurred: " + exception); + throw; + } + finally + { + Logger.Reset(); + } - protected override void InnerExecute() + return output; + } + + private static Output InnerExecute( Input input ) { - if (GetVersionVariables(out var versionVariables)) return; + var execute = GitVersionTaskBase.CreateExecuteCore(); + if (!execute.TryGetVersion(input.SolutionDirectory, out var versionVariables, input.NoFetch, new Authentication())) + { + return null; + } - var fileExtension = TaskUtils.GetFileExtension(Language); - var fileName = $"GitVersionInformation.g.{fileExtension}"; + var fileWriteInfo = input.IntermediateOutputPath.GetWorkingDirectoryAndFileNameAndExtension( + input.Language, + input.ProjectFile, + ( pf, ext ) => $"GitVersionInformation.g.{ext}", + ( pf, ext ) => $"GitVersionInformation_{Path.GetFileNameWithoutExtension( pf )}_{Path.GetRandomFileName()}.g.{ext}" + ); - if (IntermediateOutputPath == null) + var output = new Output() { - fileName = $"GitVersionInformation_{Path.GetFileNameWithoutExtension(ProjectFile)}_{Path.GetRandomFileName()}.g.{fileExtension}"; - } + GitVersionInformationFilePath = Path.Combine( fileWriteInfo.WorkingDirectory, fileWriteInfo.FileName ) + }; + var generator = new GitVersionInformationGenerator( fileWriteInfo.FileName, fileWriteInfo.WorkingDirectory, versionVariables, new FileSystem()); + generator.Generate(); - var workingDirectory = IntermediateOutputPath ?? TempFileTracker.TempPath; + return output; + } - GitVersionInformationFilePath = Path.Combine(workingDirectory, fileName); + public sealed class Input + { + public string SolutionDirectory { get; set; } - var generator = new GitVersionInformationGenerator(fileName, workingDirectory, versionVariables, new FileSystem()); - generator.Generate(); + public string ProjectFile { get; set; } + + public string IntermediateOutputPath { 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) // 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 5b8dcb0244..dd1e7a27e1 100644 --- a/src/GitVersionTask/GetVersion.cs +++ b/src/GitVersionTask/GetVersion.cs @@ -1,108 +1,129 @@ namespace GitVersionTask { - using Microsoft.Build.Framework; + using System; + using GitVersion; - public class GetVersion : GitVersionTaskBase + public static class GetVersion { - [Output] - public string Major { get; set; } + 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(); + } + + return output; + } - [Output] - public string Minor { get; set; } + public sealed class Input + { + public string SolutionDirectory { get; set; } - [Output] - public string Patch { get; set; } + public bool NoFetch { get; set; } + } - [Output] - public string PreReleaseTag { get; set; } + private static Boolean ValidateInput(this Input input) + { + return !String.IsNullOrEmpty( input?.SolutionDirectory ); + } - [Output] - public string PreReleaseTagWithDash { get; set; } + public sealed class Output + { + public string Major { get; set; } - [Output] - public string PreReleaseLabel { get; set; } + public string Minor { get; set; } - [Output] - public string PreReleaseNumber { get; set; } + public string Patch { get; set; } - [Output] - public string WeightedPreReleaseNumber { get; set; } + public string PreReleaseTag { get; set; } - [Output] - public string BuildMetaData { get; set; } + public string PreReleaseTagWithDash { get; set; } - [Output] - public string BuildMetaDataPadded { get; set; } + public string PreReleaseLabel { get; set; } - [Output] - public string FullBuildMetaData { get; set; } + public string PreReleaseNumber { get; set; } - [Output] - public string MajorMinorPatch { get; set; } + public string WeightedPreReleaseNumber { get; set; } - [Output] - public string SemVer { get; set; } + public string BuildMetaData { get; set; } - [Output] - public string LegacySemVer { get; set; } + public string BuildMetaDataPadded { get; set; } - [Output] - public string LegacySemVerPadded { get; set; } + public string FullBuildMetaData { get; set; } - [Output] - public string AssemblySemVer { get; set; } + public string MajorMinorPatch { get; set; } - [Output] - public string AssemblySemFileVer { get; set; } + public string SemVer { get; set; } - [Output] - public string FullSemVer { get; set; } + public string LegacySemVer { get; set; } - [Output] - public string InformationalVersion { get; set; } + public string LegacySemVerPadded { get; set; } - [Output] - public string BranchName { get; set; } + public string AssemblySemVer { get; set; } - [Output] - public string Sha { get; set; } + public string AssemblySemFileVer { get; set; } - [Output] - public string ShortSha { get; set; } + public string FullSemVer { get; set; } - [Output] - public string NuGetVersionV2 { get; set; } + public string InformationalVersion { get; set; } - [Output] - public string NuGetVersion { get; set; } + public string BranchName { get; set; } - [Output] - public string NuGetPreReleaseTagV2 { get; set; } + public string Sha { get; set; } - [Output] - public string NuGetPreReleaseTag { get; set; } + public string ShortSha { get; set; } - [Output] - public string CommitDate { get; set; } + public string NuGetVersionV2 { 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; } - protected override void InnerExecute() - { - if (GetVersionVariables(out var versionVariables)) return; - - var thisType = typeof(GetVersion); - foreach (var variable in versionVariables) - { - thisType.GetProperty(variable.Key)?.SetValue(this, variable.Value, null); - } + public string CommitDate { get; set; } + + public string VersionSourceSha { get; set; } + + public string CommitsSinceVersionSource { get; set; } + + public string CommitsSinceVersionSourcePadded { get; set; } } } + + } diff --git a/src/GitVersionTask/GitVersionTask.csproj b/src/GitVersionTask/GitVersionTask.csproj index 4aa0a34c77..a556649cba 100644 --- a/src/GitVersionTask/GitVersionTask.csproj +++ b/src/GitVersionTask/GitVersionTask.csproj @@ -1,7 +1,7 @@ - + net461;netstandard2.0 @@ -17,16 +17,17 @@ NugetAssets\GitVersionTask.nuspec 0.0.1-alpha-0001 - version=$(PackageVersion);configuration=$(Configuration);utilpackversion=$(PackageVersion_UtilPackNuGetMSBuild);libgit2sharpversion=$(PackageVersion_LibGit2Sharp);yamldotnetversion=$(PackageVersion_YamlDotNet) + version=$(PackageVersion);configuration=$(Configuration);utilpackversion=$(PackageVersion_NuGetUtilsMSBuildExec);libgit2sharpversion=$(PackageVersion_LibGit2Sharp);yamldotnetversion=$(PackageVersion_YamlDotNet) $(AssemblyName) + latest - + - + build\ @@ -37,9 +38,7 @@ All - - - + all runtime; build; native; contentfiles; analyzers diff --git a/src/GitVersionTask/GitVersionTaskBase.cs b/src/GitVersionTask/GitVersionTaskBase.cs index 37805297b5..cd68978b34 100644 --- a/src/GitVersionTask/GitVersionTaskBase.cs +++ b/src/GitVersionTask/GitVersionTaskBase.cs @@ -1,72 +1,72 @@ namespace GitVersionTask { - using System; 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 { - protected GitVersionTaskBase() - { - var fileSystem = new FileSystem(); - ExecuteCore = new ExecuteCore(fileSystem); - GitVersion.Logger.SetLoggers(LogDebug, LogInfo, LogWarning, s => LogError(s)); - } + public static ExecuteCore CreateExecuteCore() + => new ExecuteCore( new FileSystem() ); - public override bool Execute() + private static string GetFileExtension( this String language ) { - try - { - InnerExecute(); - return true; - } - catch (WarningException errorException) + switch ( language ) { - LogWarning(errorException.Message); - return true; - } - catch (Exception exception) - { - LogError("Error occurred: " + exception); - return false; - } - } - - protected abstract void InnerExecute(); - - protected ExecuteCore ExecuteCore { get; } + case "C#": + return "cs"; - [Required] - public string SolutionDirectory { get; set; } + case "F#": + return "fs"; - public bool NoFetch { get; set; } + case "VB": + return "vb"; - public void LogDebug(string message) - { - BuildEngine.LogMessageEvent(new BuildMessageEventArgs(message, string.Empty, "GitVersionTask", MessageImportance.Low)); - } - - public void LogWarning(string message) - { - 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 + ) { - 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 + ) { - BuildEngine.LogErrorEvent(new BuildErrorEventArgs(string.Empty, string.Empty, file, 0, 0, 0, 0, message, string.Empty, "GitVersionTask")); + this.WorkingDirectory = workingDirectory; + this.FileName = fileName; + this.FileExtension = fileExtension; } - protected bool GetVersionVariables(out VersionVariables versionVariables) - { - return !ExecuteCore.TryGetVersion(SolutionDirectory, out versionVariables, NoFetch, new Authentication()); - } + public String WorkingDirectory { get; } + public String FileName { get; } + public String FileExtension { get; } } } 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/UtilPack.Version.props b/src/GitVersionTask/NuGetUtils.MSBuild.Exec.Version.props similarity index 57% rename from src/GitVersionTask/UtilPack.Version.props rename to src/GitVersionTask/NuGetUtils.MSBuild.Exec.Version.props index 109fbf9d1e..a00890c752 100644 --- a/src/GitVersionTask/UtilPack.Version.props +++ b/src/GitVersionTask/NuGetUtils.MSBuild.Exec.Version.props @@ -1,6 +1,6 @@ - 2.9.1 + 2.0.5 diff --git a/src/GitVersionTask/NugetAssets/GitVersionTask.nuspec b/src/GitVersionTask/NugetAssets/GitVersionTask.nuspec index b3436fdce8..4a95b6e0d8 100644 --- a/src/GitVersionTask/NugetAssets/GitVersionTask.nuspec +++ b/src/GitVersionTask/NugetAssets/GitVersionTask.nuspec @@ -1,4 +1,4 @@ - + GitVersionTask @@ -17,15 +17,15 @@ Git Versioning GitVersion GitFlowVersion GitFlow GitHubFlow SemVer - + - + - + @@ -33,6 +33,6 @@ - + diff --git a/src/GitVersionTask/NugetAssets/build/Infrastructure.props b/src/GitVersionTask/NugetAssets/build/Infrastructure.props index e5ff8092e1..4ef57bf76a 100644 --- a/src/GitVersionTask/NugetAssets/build/Infrastructure.props +++ b/src/GitVersionTask/NugetAssets/build/Infrastructure.props @@ -1,5 +1,5 @@ - - + + @@ -9,22 +9,21 @@ $(GitVersionTaskBuildTools_FunctionalityDir)obj/ - - $(PackageVersion_UtilPackNuGetMSBuild) - $(MSBuildThisFileDirectory)../../../utilpack.nuget.msbuild/$(UtilPackVersion)/build/UtilPack.NuGet.MSBuild.props + + $(PackageVersion_NuGetUtilsMSBuildExec) + $(MSBuildThisFileDirectory)../../../nugetutils.msbuild.exec/$(UtilPackVersion)/build/NuGetUtils.MSBuild.Exec.props $([System.IO.Path]::GetFullPath('$(UtilPackNuGetMSBuildPropsPath)')) - true + true - .NETFramework - 4.6.1 + net461 $(UtilPackTaskFactoryParametersXML) @@ -35,7 +34,7 @@ - + diff --git a/src/GitVersionTask/NugetAssets/build/functionality/GitVersionCommon.props b/src/GitVersionTask/NugetAssets/build/functionality/GitVersionCommon.props index 36b320e5a5..5e868860fb 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 e386bbae8f..87744a9c01 100644 --- a/src/GitVersionTask/UpdateAssemblyInfo.cs +++ b/src/GitVersionTask/UpdateAssemblyInfo.cs @@ -1,58 +1,116 @@ namespace GitVersionTask { + using System; using System.IO; using GitVersion; using GitVersion.Helpers; - using Microsoft.Build.Framework; - public class UpdateAssemblyInfo : GitVersionTaskBase + public static class UpdateAssemblyInfo { - [Required] - public string ProjectFile { get; set; } - - [Required] - public string IntermediateOutputPath { get; set; } + public static Output Execute( + Input input + ) + { + if ( !input.ValidateInput() ) + { + throw new Exception( "Invalid input." ); + } - [Required] - public ITaskItem[] CompileFiles { get; set; } + var logger = new TaskLogger(); + Logger.SetLoggers( logger.LogInfo, logger.LogInfo, logger.LogWarning, s => logger.LogError( s ) ); - [Required] - public string Language { get; set; } + Output output = null; + try + { + output = InnerExecute( input ); + } + catch (WarningException errorException) + { + logger.LogWarning(errorException.Message); + output = new Output(); + } + catch (Exception exception) + { + logger.LogError("Error occurred: " + exception); + throw; + } + finally + { + Logger.Reset(); + } - [Output] - public string AssemblyInfoTempFilePath { get; set; } + return output; + } - protected override void InnerExecute() + private static Output InnerExecute( Input input ) { + var execute = GitVersionTaskBase.CreateExecuteCore(); + TempFileTracker.DeleteTempFiles(); - InvalidFileChecker.CheckForInvalidFiles(CompileFiles, ProjectFile); + InvalidFileChecker.CheckForInvalidFiles(input.CompileFiles, input.ProjectFile); - if (GetVersionVariables(out var versionVariables)) return; + if (!execute.TryGetVersion( input.SolutionDirectory, out var versionVariables, input.NoFetch, new Authentication())) + { + return null; + } - CreateTempAssemblyInfo(versionVariables); + return CreateTempAssemblyInfo(input, versionVariables); } - private void CreateTempAssemblyInfo(VersionVariables versionVariables) + private static Output CreateTempAssemblyInfo( Input input, VersionVariables versionVariables) { - var fileExtension = TaskUtils.GetFileExtension(Language); - var assemblyInfoFileName = $"GitVersionTaskAssemblyInfo.g.{fileExtension}"; + var fileWriteInfo = input.IntermediateOutputPath.GetWorkingDirectoryAndFileNameAndExtension( + input.Language, + input.ProjectFile, + ( pf, ext ) => $"GitVersionTaskAssemblyInfo.g.{ext}", + ( pf, ext ) => $"AssemblyInfo_{Path.GetFileNameWithoutExtension( pf )}_{Path.GetRandomFileName()}.g.{ext}" + ); - if (IntermediateOutputPath == null) + var output = new Output() { - assemblyInfoFileName = $"AssemblyInfo_{Path.GetFileNameWithoutExtension(ProjectFile)}_{Path.GetRandomFileName()}.g.{fileExtension}"; - } + AssemblyInfoTempFilePath = Path.Combine( fileWriteInfo.WorkingDirectory, fileWriteInfo.FileName ) + }; - var workingDirectory = IntermediateOutputPath ?? TempFileTracker.TempPath; - - AssemblyInfoTempFilePath = Path.Combine(workingDirectory, assemblyInfoFileName); - - 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; + } + + public sealed class Input + { + public string SolutionDirectory { get; set; } + + public string ProjectFile { get; set; } + + public string IntermediateOutputPath { get; set; } + + 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/WriteVersionInfoToBuildLog.cs b/src/GitVersionTask/WriteVersionInfoToBuildLog.cs index 03340b7947..777dca7192 100644 --- a/src/GitVersionTask/WriteVersionInfoToBuildLog.cs +++ b/src/GitVersionTask/WriteVersionInfoToBuildLog.cs @@ -1,29 +1,93 @@ namespace GitVersionTask { + using System; using System.Collections.Generic; using GitVersion; - public class WriteVersionInfoToBuildLog : GitVersionTaskBase + public static class WriteVersionInfoToBuildLog { - protected override void InnerExecute() + + public static Output Execute( + Input input + ) { - if (GetVersionVariables(out var versionVariables)) return; + if ( !input.ValidateInput() ) + { + throw new Exception( "Invalid input." ); + } + + var logger = new TaskLogger(); + Logger.SetLoggers( logger.LogInfo, logger.LogInfo, logger.LogWarning, s => logger.LogError( s ) ); + + + Output output = null; + try + { + output = InnerExecute(logger, input); + } + catch (WarningException errorException) + { + logger.LogWarning(errorException.Message); + output = new Output(); + } + catch (Exception exception) + { + logger.LogError("Error occurred: " + exception); + throw; + } + finally + { + Logger.Reset(); + } - WriteIntegrationParameters(BuildServerList.GetApplicableBuildServers(), versionVariables); + return output; } - private void WriteIntegrationParameters(IEnumerable applicableBuildServers, VersionVariables versionVariables) + private static Output InnerExecute( + TaskLogger logger, + Input input + ) + { + var execute = GitVersionTaskBase.CreateExecuteCore(); + if (!execute.TryGetVersion(input.SolutionDirectory, out var result, input.NoFetch, new Authentication())) + { + return null; + } + + WriteIntegrationParameters(logger, BuildServerList.GetApplicableBuildServers(), result); + + return new Output(); + } + + private static void WriteIntegrationParameters(TaskLogger logger, IEnumerable applicableBuildServers, VersionVariables variables) { foreach (var buildServer in applicableBuildServers) { - LogInfo($"Executing GenerateSetVersionMessage for '{buildServer.GetType().Name}'."); - LogInfo(buildServer.GenerateSetVersionMessage(versionVariables)); - LogInfo($"Executing GenerateBuildLogOutput for '{buildServer.GetType().Name}'."); - foreach (var buildParameter in BuildOutputFormatter.GenerateBuildLogOutput(buildServer, versionVariables)) + 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)) { - 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 + } } }