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/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() { diff --git a/src/NerdBank.GitVersioning.Tests/VersionOracleTests.cs b/src/NerdBank.GitVersioning.Tests/VersionOracleTests.cs index 2e567108..b64af102 100644 --- a/src/NerdBank.GitVersioning.Tests/VersionOracleTests.cs +++ b/src/NerdBank.GitVersioning.Tests/VersionOracleTests.cs @@ -313,6 +313,25 @@ 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..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,6 +63,32 @@ 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 => 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 /// instead of the default . diff --git a/src/NerdBank.GitVersioning/VersionOracle.cs b/src/NerdBank.GitVersioning/VersionOracle.cs index 03636310..66ddc562 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. @@ -439,12 +439,13 @@ public IEnumerable BuildMetadataWithCommitId /// /// Gets the -gc0ffee or .gc0ffee suffix for the version. + /// The g in the prefix might be changed if is set. /// /// - /// 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..1e402b08 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 non-public release 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.",