diff --git a/src/Cake.Common.Tests/Unit/Tools/GitVersion/GitVersionRunnerTests.cs b/src/Cake.Common.Tests/Unit/Tools/GitVersion/GitVersionRunnerTests.cs index a2e9f7acb0..e56a10bab6 100644 --- a/src/Cake.Common.Tests/Unit/Tools/GitVersion/GitVersionRunnerTests.cs +++ b/src/Cake.Common.Tests/Unit/Tools/GitVersion/GitVersionRunnerTests.cs @@ -86,18 +86,35 @@ public void Should_Set_Working_Directory() Assert.Equal("/Working", result.Process.WorkingDirectory.FullPath); } + [Theory] + [InlineData(GitVersionOutput.Json, "-output json")] + [InlineData(GitVersionOutput.File, "-output file")] + public void Should_Add_OutputType_To_Arguments_If_Set(GitVersionOutput outputType, string args) + { + // Given + var fixture = new GitVersionRunnerFixture(); + fixture.Settings.OutputType = outputType; + + // When + var result = fixture.Run(); + + // Then + Assert.Equal(args, result.Args); + } + [Fact] - public void Should_Add_OutputType_To_Arguments_If_Set() + public void Should_Add_OutputFile_If_Set_With_OutputType_File() { // Given var fixture = new GitVersionRunnerFixture(); - fixture.Settings.OutputType = GitVersionOutput.Json; + fixture.Settings.OutputType = GitVersionOutput.File; + fixture.Settings.OutputFile = "GitVersion.json"; // When var result = fixture.Run(); // Then - Assert.Equal("-output json", result.Args); + Assert.Equal("-output file -outputfile \"GitVersion.json\"", result.Args); } [Fact] @@ -158,6 +175,20 @@ public void Should_Add_UpdateAssemblyInfoFilePath_To_Arguments_If_Set() Assert.Equal("-updateassemblyinfo \"c:/temp/assemblyinfo.cs\"", result.Args); } + [Fact] + public void Should_Add_ConfigFile_To_Arguments_If_Set() + { + // Given + var fixture = new GitVersionRunnerFixture(); + fixture.Settings.ConfigFile = "c:/temp/gitversion.yml"; + + // When + var result = fixture.Run(); + + // Then + Assert.Equal("-config \"c:/temp/gitversion.yml\"", result.Args); + } + [Fact] public void Should_Add_RepositoryPath_To_Arguments_If_Set() { @@ -219,6 +250,102 @@ public void Should_Add_NoFetch_To_Arguments_If_Set(bool nofetch, string args) Assert.Equal(args, result.Args); } + [Theory] + [InlineData(true, "-nocache")] + [InlineData(false, "")] + public void Should_Add_NoCache_To_Arguments_If_Set(bool nocache, string args) + { + // Given + var fixture = new GitVersionRunnerFixture(); + fixture.Settings.NoCache = nocache; + + // When + var result = fixture.Run(); + + // Then + Assert.Equal(args, result.Args); + } + + [Theory] + [InlineData(true, "-nonormalize")] + [InlineData(false, "")] + public void Should_Add_NoNormalize_To_Arguments_If_Set(bool nonormalize, string args) + { + // Given + var fixture = new GitVersionRunnerFixture(); + fixture.Settings.NoNormalize = nonormalize; + + // When + var result = fixture.Run(); + + // Then + Assert.Equal(args, result.Args); + } + + [Theory] + [InlineData(true, "-diag")] + [InlineData(false, "")] + public void Should_Add_Diag_To_Arguments_If_Set(bool diag, string args) + { + // Given + var fixture = new GitVersionRunnerFixture(); + fixture.Settings.Diag = diag; + + // When + var result = fixture.Run(); + + // Then + Assert.Equal(args, result.Args); + } + + [Theory] + [InlineData(true, "-updateprojectfiles")] + [InlineData(false, "")] + public void Should_Add_UpdateProjectFiles_To_Arguments_If_Set(bool updateProjectFiles, string args) + { + // Given + var fixture = new GitVersionRunnerFixture(); + fixture.Settings.UpdateProjectFiles = updateProjectFiles; + + // When + var result = fixture.Run(); + + // Then + Assert.Equal(args, result.Args); + } + + [Theory] + [InlineData(true, "-ensureassemblyinfo")] + [InlineData(false, "")] + public void Should_Add_EnsureAssemblyInfo_To_Arguments_If_Set(bool ensureAssemblyInfo, string args) + { + // Given + var fixture = new GitVersionRunnerFixture(); + fixture.Settings.EnsureAssemblyInfo = ensureAssemblyInfo; + + // When + var result = fixture.Run(); + + // Then + Assert.Equal(args, result.Args); + } + + [Theory] + [InlineData(true, "-updatewixversionfile")] + [InlineData(false, "")] + public void Should_Add_UpdateWixVersionFile_To_Arguments_If_Set(bool updateWixVersionFile, string args) + { + // Given + var fixture = new GitVersionRunnerFixture(); + fixture.Settings.UpdateWixVersionFile = updateWixVersionFile; + + // When + var result = fixture.Run(); + + // Then + Assert.Equal(args, result.Args); + } + [Theory] [InlineData(Verbosity.Quiet)] [InlineData(Verbosity.Minimal)] @@ -270,7 +397,9 @@ public void Should_Tolerate_Bad_Json_Set() PreReleaseTag = "PreReleaseTag", PreReleaseTagWithDash = "PreReleaseTagWithDash", PreReleaseLabel = "PreReleaseLabel", + PreReleaseLabelWithDash = "-PreReleaseLabel", PreReleaseNumber = null, + WeightedPreReleaseNumber = null, BuildMetaData = "BuildMetaData", BuildMetaDataPadded = "BuildMetaDataPadded", FullBuildMetaData = "Branch.master.Sha.f2467748c78b3c8b37972ad0b30df2e15dfbf2cb", @@ -283,12 +412,17 @@ public void Should_Tolerate_Bad_Json_Set() FullSemVer = "0.1.1", InformationalVersion = "0.1.1+Branch.master.Sha.f2467748c78b3c8b37972ad0b30df2e15dfbf2cb", BranchName = "master", + EscapedBranchName = "master", Sha = "f2467748c78b3c8b37972ad0b30df2e15dfbf2cb", ShortSha = "f2467748", NuGetVersionV2 = "0.1.1", NuGetVersion = "0.1.1", + NuGetPreReleaseTagV2 = "tag", + NuGetPreReleaseTag = "tag", + VersionSourceSha = "f2467748c78b3c8b37972ad0b30df2e15dfbf2cb", CommitsSinceVersionSource = null, CommitsSinceVersionSourcePadded = "0002", + UncommittedChanges = 0, CommitDate = "2017-09-13", } ; @@ -302,7 +436,9 @@ public void Should_Tolerate_Bad_Json_Set() " \"PreReleaseTag\":\"PreReleaseTag\",", " \"PreReleaseTagWithDash\":\"PreReleaseTagWithDash\",", " \"PreReleaseLabel\":\"PreReleaseLabel\",", + " \"PreReleaseLabelWithDash\":\"-PreReleaseLabel\",", " \"PreReleaseNumber\":\"\",", + " \"WeightedPreReleaseNumber\":\"\",", " \"BuildMetaData\":\"BuildMetaData\",", " \"BuildMetaDataPadded\":\"BuildMetaDataPadded\",", " \"FullBuildMetaData\":\"Branch.master.Sha.f2467748c78b3c8b37972ad0b30df2e15dfbf2cb\",", @@ -315,12 +451,17 @@ public void Should_Tolerate_Bad_Json_Set() " \"FullSemVer\":\"0.1.1\",", " \"InformationalVersion\":\"0.1.1+Branch.master.Sha.f2467748c78b3c8b37972ad0b30df2e15dfbf2cb\",", " \"BranchName\":\"master\",", + " \"EscapedBranchName\":\"master\",", " \"Sha\":\"f2467748c78b3c8b37972ad0b30df2e15dfbf2cb\",", " \"ShortSha\":\"f2467748\",", " \"NuGetVersionV2\":\"0.1.1\",", " \"NuGetVersion\":\"0.1.1\",", + " \"NuGetPreReleaseTagV2\":\"tag\",", + " \"NuGetPreReleaseTag\":\"tag\",", + " \"VersionSourceSha\":\"f2467748c78b3c8b37972ad0b30df2e15dfbf2cb\",", " \"CommitsSinceVersionSource\":\"\",", " \"CommitsSinceVersionSourcePadded\":\"0002\",", + " \"UncommittedChanges\":\"0\",", " \"CommitDate\":\"2017-09-13\"", "}" }); @@ -336,7 +477,9 @@ public void Should_Tolerate_Bad_Json_Set() Assert.Equal(expect.PreReleaseTag, result.PreReleaseTag); Assert.Equal(expect.PreReleaseTagWithDash, result.PreReleaseTagWithDash); Assert.Equal(expect.PreReleaseLabel, result.PreReleaseLabel); + Assert.Equal(expect.PreReleaseLabelWithDash, result.PreReleaseLabelWithDash); Assert.Equal(expect.PreReleaseNumber, result.PreReleaseNumber); + Assert.Equal(expect.WeightedPreReleaseNumber, result.WeightedPreReleaseNumber); Assert.Equal(expect.BuildMetaData, result.BuildMetaData); Assert.Equal(expect.BuildMetaDataPadded, result.BuildMetaDataPadded); Assert.Equal(expect.FullBuildMetaData, result.FullBuildMetaData); @@ -349,12 +492,17 @@ public void Should_Tolerate_Bad_Json_Set() Assert.Equal(expect.FullSemVer, result.FullSemVer); Assert.Equal(expect.InformationalVersion, result.InformationalVersion); Assert.Equal(expect.BranchName, result.BranchName); + Assert.Equal(expect.EscapedBranchName, result.EscapedBranchName); Assert.Equal(expect.Sha, result.Sha); Assert.Equal(expect.ShortSha, result.ShortSha); Assert.Equal(expect.NuGetVersionV2, result.NuGetVersionV2); Assert.Equal(expect.NuGetVersion, result.NuGetVersion); + Assert.Equal(expect.NuGetPreReleaseTagV2, result.NuGetPreReleaseTagV2); + Assert.Equal(expect.NuGetPreReleaseTag, result.NuGetPreReleaseTag); + Assert.Equal(expect.VersionSourceSha, result.VersionSourceSha); Assert.Equal(expect.CommitsSinceVersionSource, result.CommitsSinceVersionSource); Assert.Equal(expect.CommitsSinceVersionSourcePadded, result.CommitsSinceVersionSourcePadded); + Assert.Equal(expect.UncommittedChanges, result.UncommittedChanges); Assert.Equal(expect.CommitDate, result.CommitDate); } diff --git a/src/Cake.Common/Tools/GitVersion/GitVersion.cs b/src/Cake.Common/Tools/GitVersion/GitVersion.cs index 0361694e63..f52472acbf 100644 --- a/src/Cake.Common/Tools/GitVersion/GitVersion.cs +++ b/src/Cake.Common/Tools/GitVersion/GitVersion.cs @@ -39,11 +39,21 @@ public sealed class GitVersion /// public string PreReleaseLabel { get; set; } + /// + /// Gets or sets the pre-release label with dash. + /// + public string PreReleaseLabelWithDash { get; set; } + /// /// Gets or sets the pre-release number. /// public int? PreReleaseNumber { get; set; } + /// + /// Gets or sets the weighted pre-release number. + /// + public int? WeightedPreReleaseNumber { get; set; } + /// /// Gets or sets the build metadata. /// @@ -104,6 +114,11 @@ public sealed class GitVersion /// public string BranchName { get; set; } + /// + /// Gets or sets the escaped branch name. + /// + public string EscapedBranchName { get; set; } + /// /// Gets or sets the Git SHA. /// @@ -124,6 +139,21 @@ public sealed class GitVersion /// public string NuGetVersion { get; set; } + /// + /// Gets or sets the NuGet pre-release tag for v2. + /// + public string NuGetPreReleaseTagV2 { get; set; } + + /// + /// Gets or sets the NuGet pre-release tag. + /// + public string NuGetPreReleaseTag { get; set; } + + /// + /// Gets or sets the version source sha. + /// + public string VersionSourceSha { get; set; } + /// /// Gets or sets the commits since version source. /// @@ -134,6 +164,11 @@ public sealed class GitVersion /// public string CommitsSinceVersionSourcePadded { get; set; } + /// + /// Gets or sets the number of uncommited changes. + /// + public int? UncommittedChanges { get; set; } + /// /// Gets or sets the commit date. /// diff --git a/src/Cake.Common/Tools/GitVersion/GitVersionInternal.cs b/src/Cake.Common/Tools/GitVersion/GitVersionInternal.cs index 3bf9dc300c..4c1294fccf 100644 --- a/src/Cake.Common/Tools/GitVersion/GitVersionInternal.cs +++ b/src/Cake.Common/Tools/GitVersion/GitVersionInternal.cs @@ -56,6 +56,13 @@ public string PreReleaseLabel set => GitVersion.PreReleaseLabel = value; } + [DataMember] + public string PreReleaseLabelWithDash + { + get => GitVersion.PreReleaseLabelWithDash; + set => GitVersion.PreReleaseLabelWithDash = value; + } + [DataMember] public string PreReleaseNumber { @@ -63,6 +70,13 @@ public string PreReleaseNumber set => GitVersion.PreReleaseNumber = ToNullableInt(value); } + [DataMember] + public string WeightedPreReleaseNumber + { + get => ToString(GitVersion.WeightedPreReleaseNumber); + set => GitVersion.WeightedPreReleaseNumber = ToNullableInt(value); + } + [DataMember] public string BuildMetaData { @@ -147,6 +161,13 @@ public string BranchName set => GitVersion.BranchName = value; } + [DataMember] + public string EscapedBranchName + { + get => GitVersion.EscapedBranchName; + set => GitVersion.EscapedBranchName = value; + } + [DataMember] public string Sha { @@ -175,6 +196,27 @@ public string NuGetVersion set => GitVersion.NuGetVersion = value; } + [DataMember] + public string NuGetPreReleaseTagV2 + { + get => GitVersion.NuGetPreReleaseTagV2; + set => GitVersion.NuGetPreReleaseTagV2 = value; + } + + [DataMember] + public string NuGetPreReleaseTag + { + get => GitVersion.NuGetPreReleaseTag; + set => GitVersion.NuGetPreReleaseTag = value; + } + + [DataMember] + public string VersionSourceSha + { + get => GitVersion.VersionSourceSha; + set => GitVersion.VersionSourceSha = value; + } + [DataMember] public string CommitsSinceVersionSource { @@ -189,6 +231,13 @@ public string CommitsSinceVersionSourcePadded set => GitVersion.CommitsSinceVersionSourcePadded = value; } + [DataMember] + public string UncommittedChanges + { + get => ToString(GitVersion.UncommittedChanges); + set => GitVersion.UncommittedChanges = ToNullableInt(value); + } + [DataMember] public string CommitDate { diff --git a/src/Cake.Common/Tools/GitVersion/GitVersionOutput.cs b/src/Cake.Common/Tools/GitVersion/GitVersionOutput.cs index 240c43cbda..be253b554b 100644 --- a/src/Cake.Common/Tools/GitVersion/GitVersionOutput.cs +++ b/src/Cake.Common/Tools/GitVersion/GitVersionOutput.cs @@ -17,6 +17,11 @@ public enum GitVersionOutput /// /// Outputs to the stdout in a way usable by a detected build server. /// - BuildServer + BuildServer, + + /// + /// Outputs to a file, as specified in the OutputFile parameter. + /// + File } } \ No newline at end of file diff --git a/src/Cake.Common/Tools/GitVersion/GitVersionRunner.cs b/src/Cake.Common/Tools/GitVersion/GitVersionRunner.cs index 731d5201db..85eb59485a 100644 --- a/src/Cake.Common/Tools/GitVersion/GitVersionRunner.cs +++ b/src/Cake.Common/Tools/GitVersion/GitVersionRunner.cs @@ -88,15 +88,25 @@ private ProcessArgumentBuilder GetArguments(GitVersionSettings settings) if (settings.OutputType.HasValue) { + builder.Append("-output"); + switch (settings.OutputType.Value) { case GitVersionOutput.Json: - builder.Append("-output"); builder.Append("json"); break; case GitVersionOutput.BuildServer: - builder.Append("-output"); builder.Append("buildserver"); + break; + case GitVersionOutput.File: + builder.Append("file"); + + if (settings.OutputFile != null) + { + builder.Append("-outputfile"); + builder.AppendQuoted(settings.OutputFile.FullPath); + } + break; } } @@ -165,11 +175,47 @@ private ProcessArgumentBuilder GetArguments(GitVersionSettings settings) builder.AppendQuoted(settings.LogFilePath.FullPath); } + if (settings.ConfigFile != null) + { + builder.Append("-config"); + builder.AppendQuoted(settings.ConfigFile.FullPath); + } + if (settings.NoFetch) { builder.Append("-nofetch"); } + if (settings.NoCache) + { + builder.Append("-nocache"); + } + + if (settings.NoNormalize) + { + builder.Append("-nonormalize"); + } + + if (settings.Diag) + { + builder.Append("-diag"); + } + + if (settings.UpdateProjectFiles) + { + builder.Append("-updateprojectfiles"); + } + + if (settings.EnsureAssemblyInfo) + { + builder.Append("-ensureassemblyinfo"); + } + + if (settings.UpdateWixVersionFile) + { + builder.Append("-updatewixversionfile"); + } + if (settings.Verbosity.HasValue) { switch (settings.Verbosity.Value) diff --git a/src/Cake.Common/Tools/GitVersion/GitVersionSettings.cs b/src/Cake.Common/Tools/GitVersion/GitVersionSettings.cs index 26151a110a..0793e08afc 100644 --- a/src/Cake.Common/Tools/GitVersion/GitVersionSettings.cs +++ b/src/Cake.Common/Tools/GitVersion/GitVersionSettings.cs @@ -22,6 +22,17 @@ public sealed class GitVersionSettings : ToolSettings /// public GitVersionOutput? OutputType { get; set; } + /// + /// Gets or sets the path to a file to store the asserted GitVersion numbers in JSON format. + /// + public FilePath OutputFile { get; set; } + + /// + /// Gets or sets the path to config file. + /// + /// Defaults to GitVersion.yml. + public FilePath ConfigFile { get; set; } + /// /// Gets or sets a value indicating whether to update all the AssemblyInfo files. /// @@ -32,6 +43,23 @@ public sealed class GitVersionSettings : ToolSettings /// public FilePath UpdateAssemblyInfoFilePath { get; set; } + /// + /// Gets or sets a value indicating whether to recursively search for all project files (.csproj/.vbproj/.fsproj) files in the git repo and update them. + /// + /// This is only compatible with the newer Sdk projects. + public bool UpdateProjectFiles { get; set; } + + /// + /// Gets or sets a value indicating whether if the assembly info file specified with /updateassemblyinfo or /updateassemblyinfofilename is not found, it be created with these attributes: AssemblyFileVersion, AssemblyVersion and AssemblyInformationalVersion. + /// + /// Supports writing version info for: C#, F#, VB. + public bool EnsureAssemblyInfo { get; set; } + + /// + /// Gets or sets a value indicating whether all the GitVersion variables are written to 'GitVersion_WixVersion.wxi'. The variables can then be referenced in other WiX project files for versioning. + /// + public bool UpdateWixVersionFile { get; set; } + /// /// Gets or sets whether to only show a specific variable. /// @@ -68,6 +96,22 @@ public sealed class GitVersionSettings : ToolSettings /// If your CI server clones the entire repository you can set this to 'true' to prevent GitVersion attempting any remote repository fetching. public bool NoFetch { get; set; } + /// + /// Gets or sets a value indicating whether to bypass the cached GitVersion result. Result will not be written to the cache. + /// + public bool NoCache { get; set; } + + /// + /// Gets or sets a value indicating whether to disable normalize step on a build server. + /// + public bool NoNormalize { get; set; } + + /// + /// Gets or sets a value indicating whether to run GitVersion with additional diagnostic information. + /// + /// Requires git.exe to be installed. + public bool Diag { get; set; } + /// /// Gets or sets the dynamic repository path. Defaults to %TEMP%. ///