diff --git a/src/GitVersionCore.Tests/AssemblyInfoFileUpdaterTests.cs b/src/GitVersionCore.Tests/AssemblyInfoFileUpdaterTests.cs index f2e491b267..0700f6a520 100644 --- a/src/GitVersionCore.Tests/AssemblyInfoFileUpdaterTests.cs +++ b/src/GitVersionCore.Tests/AssemblyInfoFileUpdaterTests.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.IO; +using System.Linq; using GitVersion; using GitVersion.Extensions; using GitVersion.Extensions.VersionAssemblyInfoResources; @@ -47,8 +48,8 @@ public void ShouldCreateAssemblyInfoFileWhenNotExistsAndEnsureAssemblyInfo(strin var fullPath = Path.Combine(workingDir, assemblyInfoFile); var variables = variableProvider.GetVariablesFor(SemanticVersion.Parse("1.0.0", "v"), new TestEffectiveConfiguration(), false); - using var assemblyInfoFileUpdater = new AssemblyInfoFileUpdater(assemblyInfoFile, workingDir, variables, fileSystem, log, true); - assemblyInfoFileUpdater.Update(); + using var assemblyInfoFileUpdater = new AssemblyInfoFileUpdater(log, fileSystem); + assemblyInfoFileUpdater.Update(variables, true, workingDir, assemblyInfoFile); fileSystem.ReadAllText(fullPath).ShouldMatchApproved(c => c.SubFolder(Path.Combine("Approved", fileExtension))); } @@ -65,8 +66,8 @@ public void ShouldCreateAssemblyInfoFileAtPathWhenNotExistsAndEnsureAssemblyInfo var fullPath = Path.Combine(workingDir, assemblyInfoFile); var variables = variableProvider.GetVariablesFor(SemanticVersion.Parse("1.0.0", "v"), new TestEffectiveConfiguration(), false); - using var assemblyInfoFileUpdater = new AssemblyInfoFileUpdater(assemblyInfoFile, workingDir, variables, fileSystem, log, true); - assemblyInfoFileUpdater.Update(); + using var assemblyInfoFileUpdater = new AssemblyInfoFileUpdater(log, fileSystem); + assemblyInfoFileUpdater.Update(variables, true, workingDir, assemblyInfoFile); fileSystem.ReadAllText(fullPath).ShouldMatchApproved(c => c.SubFolder(Path.Combine("Approved", fileExtension))); } @@ -86,8 +87,8 @@ public void ShouldCreateAssemblyInfoFilesAtPathWhenNotExistsAndEnsureAssemblyInf }; var variables = variableProvider.GetVariablesFor(SemanticVersion.Parse("1.0.0", "v"), new TestEffectiveConfiguration(), false); - using var assemblyInfoFileUpdater = new AssemblyInfoFileUpdater(assemblyInfoFiles, workingDir, variables, fileSystem, log, true); - assemblyInfoFileUpdater.Update(); + using var assemblyInfoFileUpdater = new AssemblyInfoFileUpdater(log, fileSystem); + assemblyInfoFileUpdater.Update(variables, true, workingDir, assemblyInfoFiles.ToArray()); foreach (var item in assemblyInfoFiles) { @@ -106,8 +107,8 @@ public void ShouldNotCreateAssemblyInfoFileWhenNotExistsAndNotEnsureAssemblyInfo var fullPath = Path.Combine(workingDir, assemblyInfoFile); var variables = variableProvider.GetVariablesFor(SemanticVersion.Parse("1.0.0", "v"), new TestEffectiveConfiguration(), false); - using var assemblyInfoFileUpdater = new AssemblyInfoFileUpdater(assemblyInfoFile, workingDir, variables, fileSystem, log, false); - assemblyInfoFileUpdater.Update(); + using var assemblyInfoFileUpdater = new AssemblyInfoFileUpdater(log, fileSystem); + assemblyInfoFileUpdater.Update(variables, false, workingDir, assemblyInfoFile); fileSystem.Exists(fullPath).ShouldBeFalse(); } @@ -121,8 +122,8 @@ public void ShouldNotCreateAssemblyInfoFileForUnknownSourceCodeAndEnsureAssembly var fullPath = Path.Combine(workingDir, assemblyInfoFile); var variables = variableProvider.GetVariablesFor(SemanticVersion.Parse("1.0.0", "v"), new TestEffectiveConfiguration(), false); - using var assemblyInfoFileUpdater = new AssemblyInfoFileUpdater(assemblyInfoFile, workingDir, variables, fileSystem, log, true); - assemblyInfoFileUpdater.Update(); + using var assemblyInfoFileUpdater = new AssemblyInfoFileUpdater(log, fileSystem); + assemblyInfoFileUpdater.Update(variables, true, workingDir, assemblyInfoFile); fileSystem.Received(0).WriteAllText(fullPath, Arg.Any()); } @@ -135,8 +136,8 @@ public void ShouldStartSearchFromWorkingDirectory() var assemblyInfoFiles = new HashSet(); var variables = variableProvider.GetVariablesFor(SemanticVersion.Parse("1.0.0", "v"), new TestEffectiveConfiguration(), false); - using var assemblyInfoFileUpdater = new AssemblyInfoFileUpdater(assemblyInfoFiles, workingDir, variables, fileSystem, log, false); - assemblyInfoFileUpdater.Update(); + using var assemblyInfoFileUpdater = new AssemblyInfoFileUpdater(log, fileSystem); + assemblyInfoFileUpdater.Update(variables, false, workingDir, assemblyInfoFiles.ToArray()); fileSystem.Received().DirectoryGetFiles(Arg.Is(workingDir), Arg.Any(), Arg.Any()); } @@ -152,8 +153,8 @@ public void ShouldReplaceAssemblyVersion(string fileExtension, string assemblyFi VerifyAssemblyInfoFile(assemblyFileContent, fileName, AssemblyVersioningScheme.MajorMinor, (fs, variables) => { - using var assemblyInfoFileUpdater = new AssemblyInfoFileUpdater(assemblyInfoFile, workingDir, variables, fs, log, false); - assemblyInfoFileUpdater.Update(); + using var assemblyInfoFileUpdater = new AssemblyInfoFileUpdater(log, fs); + assemblyInfoFileUpdater.Update(variables, false, workingDir, assemblyInfoFile); fs.Received().WriteAllText(fileName, Arg.Is(s => s.Contains(@"AssemblyVersion(""2.3.0.0"")") && @@ -175,8 +176,8 @@ public void ShouldNotReplaceAssemblyVersionWhenVersionSchemeIsNone(string fileEx VerifyAssemblyInfoFile(assemblyFileContent, fileName, AssemblyVersioningScheme.None, verify: (fs, variables) => { - using var assemblyInfoFileUpdater = new AssemblyInfoFileUpdater(assemblyInfoFile, workingDir, variables, fs, log, false); - assemblyInfoFileUpdater.Update(); + using var assemblyInfoFileUpdater = new AssemblyInfoFileUpdater(log, fs); + assemblyInfoFileUpdater.Update(variables, false, workingDir, assemblyInfoFile); assemblyFileContent = fs.ReadAllText(fileName); assemblyFileContent.ShouldMatchApproved(c => c.SubFolder(Path.Combine("Approved", fileExtension))); @@ -194,8 +195,8 @@ public void ShouldReplaceAssemblyVersionInRelativePath(string fileExtension, str VerifyAssemblyInfoFile(assemblyFileContent, fileName, AssemblyVersioningScheme.MajorMinor, (fs, variables) => { - using var assemblyInfoFileUpdater = new AssemblyInfoFileUpdater(assemblyInfoFile, workingDir, variables, fs, log, false); - assemblyInfoFileUpdater.Update(); + using var assemblyInfoFileUpdater = new AssemblyInfoFileUpdater(log, fs); + assemblyInfoFileUpdater.Update(variables, false, workingDir, assemblyInfoFile); fs.Received().WriteAllText(fileName, Arg.Is(s => s.Contains(@"AssemblyVersion(""2.3.0.0"")") && @@ -215,8 +216,8 @@ public void ShouldReplaceAssemblyVersionInRelativePathWithWhiteSpace(string file VerifyAssemblyInfoFile(assemblyFileContent, fileName, AssemblyVersioningScheme.MajorMinor, (fs, variables) => { - using var assemblyInfoFileUpdater = new AssemblyInfoFileUpdater(assemblyInfoFile, workingDir, variables, fs, log, false); - assemblyInfoFileUpdater.Update(); + using var assemblyInfoFileUpdater = new AssemblyInfoFileUpdater(log, fs); + assemblyInfoFileUpdater.Update(variables, false, workingDir, assemblyInfoFile); fs.Received().WriteAllText(fileName, Arg.Is(s => s.Contains(@"AssemblyVersion(""2.3.0.0"")") && @@ -236,8 +237,8 @@ public void ShouldReplaceAssemblyVersionWithStar(string fileExtension, string as VerifyAssemblyInfoFile(assemblyFileContent, fileName, AssemblyVersioningScheme.MajorMinor, (fs, variables) => { - using var assemblyInfoFileUpdater = new AssemblyInfoFileUpdater(assemblyInfoFile, workingDir, variables, fs, log, false); - assemblyInfoFileUpdater.Update(); + using var assemblyInfoFileUpdater = new AssemblyInfoFileUpdater(log, fs); + assemblyInfoFileUpdater.Update(variables, false, workingDir, assemblyInfoFile); fs.Received().WriteAllText(fileName, Arg.Is(s => s.Contains(@"AssemblyVersion(""2.3.0.0"")") && @@ -257,8 +258,8 @@ public void ShouldReplaceAssemblyVersionWithAtttributeSuffix(string fileExtensio VerifyAssemblyInfoFile(assemblyFileContent, fileName, verify: (fs, variables) => { - using var assemblyInfoFileUpdater = new AssemblyInfoFileUpdater(assemblyInfoFile, workingDir, variables, fs, log, false); - assemblyInfoFileUpdater.Update(); + using var assemblyInfoFileUpdater = new AssemblyInfoFileUpdater(log, fs); + assemblyInfoFileUpdater.Update(variables, false, workingDir, assemblyInfoFile); fs.Received().WriteAllText(fileName, Arg.Is(s => !s.Contains(@"AssemblyVersionAttribute(""1.0.0.0"")") && @@ -281,8 +282,8 @@ public void ShouldAddAssemblyVersionIfMissingFromInfoFile(string fileExtension) VerifyAssemblyInfoFile("", fileName, AssemblyVersioningScheme.MajorMinor, (fs, variables) => { - using var assemblyInfoFileUpdater = new AssemblyInfoFileUpdater(assemblyInfoFile, workingDir, variables, fs, log, false); - assemblyInfoFileUpdater.Update(); + using var assemblyInfoFileUpdater = new AssemblyInfoFileUpdater(log, fs); + assemblyInfoFileUpdater.Update(variables, false, workingDir, assemblyInfoFile); fs.Received().WriteAllText(fileName, Arg.Is(s => s.Contains(@"AssemblyVersion(""2.3.0.0"")") && @@ -302,8 +303,8 @@ public void ShouldReplaceAlreadySubstitutedValues(string fileExtension, string a VerifyAssemblyInfoFile(assemblyFileContent, fileName, AssemblyVersioningScheme.MajorMinor, (fs, variables) => { - using var assemblyInfoFileUpdater = new AssemblyInfoFileUpdater(assemblyInfoFile, workingDir, variables, fs, log, false); - assemblyInfoFileUpdater.Update(); + using var assemblyInfoFileUpdater = new AssemblyInfoFileUpdater(log, fs); + assemblyInfoFileUpdater.Update(variables, false, workingDir, assemblyInfoFile); fs.Received().WriteAllText(fileName, Arg.Is(s => s.Contains(@"AssemblyVersion(""2.3.0.0"")") && @@ -323,8 +324,8 @@ public void ShouldReplaceAssemblyVersionWhenCreatingAssemblyVersionFileAndEnsure VerifyAssemblyInfoFile(assemblyFileContent, fileName, verify: (fs, variables) => { - using var assemblyInfoFileUpdater = new AssemblyInfoFileUpdater(assemblyInfoFile, workingDir, variables, fs, log, false); - assemblyInfoFileUpdater.Update(); + using var assemblyInfoFileUpdater = new AssemblyInfoFileUpdater(log, fs); + assemblyInfoFileUpdater.Update(variables, false, workingDir, assemblyInfoFile); fs.Received().WriteAllText(fileName, Arg.Is(s => s.Contains(@"AssemblyVersion(""2.3.1.0"")") && @@ -344,8 +345,8 @@ public void ShouldReplaceAssemblyVersionInRelativePathWithVariables(string fileE VerifyAssemblyInfoFile(assemblyFileContent, fileName, AssemblyVersioningScheme.MajorMinor, (fs, variables) => { - using var assemblyInfoFileUpdater = new AssemblyInfoFileUpdater(assemblyInfoFile, workingDir, variables, fs, log, false); - assemblyInfoFileUpdater.Update(); + using var assemblyInfoFileUpdater = new AssemblyInfoFileUpdater(log, fs); + assemblyInfoFileUpdater.Update(variables, false, workingDir, assemblyInfoFile); fs.Received().WriteAllText(fileName, Arg.Is(s => s.Contains(@"AssemblyVersion(""2.3.0.0"")") && @@ -365,8 +366,8 @@ public void ShouldReplaceAssemblyVersionInRelativePathWithVariablesAndWhiteSpace VerifyAssemblyInfoFile(assemblyFileContent, fileName, AssemblyVersioningScheme.MajorMinor, (fs, variables) => { - using var assemblyInfoFileUpdater = new AssemblyInfoFileUpdater(assemblyInfoFile, workingDir, variables, fs, log, false); - assemblyInfoFileUpdater.Update(); + using var assemblyInfoFileUpdater = new AssemblyInfoFileUpdater(log, fs); + assemblyInfoFileUpdater.Update(variables, false, workingDir, assemblyInfoFile); fs.Received().WriteAllText(fileName, Arg.Is(s => s.Contains(@"AssemblyVersion(""2.3.0.0"")") && @@ -388,8 +389,8 @@ public void ShouldAddAssemblyInformationalVersionWhenUpdatingAssemblyVersionFile VerifyAssemblyInfoFile(assemblyFileContent, fileName, verify: (fs, variables) => { - using var assemblyInfoFileUpdater = new AssemblyInfoFileUpdater(assemblyInfoFile, workingDir, variables, fs, log, false); - assemblyInfoFileUpdater.Update(); + using var assemblyInfoFileUpdater = new AssemblyInfoFileUpdater(log, fs); + assemblyInfoFileUpdater.Update(variables, false, workingDir, assemblyInfoFile); assemblyFileContent = fs.ReadAllText(fileName); assemblyFileContent.ShouldMatchApproved(c => c.SubFolder(Path.Combine("Approved", fileExtension))); @@ -409,8 +410,8 @@ public void Issue1183ShouldAddFSharpAssemblyInformationalVersionBesideOtherAttri VerifyAssemblyInfoFile(assemblyFileContent, fileName, verify: (fs, variables) => { - using var assemblyInfoFileUpdater = new AssemblyInfoFileUpdater(assemblyInfoFile, workingDir, variables, fs, log, false); - assemblyInfoFileUpdater.Update(); + using var assemblyInfoFileUpdater = new AssemblyInfoFileUpdater(log, fs); + assemblyInfoFileUpdater.Update(variables, false, workingDir, assemblyInfoFile); assemblyFileContent = fs.ReadAllText(fileName); assemblyFileContent.ShouldMatchApproved(c => c.SubFolder(Path.Combine("Approved", fileExtension))); @@ -430,8 +431,8 @@ public void ShouldNotAddAssemblyInformationalVersionWhenUpdatingAssemblyVersionF VerifyAssemblyInfoFile(assemblyFileContent, fileName, AssemblyVersioningScheme.None, verify: (fs, variables) => { - using var assemblyInfoFileUpdater = new AssemblyInfoFileUpdater(assemblyInfoFile, workingDir, variables, fs, log, false); - assemblyInfoFileUpdater.Update(); + using var assemblyInfoFileUpdater = new AssemblyInfoFileUpdater(log, fs); + assemblyInfoFileUpdater.Update(variables, false, workingDir, assemblyInfoFile); assemblyFileContent = fs.ReadAllText(fileName); assemblyFileContent.ShouldMatchApproved(c => c.SubFolder(Path.Combine("Approved", fileExtension))); diff --git a/src/GitVersionCore.Tests/DynamicRepositoryTests.cs b/src/GitVersionCore.Tests/DynamicRepositoryTests.cs index 33f0a8255f..b2fa0750d5 100644 --- a/src/GitVersionCore.Tests/DynamicRepositoryTests.cs +++ b/src/GitVersionCore.Tests/DynamicRepositoryTests.cs @@ -82,7 +82,7 @@ public void FindsVersionInDynamicRepo(string name, string url, string targetBran var gitPreparer = sp.GetService(); gitPreparer.Prepare(); - var gitVersionCalculator = sp.GetService(); + var gitVersionCalculator = sp.GetService(); var versionVariables = gitVersionCalculator.CalculateVersionVariables(); diff --git a/src/GitVersionCore.Tests/GitVersionExecutorTests.cs b/src/GitVersionCore.Tests/GitVersionExecutorTests.cs index cd4e9cff48..06b190bf55 100644 --- a/src/GitVersionCore.Tests/GitVersionExecutorTests.cs +++ b/src/GitVersionCore.Tests/GitVersionExecutorTests.cs @@ -505,7 +505,7 @@ public void GetDotGitDirectoryWorktree() } } - private IGitVersionCalculator GetGitVersionCalculator(Arguments arguments, ILog logger = null, IRepository repository = null, IFileSystem fs = null) + private IGitVersionTool GetGitVersionCalculator(Arguments arguments, ILog logger = null, IRepository repository = null, IFileSystem fs = null) { sp = GetServiceProvider(arguments, logger, repository, fs); @@ -514,7 +514,7 @@ private IGitVersionCalculator GetGitVersionCalculator(Arguments arguments, ILog gitVersionCache = sp.GetService(); gitPreparer = sp.GetService(); - return sp.GetService(); + return sp.GetService(); } private static IServiceProvider GetServiceProvider(Arguments arguments, ILog log = null, IRepository repository = null, IFileSystem fileSystem = null) diff --git a/src/GitVersionCore.Tests/GitVersionInformationGeneratorTests.cs b/src/GitVersionCore.Tests/GitVersionInformationGeneratorTests.cs index aa3b1c50d4..a202b4dfa4 100644 --- a/src/GitVersionCore.Tests/GitVersionInformationGeneratorTests.cs +++ b/src/GitVersionCore.Tests/GitVersionInformationGeneratorTests.cs @@ -47,9 +47,9 @@ public void ShouldCreateFile(string fileExtension) var variableProvider = sp.GetService(); var variables = variableProvider.GetVariablesFor(semanticVersion, new TestEffectiveConfiguration(), false); - var generator = new GitVersionInformationGenerator(fileName, directory, variables, fileSystem); + var generator = new GitVersionInformationGenerator(fileSystem); - generator.Generate(); + generator.Generate(variables, new FileWriteInfo(directory, fileName, fileExtension)); fileSystem.ReadAllText(fullPath).ShouldMatchApproved(c => c.SubFolder(Path.Combine("Approved", fileExtension))); } diff --git a/src/GitVersionCore.Tests/WixFileTests.cs b/src/GitVersionCore.Tests/WixFileTests.cs index b5b4f9ba9e..0f17d120c2 100644 --- a/src/GitVersionCore.Tests/WixFileTests.cs +++ b/src/GitVersionCore.Tests/WixFileTests.cs @@ -56,12 +56,14 @@ public void UpdateWixVersionFile() var fileSystem = sp.GetService(); var variableProvider = sp.GetService(); - var vars = variableProvider.GetVariablesFor(semVer, config, false); + var versionVariables = variableProvider.GetVariablesFor(semVer, config, false); - using var wixVersionFileUpdater = new WixVersionFileUpdater(workingDir, vars, fileSystem, log); - wixVersionFileUpdater.Update(); - fileSystem.ReadAllText(wixVersionFileUpdater.WixVersionFile). - ShouldMatchApproved(c => c.SubFolder(Path.Combine("Approved"))); + using var wixVersionFileUpdater = sp.GetService(); + + var file = wixVersionFileUpdater.Update(versionVariables, workingDir); + fileSystem + .ReadAllText(file) + .ShouldMatchApproved(c => c.SubFolder(Path.Combine("Approved"))); } } } diff --git a/src/GitVersionCore/Common/IGitVersionCalculator.cs b/src/GitVersionCore/Common/IGitVersionCalculator.cs deleted file mode 100644 index 5be432deb1..0000000000 --- a/src/GitVersionCore/Common/IGitVersionCalculator.cs +++ /dev/null @@ -1,9 +0,0 @@ -using GitVersion.OutputVariables; - -namespace GitVersion -{ - public interface IGitVersionCalculator - { - VersionVariables CalculateVersionVariables(); - } -} diff --git a/src/GitVersionCore/Common/IGitVersionTool.cs b/src/GitVersionCore/Common/IGitVersionTool.cs new file mode 100644 index 0000000000..b936529642 --- /dev/null +++ b/src/GitVersionCore/Common/IGitVersionTool.cs @@ -0,0 +1,14 @@ +using System; +using GitVersion.OutputVariables; + +namespace GitVersion +{ + public interface IGitVersionTool + { + VersionVariables CalculateVersionVariables(); + void OutputVariables(VersionVariables variables, Action writter); + void UpdateAssemblyInfo(VersionVariables variables); + void UpdateWixVersionFile(VersionVariables variables); + void GenerateGitVersionInformation(VersionVariables variables, FileWriteInfo fileWriteInfo); + } +} diff --git a/src/GitVersionCore/Core/GitVersionCalculator.cs b/src/GitVersionCore/Core/GitVersionCalculator.cs deleted file mode 100644 index 332e8b70e6..0000000000 --- a/src/GitVersionCore/Core/GitVersionCalculator.cs +++ /dev/null @@ -1,62 +0,0 @@ -using System; -using GitVersion.Logging; -using GitVersion.OutputVariables; -using GitVersion.VersionCalculation; -using GitVersion.VersionCalculation.Cache; -using Microsoft.Extensions.Options; - -namespace GitVersion -{ - public class GitVersionCalculator : IGitVersionCalculator - { - private readonly ILog log; - private readonly IGitVersionCache gitVersionCache; - private readonly INextVersionCalculator nextVersionCalculator; - private readonly IVariableProvider variableProvider; - private readonly IOptions options; - private readonly IGitVersionCacheKeyFactory cacheKeyFactory; - private readonly GitVersionContext context; - - public GitVersionCalculator(ILog log, IGitVersionCache gitVersionCache, INextVersionCalculator nextVersionCalculator, IVariableProvider variableProvider, - IOptions options, IGitVersionCacheKeyFactory cacheKeyFactory, IOptions versionContext) - { - this.log = log ?? throw new ArgumentNullException(nameof(log)); - this.gitVersionCache = gitVersionCache ?? throw new ArgumentNullException(nameof(gitVersionCache)); - this.nextVersionCalculator = nextVersionCalculator ?? throw new ArgumentNullException(nameof(nextVersionCalculator)); - this.variableProvider = variableProvider ?? throw new ArgumentNullException(nameof(variableProvider)); - this.options = options ?? throw new ArgumentNullException(nameof(options)); - this.cacheKeyFactory = cacheKeyFactory ?? throw new ArgumentNullException(nameof(cacheKeyFactory)); - context = versionContext.Value; - } - - public VersionVariables CalculateVersionVariables() - { - var arguments = options.Value; - - var cacheKey = cacheKeyFactory.Create(arguments.OverrideConfig); - var versionVariables = arguments.NoCache ? default : gitVersionCache.LoadVersionVariablesFromDiskCache(cacheKey); - - if (versionVariables != null) return versionVariables; - - versionVariables = ExecuteInternal(); - - if (arguments.NoCache) return versionVariables; - try - { - gitVersionCache.WriteVariablesToDiskCache(cacheKey, versionVariables); - } - catch (AggregateException e) - { - log.Warning($"One or more exceptions during cache write:{System.Environment.NewLine}{e}"); - } - - return versionVariables; - } - - private VersionVariables ExecuteInternal() - { - var semanticVersion = nextVersionCalculator.FindVersion(); - return variableProvider.GetVariablesFor(semanticVersion, context.Configuration, context.IsCurrentCommitTagged); - } - } -} diff --git a/src/GitVersionCore/Core/GitVersionTool.cs b/src/GitVersionCore/Core/GitVersionTool.cs new file mode 100644 index 0000000000..b62313ca9d --- /dev/null +++ b/src/GitVersionCore/Core/GitVersionTool.cs @@ -0,0 +1,143 @@ +using System; +using System.Linq; +using GitVersion.Extensions; +using GitVersion.Extensions.GitVersionInformationResources; +using GitVersion.Extensions.VersionAssemblyInfoResources; +using GitVersion.Logging; +using GitVersion.Model; +using GitVersion.OutputVariables; +using GitVersion.VersionCalculation; +using GitVersion.VersionCalculation.Cache; +using Microsoft.Extensions.Options; + +namespace GitVersion +{ + public class GitVersionTool : IGitVersionTool + { + private readonly ILog log; + private readonly IGitVersionCache gitVersionCache; + private readonly INextVersionCalculator nextVersionCalculator; + private readonly IVariableProvider variableProvider; + private readonly IGitVersionCacheKeyFactory cacheKeyFactory; + private readonly IWixVersionFileUpdater wixVersionFileUpdater; + private readonly IGitVersionInformationGenerator gitVersionInformationGenerator; + private readonly IAssemblyInfoFileUpdater assemblyInfoFileUpdater; + + private readonly IOptions options; + private readonly GitVersionContext context; + + private readonly IBuildServer buildServer; + + public GitVersionTool(ILog log, INextVersionCalculator nextVersionCalculator, IVariableProvider variableProvider, + IGitVersionCache gitVersionCache, IGitVersionCacheKeyFactory cacheKeyFactory, IBuildServerResolver buildServerResolver, + IWixVersionFileUpdater wixVersionFileUpdater, IGitVersionInformationGenerator gitVersionInformationGenerator, IAssemblyInfoFileUpdater assemblyInfoFileUpdater, + IOptions options, IOptions versionContext) + { + this.log = log ?? throw new ArgumentNullException(nameof(log)); + + this.nextVersionCalculator = nextVersionCalculator ?? throw new ArgumentNullException(nameof(nextVersionCalculator)); + this.variableProvider = variableProvider ?? throw new ArgumentNullException(nameof(variableProvider)); + + this.cacheKeyFactory = cacheKeyFactory ?? throw new ArgumentNullException(nameof(cacheKeyFactory)); + this.gitVersionCache = gitVersionCache ?? throw new ArgumentNullException(nameof(gitVersionCache)); + + this.wixVersionFileUpdater = wixVersionFileUpdater ?? throw new ArgumentNullException(nameof(wixVersionFileUpdater)); + this.gitVersionInformationGenerator = gitVersionInformationGenerator ?? throw new ArgumentNullException(nameof(gitVersionInformationGenerator)); + this.assemblyInfoFileUpdater = assemblyInfoFileUpdater ?? throw new ArgumentNullException(nameof(gitVersionInformationGenerator)); + + this.options = options ?? throw new ArgumentNullException(nameof(options)); + + context = versionContext.Value; + buildServer = buildServerResolver.Resolve(); + } + + public VersionVariables CalculateVersionVariables() + { + var arguments = options.Value; + + var cacheKey = cacheKeyFactory.Create(arguments.OverrideConfig); + var versionVariables = arguments.NoCache ? default : gitVersionCache.LoadVersionVariablesFromDiskCache(cacheKey); + + if (versionVariables != null) return versionVariables; + + versionVariables = ExecuteInternal(); + + if (arguments.NoCache) return versionVariables; + try + { + gitVersionCache.WriteVariablesToDiskCache(cacheKey, versionVariables); + } + catch (AggregateException e) + { + log.Warning($"One or more exceptions during cache write:{System.Environment.NewLine}{e}"); + } + + return versionVariables; + } + + public void OutputVariables(VersionVariables variables, Action writter) + { + var arguments = options.Value; + if (arguments.Output.Contains(OutputType.BuildServer)) + { + buildServer?.WriteIntegration(writter, variables); + } + if (arguments.Output.Contains(OutputType.Json)) + { + switch (arguments.ShowVariable) + { + case null: + Console.WriteLine(variables.ToString()); + break; + + default: + if (!variables.TryGetValue(arguments.ShowVariable, out var part)) + { + throw new WarningException($"'{arguments.ShowVariable}' variable does not exist"); + } + + Console.WriteLine(part); + break; + } + } + } + + public void UpdateAssemblyInfo(VersionVariables variables) + { + var arguments = options.Value; + + if (arguments.UpdateAssemblyInfo) + { + using (assemblyInfoFileUpdater) + { + assemblyInfoFileUpdater.Update(variables, arguments.EnsureAssemblyInfo, arguments.TargetPath, arguments.UpdateAssemblyInfoFileName.ToArray()); + assemblyInfoFileUpdater.CommitChanges(); + } + } + } + + public void UpdateWixVersionFile(VersionVariables variables) + { + var arguments = options.Value; + + if (arguments.UpdateWixVersionFile) + { + using (wixVersionFileUpdater) + { + wixVersionFileUpdater.Update(variables, arguments.TargetPath); + } + } + } + + public void GenerateGitVersionInformation(VersionVariables variables, FileWriteInfo fileWriteInfo) + { + gitVersionInformationGenerator.Generate(variables, fileWriteInfo); + } + + private VersionVariables ExecuteInternal() + { + var semanticVersion = nextVersionCalculator.FindVersion(); + return variableProvider.GetVariablesFor(semanticVersion, context.Configuration, context.IsCurrentCommitTagged); + } + } +} diff --git a/src/GitVersionCore/Extensions/GitVersionInformationResources/GitVersionInformationGenerator.cs b/src/GitVersionCore/Extensions/GitVersionInformationResources/GitVersionInformationGenerator.cs index b01867eec0..2dcb0adc71 100644 --- a/src/GitVersionCore/Extensions/GitVersionInformationResources/GitVersionInformationGenerator.cs +++ b/src/GitVersionCore/Extensions/GitVersionInformationResources/GitVersionInformationGenerator.cs @@ -1,30 +1,25 @@ +using System; using System.IO; using System.Linq; using GitVersion.OutputVariables; namespace GitVersion.Extensions.GitVersionInformationResources { - public class GitVersionInformationGenerator + public class GitVersionInformationGenerator : IGitVersionInformationGenerator { - private readonly string fileName; - private readonly string directory; - private readonly VersionVariables variables; private readonly IFileSystem fileSystem; - private readonly TemplateManager templateManager; - public GitVersionInformationGenerator(string fileName, string directory, VersionVariables variables, IFileSystem fileSystem) + public GitVersionInformationGenerator(IFileSystem fileSystem) { - this.fileName = fileName; - this.directory = directory; - this.variables = variables; - this.fileSystem = fileSystem; - + this.fileSystem = fileSystem ?? throw new ArgumentNullException(nameof(fileSystem)); templateManager = new TemplateManager(TemplateType.GitVersionInformationResources); } - public void Generate() + public void Generate(VersionVariables variables, FileWriteInfo writeInfo) { + var fileName = writeInfo.FileName; + var directory = writeInfo.WorkingDirectory; var filePath = Path.Combine(directory, fileName); string originalFileContents = null; diff --git a/src/GitVersionCore/Extensions/GitVersionInformationResources/IGitVersionInformationGenerator.cs b/src/GitVersionCore/Extensions/GitVersionInformationResources/IGitVersionInformationGenerator.cs new file mode 100644 index 0000000000..cfb61a8d0d --- /dev/null +++ b/src/GitVersionCore/Extensions/GitVersionInformationResources/IGitVersionInformationGenerator.cs @@ -0,0 +1,9 @@ +using GitVersion.OutputVariables; + +namespace GitVersion.Extensions.GitVersionInformationResources +{ + public interface IGitVersionInformationGenerator + { + void Generate(VersionVariables variables, FileWriteInfo writeInfo); + } +} diff --git a/src/GitVersionCore/Extensions/IWixVersionFileUpdater.cs b/src/GitVersionCore/Extensions/IWixVersionFileUpdater.cs new file mode 100644 index 0000000000..a2ca1f0847 --- /dev/null +++ b/src/GitVersionCore/Extensions/IWixVersionFileUpdater.cs @@ -0,0 +1,10 @@ +using System; +using GitVersion.OutputVariables; + +namespace GitVersion.Extensions +{ + public interface IWixVersionFileUpdater : IDisposable + { + string Update(VersionVariables variables, string workingDirectory); + } +} diff --git a/src/GitVersionCore/Extensions/VersionAssemblyInfoResources/AssemblyInfoFileUpdater.cs b/src/GitVersionCore/Extensions/VersionAssemblyInfoResources/AssemblyInfoFileUpdater.cs index f9473b5e70..b8e03fa3e2 100644 --- a/src/GitVersionCore/Extensions/VersionAssemblyInfoResources/AssemblyInfoFileUpdater.cs +++ b/src/GitVersionCore/Extensions/VersionAssemblyInfoResources/AssemblyInfoFileUpdater.cs @@ -8,7 +8,7 @@ namespace GitVersion.Extensions.VersionAssemblyInfoResources { - public class AssemblyInfoFileUpdater : IDisposable + public class AssemblyInfoFileUpdater : IAssemblyInfoFileUpdater { private readonly List restoreBackupTasks = new List(); private readonly List cleanupBackupTasks = new List(); @@ -20,49 +20,38 @@ public class AssemblyInfoFileUpdater : IDisposable {".vb", new Regex( @"(\s*\\s*$(\r?\n)?)", RegexOptions.Multiline) }, }; + private readonly Regex assemblyVersionRegex = new Regex(@"AssemblyVersion(Attribute)?\s*\(.*\)\s*"); + private readonly Regex assemblyInfoVersionRegex = new Regex(@"AssemblyInformationalVersion(Attribute)?\s*\(.*\)\s*"); + private readonly Regex assemblyFileVersionRegex = new Regex(@"AssemblyFileVersion(Attribute)?\s*\(.*\)\s*"); + private const string NewLine = "\r\n"; - private readonly ISet assemblyInfoFileNames; - private readonly string workingDirectory; - private readonly VersionVariables variables; private readonly IFileSystem fileSystem; private readonly ILog log; - private readonly bool ensureAssemblyInfo; private readonly TemplateManager templateManager; - public AssemblyInfoFileUpdater(string assemblyInfoFileName, string workingDirectory, VersionVariables variables, IFileSystem fileSystem, ILog log, bool ensureAssemblyInfo) : - this(new HashSet { assemblyInfoFileName }, workingDirectory, variables, fileSystem, log, ensureAssemblyInfo) - { } - - public AssemblyInfoFileUpdater(ISet assemblyInfoFileNames, string workingDirectory, VersionVariables variables, IFileSystem fileSystem, ILog log, bool ensureAssemblyInfo) + public AssemblyInfoFileUpdater(ILog log, IFileSystem fileSystem) { - this.assemblyInfoFileNames = assemblyInfoFileNames; - this.workingDirectory = workingDirectory; - this.variables = variables; this.fileSystem = fileSystem; this.log = log; - this.ensureAssemblyInfo = ensureAssemblyInfo; - templateManager = new TemplateManager(TemplateType.VersionAssemblyInfoResources); } - public void Update() + public void Update(VersionVariables variables, bool ensureAssemblyInfo, string workingDirectory, params string[] assemblyInfo) { + var assemblyInfoFileNames = new HashSet(assemblyInfo); log.Info("Updating assembly info files"); - var assemblyInfoFiles = GetAssemblyInfoFiles(workingDirectory, assemblyInfoFileNames, fileSystem, ensureAssemblyInfo).ToList(); + var assemblyInfoFiles = GetAssemblyInfoFiles(workingDirectory, assemblyInfoFileNames, ensureAssemblyInfo).ToList(); log.Info($"Found {assemblyInfoFiles.Count} files"); var assemblyVersion = variables.AssemblySemVer; - var assemblyVersionRegex = new Regex(@"AssemblyVersion(Attribute)?\s*\(.*\)\s*"); var assemblyVersionString = !string.IsNullOrWhiteSpace(assemblyVersion) ? $"AssemblyVersion(\"{assemblyVersion}\")" : null; var assemblyInfoVersion = variables.InformationalVersion; - var assemblyInfoVersionRegex = new Regex(@"AssemblyInformationalVersion(Attribute)?\s*\(.*\)\s*"); - var assemblyInfoVersionString = $"AssemblyInformationalVersion(\"{assemblyInfoVersion}\")"; + var assemblyInfoVersionString = !string.IsNullOrWhiteSpace(assemblyInfoVersion) ? $"AssemblyInformationalVersion(\"{assemblyInfoVersion}\")" : null; var assemblyFileVersion = variables.AssemblySemFileVer; - var assemblyFileVersionRegex = new Regex(@"AssemblyFileVersion(Attribute)?\s*\(.*\)\s*"); var assemblyFileVersionString = !string.IsNullOrWhiteSpace(assemblyFileVersion) ? $"AssemblyFileVersion(\"{assemblyFileVersion}\")" : null; foreach (var assemblyInfoFile in assemblyInfoFiles) @@ -97,7 +86,10 @@ public void Update() fileContents = ReplaceOrInsertAfterLastAssemblyAttributeOrAppend(assemblyFileVersionRegex, fileContents, assemblyFileVersionString, assemblyInfoFile.Extension, ref appendedAttributes); } - fileContents = ReplaceOrInsertAfterLastAssemblyAttributeOrAppend(assemblyInfoVersionRegex, fileContents, assemblyInfoVersionString, assemblyInfoFile.Extension, ref appendedAttributes); + if (!string.IsNullOrWhiteSpace(assemblyInfoVersion)) + { + fileContents = ReplaceOrInsertAfterLastAssemblyAttributeOrAppend(assemblyInfoVersionRegex, fileContents, assemblyInfoVersionString, assemblyInfoFile.Extension, ref appendedAttributes); + } if (appendedAttributes) { @@ -112,6 +104,28 @@ public void Update() } } + public void Dispose() + { + foreach (var restoreBackup in restoreBackupTasks) + { + restoreBackup(); + } + + cleanupBackupTasks.Clear(); + restoreBackupTasks.Clear(); + } + + public void CommitChanges() + { + foreach (var cleanupBackupTask in cleanupBackupTasks) + { + cleanupBackupTask(); + } + + cleanupBackupTasks.Clear(); + restoreBackupTasks.Clear(); + } + private string ReplaceOrInsertAfterLastAssemblyAttributeOrAppend(Regex replaceRegex, string inputString, string replaceString, string fileExtension, ref bool appendedAttributes) { var assemblyAddFormat = templateManager.GetAddFormatFor(fileExtension); @@ -140,7 +154,7 @@ private string ReplaceOrInsertAfterLastAssemblyAttributeOrAppend(Regex replaceRe return inputString; } - private IEnumerable GetAssemblyInfoFiles(string workingDirectory, ISet assemblyInfoFileNames, IFileSystem fileSystem, bool ensureAssemblyInfo) + private IEnumerable GetAssemblyInfoFiles(string workingDirectory, ISet assemblyInfoFileNames, bool ensureAssemblyInfo) { if (assemblyInfoFileNames != null && assemblyInfoFileNames.Any(x => !string.IsNullOrWhiteSpace(x))) { @@ -148,7 +162,7 @@ private IEnumerable GetAssemblyInfoFiles(string workingDirectory, ISet { var fullPath = Path.Combine(workingDirectory, item); - if (EnsureVersionAssemblyInfoFile(ensureAssemblyInfo, fileSystem, fullPath)) + if (EnsureVersionAssemblyInfoFile(fullPath, ensureAssemblyInfo)) { yield return new FileInfo(fullPath); } @@ -168,8 +182,9 @@ private IEnumerable GetAssemblyInfoFiles(string workingDirectory, ISet } } - private bool EnsureVersionAssemblyInfoFile(bool ensureAssemblyInfo, IFileSystem fileSystem, string fullPath) + private bool EnsureVersionAssemblyInfoFile(string fullPath, bool ensureAssemblyInfo) { + fullPath = fullPath ?? throw new ArgumentNullException(nameof(fullPath)); if (fileSystem.Exists(fullPath)) { return true; @@ -198,27 +213,5 @@ private bool EnsureVersionAssemblyInfoFile(bool ensureAssemblyInfo, IFileSystem log.Warning($"No version assembly info template available to create source file '{fullPath}'"); return false; } - - public void Dispose() - { - foreach (var restoreBackup in restoreBackupTasks) - { - restoreBackup(); - } - - cleanupBackupTasks.Clear(); - restoreBackupTasks.Clear(); - } - - public void CommitChanges() - { - foreach (var cleanupBackupTask in cleanupBackupTasks) - { - cleanupBackupTask(); - } - - cleanupBackupTasks.Clear(); - restoreBackupTasks.Clear(); - } } } diff --git a/src/GitVersionCore/Extensions/VersionAssemblyInfoResources/IAssemblyInfoFileUpdater.cs b/src/GitVersionCore/Extensions/VersionAssemblyInfoResources/IAssemblyInfoFileUpdater.cs new file mode 100644 index 0000000000..e9fa41c4ad --- /dev/null +++ b/src/GitVersionCore/Extensions/VersionAssemblyInfoResources/IAssemblyInfoFileUpdater.cs @@ -0,0 +1,11 @@ +using System; +using GitVersion.OutputVariables; + +namespace GitVersion.Extensions.VersionAssemblyInfoResources +{ + public interface IAssemblyInfoFileUpdater : IDisposable + { + void Update(VersionVariables variables, bool ensureAssemblyInfo, string workingDirectory, params string[] assemblyInfo); + void CommitChanges(); + } +} diff --git a/src/GitVersionCore/Extensions/WixVersionFileUpdater.cs b/src/GitVersionCore/Extensions/WixVersionFileUpdater.cs index b1bbb38beb..a3a1325e0a 100644 --- a/src/GitVersionCore/Extensions/WixVersionFileUpdater.cs +++ b/src/GitVersionCore/Extensions/WixVersionFileUpdater.cs @@ -7,38 +7,38 @@ namespace GitVersion.Extensions { - public class WixVersionFileUpdater : IDisposable + public class WixVersionFileUpdater : IWixVersionFileUpdater { - private readonly VersionVariables variables; private readonly IFileSystem fileSystem; private readonly ILog log; - public string WixVersionFile { get; } + private string wixVersionFile; public const string WixVersionFileName = "GitVersion_WixVersion.wxi"; - public WixVersionFileUpdater(string workingDirectory, VersionVariables variables, IFileSystem fileSystem, ILog log) + public WixVersionFileUpdater(IFileSystem fileSystem, ILog log) { - this.variables = variables; this.fileSystem = fileSystem ?? throw new ArgumentNullException(nameof(fileSystem)); this.log = log ?? throw new ArgumentNullException(nameof(log)); - WixVersionFile = Path.Combine(workingDirectory, WixVersionFileName); } - public void Update() + public string Update(VersionVariables variables, string workingDirectory) { + wixVersionFile = Path.Combine(workingDirectory, WixVersionFileName); log.Info("Updating GitVersion_WixVersion.wxi"); var doc = new XmlDocument(); - doc.LoadXml(GetWixFormatFromVersionVariables()); + doc.LoadXml(GetWixFormatFromVersionVariables(variables)); var xmlDecl = doc.CreateXmlDeclaration("1.0", "utf-8", null); var root = doc.DocumentElement; doc.InsertBefore(xmlDecl, root); - using var fs = fileSystem.OpenWrite(WixVersionFile); + using var fs = fileSystem.OpenWrite(wixVersionFile); doc.Save(fs); + + return wixVersionFile; } - private string GetWixFormatFromVersionVariables() + private static string GetWixFormatFromVersionVariables(VersionVariables variables) { var builder = new StringBuilder(); builder.Append("\n"); @@ -54,7 +54,7 @@ private string GetWixFormatFromVersionVariables() public void Dispose() { - log.Info($"Done writing {WixVersionFile}"); + log.Info($"Done writing {wixVersionFile}"); } } } diff --git a/src/GitVersionCore/GitVersionCoreModule.cs b/src/GitVersionCore/GitVersionCoreModule.cs index 5f7b19884d..72e2054c90 100644 --- a/src/GitVersionCore/GitVersionCoreModule.cs +++ b/src/GitVersionCore/GitVersionCoreModule.cs @@ -3,6 +3,8 @@ using GitVersion.Configuration; using GitVersion.Configuration.Init; using GitVersion.Extensions; +using GitVersion.Extensions.GitVersionInformationResources; +using GitVersion.Extensions.VersionAssemblyInfoResources; using GitVersion.Logging; using GitVersion.VersionCalculation; using GitVersion.VersionCalculation.Cache; @@ -34,13 +36,17 @@ public void RegisterTypes(IServiceCollection services) services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); - services.AddSingleton(); + services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); + services.AddSingleton(); + services.AddSingleton(); + services.AddSingleton(); + services.AddSingleton(sp => sp.GetService().Create()); services.AddSingleton(sp => diff --git a/src/GitVersionCore/Model/FileWriteInfo.cs b/src/GitVersionCore/Model/FileWriteInfo.cs new file mode 100644 index 0000000000..1dfac67a1e --- /dev/null +++ b/src/GitVersionCore/Model/FileWriteInfo.cs @@ -0,0 +1,16 @@ +namespace GitVersion +{ + public sealed class FileWriteInfo + { + public FileWriteInfo(string workingDirectory, string fileName, string fileExtension) + { + WorkingDirectory = workingDirectory; + FileName = fileName; + FileExtension = fileExtension; + } + + public string WorkingDirectory { get; } + public string FileName { get; } + public string FileExtension { get; } + } +} diff --git a/src/GitVersionExe.Tests/ArgumentParserTests.cs b/src/GitVersionExe.Tests/ArgumentParserTests.cs index caf76c50ee..77e10055fe 100644 --- a/src/GitVersionExe.Tests/ArgumentParserTests.cs +++ b/src/GitVersionExe.Tests/ArgumentParserTests.cs @@ -2,6 +2,7 @@ using GitVersion.Logging; using GitVersion.Model; using GitVersionCore.Tests.Helpers; +using Microsoft.Extensions.DependencyInjection; using NUnit.Framework; using Shouldly; using Environment = System.Environment; @@ -9,14 +10,18 @@ namespace GitVersionExe.Tests { [TestFixture] - public class ArgumentParserTests + public class ArgumentParserTests : TestBase { private IArgumentParser argumentParser; [SetUp] public void SetUp() { - argumentParser = new ArgumentParser(new TestEnvironment()); + var sp = ConfigureServices(services => + { + services.AddSingleton(); + }); + argumentParser = sp.GetService(); } [Test] diff --git a/src/GitVersionExe.Tests/ExecutionResults.cs b/src/GitVersionExe.Tests/ExecutionResults.cs index 7125717d42..065efddd85 100644 --- a/src/GitVersionExe.Tests/ExecutionResults.cs +++ b/src/GitVersionExe.Tests/ExecutionResults.cs @@ -14,16 +14,17 @@ public ExecutionResults(int exitCode, string output, string logContents) Log = logContents; } - public int ExitCode { get; private set; } - public string Output { get; private set; } - public string Log { get; private set; } + public int ExitCode { get; } + public string Output { get; } + public string Log { get; } public virtual VersionVariables OutputVariables { get { var jsonStartIndex = Output.IndexOf("{", StringComparison.Ordinal); - var json = Output.Substring(jsonStartIndex); + var jsonEndIndex = Output.IndexOf("}", StringComparison.Ordinal); + var json = Output.Substring(jsonStartIndex, jsonEndIndex - jsonStartIndex + 1); var outputVariables = JsonConvert.DeserializeObject>(json); return VersionVariables.FromDictionary(outputVariables); diff --git a/src/GitVersionExe.Tests/GitVersionExe.Tests.csproj b/src/GitVersionExe.Tests/GitVersionExe.Tests.csproj index 40022ed95a..d20ab2b07e 100644 --- a/src/GitVersionExe.Tests/GitVersionExe.Tests.csproj +++ b/src/GitVersionExe.Tests/GitVersionExe.Tests.csproj @@ -10,6 +10,7 @@ + diff --git a/src/GitVersionExe/ArgumentParser.cs b/src/GitVersionExe/ArgumentParser.cs index 2708befa2a..4171d72380 100644 --- a/src/GitVersionExe/ArgumentParser.cs +++ b/src/GitVersionExe/ArgumentParser.cs @@ -14,10 +14,12 @@ namespace GitVersion public class ArgumentParser : IArgumentParser { private readonly IEnvironment environment; + private readonly IBuildServerResolver buildServerResolver; - public ArgumentParser(IEnvironment environment) + public ArgumentParser(IEnvironment environment, IBuildServerResolver buildServerResolver) { this.environment = environment ?? throw new ArgumentNullException(nameof(environment)); + this.buildServerResolver = buildServerResolver ?? throw new ArgumentNullException(nameof(buildServerResolver)); } public Arguments ParseArguments(string commandLineArguments) @@ -158,7 +160,6 @@ public Arguments ParseArguments(string[] commandLineArguments) continue; } - if (name.IsSwitch("execargs")) { EnsureArgumentValueCount(values); @@ -186,7 +187,6 @@ public Arguments ParseArguments(string[] commandLineArguments) continue; } - if (name.IsSwitch("diag")) { if (value == null || value.IsTrue()) @@ -305,18 +305,11 @@ public Arguments ParseArguments(string[] commandLineArguments) if (name.IsSwitch("ensureassemblyinfo")) { - if (value.IsTrue()) - { - arguments.EnsureAssemblyInfo = true; - } - else if (value.IsFalse()) + arguments.EnsureAssemblyInfo = true; + if (value.IsFalse()) { arguments.EnsureAssemblyInfo = false; } - else - { - arguments.EnsureAssemblyInfo = true; - } if (arguments.UpdateAssemblyInfoFileName.Count > 1 && arguments.EnsureAssemblyInfo) { @@ -428,6 +421,9 @@ public Arguments ParseArguments(string[] commandLineArguments) : firstArgument; } + var buildServer = buildServerResolver.Resolve(); + arguments.NoFetch = arguments.NoFetch || buildServer != null && buildServer.PreventFetch(); + return arguments; } diff --git a/src/GitVersionExe/ExecCommand.cs b/src/GitVersionExe/ExecCommand.cs index bf41f74603..2d64b8c45c 100644 --- a/src/GitVersionExe/ExecCommand.cs +++ b/src/GitVersionExe/ExecCommand.cs @@ -1,12 +1,8 @@ using System; using System.Collections.Generic; using System.Linq; -using System.Runtime.InteropServices; -using GitVersion.Extensions; -using GitVersion.Extensions.VersionAssemblyInfoResources; using GitVersion.Helpers; using GitVersion.Logging; -using GitVersion.Model; using GitVersion.OutputVariables; using Microsoft.Extensions.Options; @@ -14,64 +10,19 @@ namespace GitVersion { public class ExecCommand : IExecCommand { - private static readonly bool RunningOnUnix = !RuntimeInformation.IsOSPlatform(OSPlatform.Windows); - - private readonly IFileSystem fileSystem; - private readonly IBuildServerResolver buildServerResolver; private readonly ILog log; private readonly IOptions options; - public ExecCommand(IFileSystem fileSystem, IBuildServerResolver buildServerResolver, ILog log, IOptions options) + public ExecCommand(ILog log, IOptions options) { - this.fileSystem = fileSystem ?? throw new ArgumentNullException(nameof(fileSystem)); - this.buildServerResolver = buildServerResolver ?? throw new ArgumentNullException(nameof(buildServerResolver)); this.log = log ?? throw new ArgumentNullException(nameof(log)); this.options = options ?? throw new ArgumentNullException(nameof(options)); } public void Execute(VersionVariables variables) { - log.Info($"Running on {(RunningOnUnix ? "Unix" : "Windows")}."); - var arguments = options.Value; - if (arguments.Output.Contains(OutputType.BuildServer)) - { - var buildServer = buildServerResolver.Resolve(); - buildServer?.WriteIntegration(Console.WriteLine, variables); - } - if (arguments.Output.Contains(OutputType.Json)) - { - switch (arguments.ShowVariable) - { - case null: - Console.WriteLine(variables.ToString()); - break; - - default: - if (!variables.TryGetValue(arguments.ShowVariable, out var part)) - { - throw new WarningException($"'{arguments.ShowVariable}' variable does not exist"); - } - - Console.WriteLine(part); - break; - } - } - - if (arguments.UpdateWixVersionFile) - { - using var wixVersionFileUpdater = new WixVersionFileUpdater(arguments.TargetPath, variables, fileSystem, log); - wixVersionFileUpdater.Update(); - } - - using var assemblyInfoUpdater = new AssemblyInfoFileUpdater(arguments.UpdateAssemblyInfoFileName, arguments.TargetPath, variables, fileSystem, log, arguments.EnsureAssemblyInfo); - if (arguments.UpdateAssemblyInfo) - { - assemblyInfoUpdater.Update(); - assemblyInfoUpdater.CommitChanges(); - } - RunExecCommandIfNeeded(arguments, arguments.TargetPath, variables, log); RunMsBuildIfNeeded(arguments, arguments.TargetPath, variables, log); } diff --git a/src/GitVersionExe/GitVersionExecutor.cs b/src/GitVersionExe/GitVersionExecutor.cs index ffbe249d80..c06b5ac9e8 100644 --- a/src/GitVersionExe/GitVersionExecutor.cs +++ b/src/GitVersionExe/GitVersionExecutor.cs @@ -15,29 +15,30 @@ public class GitVersionExecutor : IGitVersionExecutor private readonly IHelpWriter helpWriter; private readonly IExecCommand execCommand; private readonly IConfigProvider configProvider; - private readonly IBuildServerResolver buildServerResolver; - private readonly IGitVersionCalculator gitVersionCalculator; + private readonly IGitVersionTool gitVersionTool; private readonly IVersionWriter versionWriter; - public GitVersionExecutor(ILog log, IConfigFileLocator configFileLocator, IConfigProvider configProvider, - IBuildServerResolver buildServerResolver, IGitVersionCalculator gitVersionCalculator, + public GitVersionExecutor(ILog log, IConfigFileLocator configFileLocator, IConfigProvider configProvider, IGitVersionTool gitVersionTool, IVersionWriter versionWriter, IHelpWriter helpWriter, IExecCommand execCommand) { this.log = log ?? throw new ArgumentNullException(nameof(log)); this.configFileLocator = configFileLocator ?? throw new ArgumentNullException(nameof(configFileLocator)); this.configProvider = configProvider ?? throw new ArgumentNullException(nameof(configFileLocator)); - this.buildServerResolver = buildServerResolver ?? throw new ArgumentNullException(nameof(buildServerResolver)); - this.gitVersionCalculator = gitVersionCalculator ?? throw new ArgumentNullException(nameof(gitVersionCalculator)); + this.gitVersionTool = gitVersionTool ?? throw new ArgumentNullException(nameof(gitVersionTool)); this.versionWriter = versionWriter ?? throw new ArgumentNullException(nameof(versionWriter)); this.helpWriter = helpWriter ?? throw new ArgumentNullException(nameof(helpWriter)); + this.execCommand = execCommand ?? throw new ArgumentNullException(nameof(execCommand)); } public int Execute(Arguments arguments) { - var exitCode = VerifyArgumentsAndRun(arguments); + if (!HandleNonMainCommand(arguments, out var exitCode)) + { + exitCode = RunGitVersionTool(arguments); + } if (exitCode != 0) { @@ -48,13 +49,16 @@ public int Execute(Arguments arguments) return exitCode; } - private int VerifyArgumentsAndRun(Arguments arguments) + private int RunGitVersionTool(Arguments arguments) { try { - if (HandleNonMainCommand(arguments, out var exitCode)) return exitCode; + var variables = gitVersionTool.CalculateVersionVariables(); + + gitVersionTool.OutputVariables(variables, Console.WriteLine); + gitVersionTool.UpdateAssemblyInfo(variables); + gitVersionTool.UpdateWixVersionFile(variables); - var variables = gitVersionCalculator.CalculateVersionVariables(); execCommand.Execute(variables); } catch (WarningException exception) @@ -126,9 +130,6 @@ private bool HandleNonMainCommand(Arguments arguments, out int exitCode) arguments.Output.Add(OutputType.BuildServer); } - var buildServer = buildServerResolver.Resolve(); - arguments.NoFetch = arguments.NoFetch || buildServer != null && buildServer.PreventFetch(); - ConfigureLogging(arguments, log); if (arguments.Diag) diff --git a/src/GitVersionTask.Tests/GitVersionTaskDirectoryTests.cs b/src/GitVersionTask.Tests/GitVersionTaskDirectoryTests.cs index 78a4610745..24ee062c5f 100644 --- a/src/GitVersionTask.Tests/GitVersionTaskDirectoryTests.cs +++ b/src/GitVersionTask.Tests/GitVersionTaskDirectoryTests.cs @@ -41,7 +41,7 @@ public void FindsGitDirectory() services.AddSingleton(options); }); - var gitVersionCalculator = sp.GetService(); + var gitVersionCalculator = sp.GetService(); gitVersionCalculator.CalculateVersionVariables(); } @@ -69,7 +69,7 @@ public void FindsGitDirectoryInParent() services.AddSingleton(options); }); - var gitVersionCalculator = sp.GetService(); + var gitVersionCalculator = sp.GetService(); gitVersionCalculator.CalculateVersionVariables(); } diff --git a/src/GitVersionTask/FileHelper.cs b/src/GitVersionTask/FileHelper.cs index a68db3ab10..7c6f1dcac8 100644 --- a/src/GitVersionTask/FileHelper.cs +++ b/src/GitVersionTask/FileHelper.cs @@ -7,20 +7,6 @@ namespace GitVersion.MSBuildTask { - public sealed class FileWriteInfo - { - public FileWriteInfo(string workingDirectory, string fileName, string fileExtension) - { - WorkingDirectory = workingDirectory; - FileName = fileName; - FileExtension = fileExtension; - } - - public string WorkingDirectory { get; } - public string FileName { get; } - public string FileExtension { get; } - } - public static class FileHelper { private static readonly Dictionary> VersionAttributeFinders = new Dictionary> diff --git a/src/GitVersionTask/GitVersionTaskExecutor.cs b/src/GitVersionTask/GitVersionTaskExecutor.cs index 79deb97ea6..500955f479 100644 --- a/src/GitVersionTask/GitVersionTaskExecutor.cs +++ b/src/GitVersionTask/GitVersionTaskExecutor.cs @@ -1,26 +1,22 @@ using System; using System.IO; -using GitVersion.Extensions.GitVersionInformationResources; -using GitVersion.Extensions.VersionAssemblyInfoResources; -using GitVersion.Logging; using GitVersion.MSBuildTask.Tasks; using GitVersion.OutputVariables; +using Microsoft.Extensions.Options; namespace GitVersion.MSBuildTask { public class GitVersionTaskExecutor : IGitVersionTaskExecutor { - private readonly IFileSystem fileSystem; - private readonly ILog log; - private readonly IBuildServerResolver buildServerResolver; + private readonly IGitVersionTool gitVersionTool; + private readonly IOptions options; private VersionVariables versionVariables; - public GitVersionTaskExecutor(IFileSystem fileSystem, ILog log, IBuildServerResolver buildServerResolver, IGitVersionCalculator gitVersionCalculator) + public GitVersionTaskExecutor(IGitVersionTool gitVersionTool, IOptions options) { - this.fileSystem = fileSystem ?? throw new ArgumentNullException(nameof(fileSystem)); - this.log = log ?? throw new ArgumentNullException(nameof(log)); - this.buildServerResolver = buildServerResolver ?? throw new ArgumentNullException(nameof(buildServerResolver)); - versionVariables = gitVersionCalculator.CalculateVersionVariables(); + this.gitVersionTool = gitVersionTool ?? throw new ArgumentNullException(nameof(gitVersionTool)); + this.options = options ?? throw new ArgumentNullException(nameof(options)); + versionVariables = gitVersionTool.CalculateVersionVariables(); } public void GetVersion(GetVersion task) @@ -41,34 +37,25 @@ public void UpdateAssemblyInfo(UpdateAssemblyInfo task) task.AssemblyInfoTempFilePath = Path.Combine(fileWriteInfo.WorkingDirectory, fileWriteInfo.FileName); - using var assemblyInfoFileUpdater = new AssemblyInfoFileUpdater(fileWriteInfo.FileName, fileWriteInfo.WorkingDirectory, versionVariables, fileSystem, log, true); - assemblyInfoFileUpdater.Update(); - assemblyInfoFileUpdater.CommitChanges(); + var arguments = options.Value; + arguments.UpdateAssemblyInfo = true; + arguments.EnsureAssemblyInfo = true; + arguments.TargetPath = fileWriteInfo.WorkingDirectory; + arguments.AddAssemblyInfoFileName(fileWriteInfo.FileName); + gitVersionTool.UpdateAssemblyInfo(versionVariables); } public void GenerateGitVersionInformation(GenerateGitVersionInformation task) { var fileWriteInfo = task.IntermediateOutputPath.GetFileWriteInfo(task.Language, task.ProjectFile, "GitVersionInformation"); - task.GitVersionInformationFilePath = Path.Combine(fileWriteInfo.WorkingDirectory, fileWriteInfo.FileName); - var generator = new GitVersionInformationGenerator(fileWriteInfo.FileName, fileWriteInfo.WorkingDirectory, versionVariables, fileSystem); - generator.Generate(); + + gitVersionTool.GenerateGitVersionInformation(versionVariables, fileWriteInfo); } public void WriteVersionInfoToBuildLog(WriteVersionInfoToBuildLog task) { - var logger = task.Log; - - var buildServer = buildServerResolver.Resolve(); - if (buildServer == null) return; - - logger.LogMessage($"Executing GenerateSetVersionMessage for '{buildServer.GetType().Name}'."); - logger.LogMessage(buildServer.GenerateSetVersionMessage(versionVariables)); - logger.LogMessage($"Executing GenerateBuildLogOutput for '{buildServer.GetType().Name}'."); - foreach (var buildParameter in buildServer.GenerateBuildLogOutput(versionVariables)) - { - logger.LogMessage(buildParameter); - } + gitVersionTool.OutputVariables(versionVariables, m => task.Log.LogMessage(m)); } } } diff --git a/src/GitVersionTask/GitVersionTasks.cs b/src/GitVersionTask/GitVersionTasks.cs index 7243e36901..3a9be6c382 100644 --- a/src/GitVersionTask/GitVersionTasks.cs +++ b/src/GitVersionTask/GitVersionTasks.cs @@ -65,7 +65,7 @@ private static IServiceProvider BuildServiceProvider(GitVersionTaskBase task) NoNormalize = task.NoNormalize }; - services.AddSingleton(_ => Options.Create(arguments)); + services.AddSingleton(Options.Create(arguments)); services.AddSingleton(); services.AddModule(new GitVersionCoreModule());