From 824eeb72755eab129d76b48a7da20d8a66e1878d Mon Sep 17 00:00:00 2001 From: vchirikov Date: Thu, 13 Feb 2020 11:16:21 +0300 Subject: [PATCH 1/3] Add GitCommitIdPrefix --- .../VersionFileTests.cs | 1 + .../VersionOracleTests.cs | 20 +++++++++++++++++++ src/NerdBank.GitVersioning/VersionOptions.cs | 8 ++++++++ src/NerdBank.GitVersioning/VersionOracle.cs | 12 +++++------ .../version.schema.json | 6 ++++++ 5 files changed, 41 insertions(+), 6 deletions(-) diff --git a/src/NerdBank.GitVersioning.Tests/VersionFileTests.cs b/src/NerdBank.GitVersioning.Tests/VersionFileTests.cs index e9d611e4..8826f925 100644 --- a/src/NerdBank.GitVersioning.Tests/VersionFileTests.cs +++ b/src/NerdBank.GitVersioning.Tests/VersionFileTests.cs @@ -146,6 +146,7 @@ public void SetVersion_WritesSimplestFile(string version, string assemblyVersion [InlineData(@"{""release"":{""increment"":""minor""}}", @"{}")] [InlineData(@"{""release"":{""branchName"":""v{version}""}}", @"{}")] [InlineData(@"{""release"":{""firstUnstableTag"":""alpha""}}", @"{}")] + [InlineData(@"{""release"":{""gitCommitIdPrefix"":""g""}}", @"{}")] [InlineData(@"{""release"":{""firstUnstableTag"":""tag""}}", @"{""release"":{""firstUnstableTag"":""tag""}}")] [InlineData(@"{""release"":{""branchName"":""v{version}"",""versionIncrement"":""minor"",""firstUnstableTag"":""alpha""}}", @"{}")] [InlineData(@"{""release"":{""versionIncrement"":""major""}}", @"{""release"":{""versionIncrement"":""major""}}")] diff --git a/src/NerdBank.GitVersioning.Tests/VersionOracleTests.cs b/src/NerdBank.GitVersioning.Tests/VersionOracleTests.cs index 2e567108..e9238157 100644 --- a/src/NerdBank.GitVersioning.Tests/VersionOracleTests.cs +++ b/src/NerdBank.GitVersioning.Tests/VersionOracleTests.cs @@ -313,6 +313,26 @@ public void CanSetSemVer2ForNuGetPackageVersionNonPublicRelease() Assert.Equal($"7.8.9-foo.25.g{this.CommitIdShort}", oracle.NuGetPackageVersion); } + [Fact] + public void CanSetGitCommitIdPrefixNonPublicRelease() + { + VersionOptions workingCopyVersion = new VersionOptions + { + Version = SemanticVersion.Parse("7.8.9-foo.25"), + NuGetPackageVersion = new VersionOptions.NuGetPackageVersionOptions + { + SemVer = 2, + }, + GitCommitIdPrefix = "git" + + }; + this.WriteVersionFile(workingCopyVersion); + this.InitializeSourceControl(); + var oracle = VersionOracle.Create(this.RepoPath); + oracle.PublicRelease = false; + Assert.Equal($"7.8.9-foo.25.git{this.CommitIdShort}", oracle.NuGetPackageVersion); + } + [Fact] public void CanUseGitProjectRelativePathWithGitRepoRoot() { diff --git a/src/NerdBank.GitVersioning/VersionOptions.cs b/src/NerdBank.GitVersioning/VersionOptions.cs index 0cb52315..ca5ae85e 100644 --- a/src/NerdBank.GitVersioning/VersionOptions.cs +++ b/src/NerdBank.GitVersioning/VersionOptions.cs @@ -60,6 +60,14 @@ public class VersionOptions : IEquatable [JsonProperty(DefaultValueHandling = DefaultValueHandling.Ignore)] public AssemblyVersionOptions AssemblyVersion { get; set; } + /// + /// Gets or sets the prefix for git commit id in version. + /// If null 'g' will be used. + /// + /// A prefix for git commit id. + [JsonProperty(DefaultValueHandling = DefaultValueHandling.Ignore)] + public string GitCommitIdPrefix { get; set; } + /// /// Gets the version to use particularly for the /// instead of the default . diff --git a/src/NerdBank.GitVersioning/VersionOracle.cs b/src/NerdBank.GitVersioning/VersionOracle.cs index 03636310..a52dd14f 100644 --- a/src/NerdBank.GitVersioning/VersionOracle.cs +++ b/src/NerdBank.GitVersioning/VersionOracle.cs @@ -409,7 +409,7 @@ public IEnumerable BuildMetadataWithCommitId /// See this discussion. /// private string NuGetSemVer1BuildMetadata => - this.PublicRelease ? string.Empty : $"-g{this.GitCommitIdShort}"; + this.PublicRelease ? string.Empty : $"-{this.VersionOptions?.GitCommitIdPrefix ?? "g"}{this.GitCommitIdShort}"; /// /// Gets the build metadata, compliant to SemVer 1.0. @@ -418,7 +418,7 @@ public IEnumerable BuildMetadataWithCommitId this.PublicRelease ? string.Empty : $"-{this.GitCommitIdShort}"; /// - /// Gets a SemVer 1.0 compliant string that represents this version, including the -gCOMMITID suffix + /// Gets a SemVer 1.0 compliant string that represents this version, including the -{GitCommitIdPrefix}COMMITID suffix /// when is false. /// private string NuGetSemVer1 => @@ -438,13 +438,13 @@ public IEnumerable BuildMetadataWithCommitId private string PrereleaseVersionSemVer1 => SemanticVersionExtensions.MakePrereleaseSemVer1Compliant(this.PrereleaseVersion, this.SemVer1NumericIdentifierPadding); /// - /// Gets the -gc0ffee or .gc0ffee suffix for the version. + /// Gets the -{}c0ffee or .c0ffee suffix for the version. /// /// - /// The `g` prefix to the commit ID is to remain SemVer2 compliant particularly when the partial commit ID we use is made up entirely of numerals. - /// SemVer2 forbids numerals to begin with leading zeros, but a git commit just might, so we begin with `g` always to avoid failures when the commit ID happens to be problematic. + /// The prefix to the commit ID is to remain SemVer2 compliant particularly when the partial commit ID we use is made up entirely of numerals. + /// SemVer2 forbids numerals to begin with leading zeros, but a git commit just might, so we begin with prefix always to avoid failures when the commit ID happens to be problematic. /// - private string GitCommitIdShortForNonPublicPrereleaseTag => (string.IsNullOrEmpty(this.PrereleaseVersion) ? "-" : ".") + "g" + this.GitCommitIdShort; + private string GitCommitIdShortForNonPublicPrereleaseTag => (string.IsNullOrEmpty(this.PrereleaseVersion) ? "-" : ".") + (this.VersionOptions?.GitCommitIdPrefix ?? "g") + this.GitCommitIdShort; private VersionOptions.CloudBuildNumberOptions CloudBuildNumberOptions { get; } diff --git a/src/NerdBank.GitVersioning/version.schema.json b/src/NerdBank.GitVersioning/version.schema.json index 7f772945..46ad2244 100644 --- a/src/NerdBank.GitVersioning/version.schema.json +++ b/src/NerdBank.GitVersioning/version.schema.json @@ -79,6 +79,12 @@ "default": 10, "maximum": 40 }, + "gitCommitIdPrefix": { + "type": "string", + "description": "The git commit prefix (e.g. 'g') in prerelease versions", + "pattern": "^[^0-9][\\da-z\\-_\\.]*$", + "default": "g" + }, "gitCommitIdShortAutoMinimum": { "type": "integer", "description": "When greater than 0, the length of the commit ID will be either this value or the shortest unambiguous git-abbreviated commit ID possible, whichever is greater. When 0, the gitCommitIdShortFixedLength property is used instead.", From 0c2c442cbd625ec40c53774b8b9f579c83b63e9d Mon Sep 17 00:00:00 2001 From: vchirikov Date: Thu, 13 Feb 2020 11:21:48 +0300 Subject: [PATCH 2/3] Remove trailing whitespace --- src/NerdBank.GitVersioning.Tests/VersionOptionsTests.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/NerdBank.GitVersioning.Tests/VersionOptionsTests.cs b/src/NerdBank.GitVersioning.Tests/VersionOptionsTests.cs index b018f7f7..a0d6571a 100644 --- a/src/NerdBank.GitVersioning.Tests/VersionOptionsTests.cs +++ b/src/NerdBank.GitVersioning.Tests/VersionOptionsTests.cs @@ -202,7 +202,7 @@ public void ReleaseOptions_Equality() var ro5 = new VersionOptions.ReleaseOptions() { BranchName = "branchName", - VersionIncrement = VersionOptions.ReleaseVersionIncrement.Minor, + VersionIncrement = VersionOptions.ReleaseVersionIncrement.Minor, }; var ro6 = new VersionOptions.ReleaseOptions() { From 3cbd5006c4a22709ef8a0a8e3c4d88f66aaf14ef Mon Sep 17 00:00:00 2001 From: vchirikov Date: Mon, 9 Mar 2020 02:10:58 +0300 Subject: [PATCH 3/3] Review fixes --- .../VersionOracleTests.cs | 3 +-- src/NerdBank.GitVersioning/VersionOptions.cs | 23 ++++++++++++++++++- src/NerdBank.GitVersioning/VersionOracle.cs | 5 ++-- .../version.schema.json | 2 +- 4 files changed, 27 insertions(+), 6 deletions(-) diff --git a/src/NerdBank.GitVersioning.Tests/VersionOracleTests.cs b/src/NerdBank.GitVersioning.Tests/VersionOracleTests.cs index e9238157..b64af102 100644 --- a/src/NerdBank.GitVersioning.Tests/VersionOracleTests.cs +++ b/src/NerdBank.GitVersioning.Tests/VersionOracleTests.cs @@ -323,8 +323,7 @@ public void CanSetGitCommitIdPrefixNonPublicRelease() { SemVer = 2, }, - GitCommitIdPrefix = "git" - + GitCommitIdPrefix = "git", }; this.WriteVersionFile(workingCopyVersion); this.InitializeSourceControl(); diff --git a/src/NerdBank.GitVersioning/VersionOptions.cs b/src/NerdBank.GitVersioning/VersionOptions.cs index ca5ae85e..64c7e8e6 100644 --- a/src/NerdBank.GitVersioning/VersionOptions.cs +++ b/src/NerdBank.GitVersioning/VersionOptions.cs @@ -15,6 +15,9 @@ [DebuggerDisplay("{DebuggerDisplay,nq}")] public class VersionOptions : IEquatable { + [DebuggerBrowsable(DebuggerBrowsableState.Never)] + private string gitCommitIdPrefix; + /// /// Default value for . /// @@ -60,13 +63,31 @@ public class VersionOptions : IEquatable [JsonProperty(DefaultValueHandling = DefaultValueHandling.Ignore)] public AssemblyVersionOptions AssemblyVersion { get; set; } + /// /// Gets or sets the prefix for git commit id in version. + /// Because of semver rules the prefix must lead with a [A-z_] character (not a number) and it cannot be the empty string. /// If null 'g' will be used. /// /// A prefix for git commit id. [JsonProperty(DefaultValueHandling = DefaultValueHandling.Ignore)] - public string GitCommitIdPrefix { get; set; } + public string GitCommitIdPrefix + { + get => gitCommitIdPrefix; + set + { + if (string.IsNullOrWhiteSpace(value)) + { + throw new ArgumentNullException(nameof(value), $"{nameof(this.GitCommitIdPrefix)} can't be empty"); + } + char first = value[0]; + if (first < 'A' || (first > 'Z' && first < 'a' && first != '_') || first > 'z') + { + throw new ArgumentException(nameof(value), $"{nameof(this.GitCommitIdPrefix)} must lead with a [A-z_] character (not a number)"); + } + this.gitCommitIdPrefix = value; + } + } /// /// Gets the version to use particularly for the diff --git a/src/NerdBank.GitVersioning/VersionOracle.cs b/src/NerdBank.GitVersioning/VersionOracle.cs index a52dd14f..66ddc562 100644 --- a/src/NerdBank.GitVersioning/VersionOracle.cs +++ b/src/NerdBank.GitVersioning/VersionOracle.cs @@ -418,7 +418,7 @@ public IEnumerable BuildMetadataWithCommitId this.PublicRelease ? string.Empty : $"-{this.GitCommitIdShort}"; /// - /// Gets a SemVer 1.0 compliant string that represents this version, including the -{GitCommitIdPrefix}COMMITID suffix + /// Gets a SemVer 1.0 compliant string that represents this version, including the -gCOMMITID suffix /// when is false. /// private string NuGetSemVer1 => @@ -438,7 +438,8 @@ public IEnumerable BuildMetadataWithCommitId private string PrereleaseVersionSemVer1 => SemanticVersionExtensions.MakePrereleaseSemVer1Compliant(this.PrereleaseVersion, this.SemVer1NumericIdentifierPadding); /// - /// Gets the -{}c0ffee or .c0ffee suffix for the version. + /// Gets the -gc0ffee or .gc0ffee suffix for the version. + /// The g in the prefix might be changed if is set. /// /// /// The prefix to the commit ID is to remain SemVer2 compliant particularly when the partial commit ID we use is made up entirely of numerals. diff --git a/src/NerdBank.GitVersioning/version.schema.json b/src/NerdBank.GitVersioning/version.schema.json index 46ad2244..1e402b08 100644 --- a/src/NerdBank.GitVersioning/version.schema.json +++ b/src/NerdBank.GitVersioning/version.schema.json @@ -81,7 +81,7 @@ }, "gitCommitIdPrefix": { "type": "string", - "description": "The git commit prefix (e.g. 'g') in prerelease versions", + "description": "The git commit prefix (e.g. 'g') in non-public release versions.", "pattern": "^[^0-9][\\da-z\\-_\\.]*$", "default": "g" },