Skip to content

Commit 0782df5

Browse files
committed
Respect the precision setting when calculating the NuGet package version
1 parent fea1a21 commit 0782df5

File tree

3 files changed

+136
-10
lines changed

3 files changed

+136
-10
lines changed

src/NerdBank.GitVersioning.Tests/VersionOracleTests.cs

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -372,6 +372,92 @@ public void CanSetSemVer2ForNuGetPackageVersionPublicRelease()
372372
Assert.Equal($"7.8.9-foo.25", oracle.NuGetPackageVersion);
373373
}
374374

375+
[Theory]
376+
//
377+
// SemVer 1
378+
//
379+
// 2 version fields configured in version.json
380+
[InlineData(1, "1.2", VersionOptions.VersionPrecision.Major, "1.0.0")]
381+
[InlineData(1, "1.2", VersionOptions.VersionPrecision.Minor, "1.2.0")]
382+
[InlineData(1, "1.2", VersionOptions.VersionPrecision.Build, "1.2.1")]
383+
[InlineData(1, "1.2", VersionOptions.VersionPrecision.Revision, "1.2.1.<commit>")]
384+
// 2 version fields configured in version.json
385+
[InlineData(1, "1.2.3", VersionOptions.VersionPrecision.Major, "1.0.0")]
386+
[InlineData(1, "1.2.3", VersionOptions.VersionPrecision.Minor, "1.2.0")]
387+
[InlineData(1, "1.2.3", VersionOptions.VersionPrecision.Build, "1.2.3")]
388+
[InlineData(1, "1.2.3", VersionOptions.VersionPrecision.Revision, "1.2.3.1")]
389+
// 4 version fields configured in version.json
390+
[InlineData(1, "1.2.3.4", VersionOptions.VersionPrecision.Major, "1.0.0")]
391+
[InlineData(1, "1.2.3.4", VersionOptions.VersionPrecision.Minor, "1.2.0")]
392+
[InlineData(1, "1.2.3.4", VersionOptions.VersionPrecision.Build, "1.2.3")]
393+
[InlineData(1, "1.2.3.4", VersionOptions.VersionPrecision.Revision, "1.2.3.4")]
394+
// 2 version fields with git height in prerelease tag configured in version.json
395+
[InlineData(1, "1.2-alpha.{height}", VersionOptions.VersionPrecision.Major, "1.0.0-alpha-0001")]
396+
[InlineData(1, "1.2-alpha.{height}", VersionOptions.VersionPrecision.Minor, "1.2.0-alpha-0001")]
397+
[InlineData(1, "1.2-alpha.{height}", VersionOptions.VersionPrecision.Build, "1.2.0-alpha-0001")]
398+
[InlineData(1, "1.2-alpha.{height}", VersionOptions.VersionPrecision.Revision, "1.2.0.0-alpha-0001")]
399+
// 3 version fields with git height in prerelease tag configured in version.json
400+
[InlineData(1, "1.2.3-alpha.{height}", VersionOptions.VersionPrecision.Major, "1.0.0-alpha-0001")]
401+
[InlineData(1, "1.2.3-alpha.{height}", VersionOptions.VersionPrecision.Minor, "1.2.0-alpha-0001")]
402+
[InlineData(1, "1.2.3-alpha.{height}", VersionOptions.VersionPrecision.Build, "1.2.3-alpha-0001")]
403+
[InlineData(1, "1.2.3-alpha.{height}", VersionOptions.VersionPrecision.Revision, "1.2.3.0-alpha-0001")]
404+
// 4 version fields with git height in prerelease tag configured in version.json
405+
[InlineData(1, "1.2.3.4-alpha.{height}", VersionOptions.VersionPrecision.Major, "1.0.0-alpha-0001")]
406+
[InlineData(1, "1.2.3.4-alpha.{height}", VersionOptions.VersionPrecision.Minor, "1.2.0-alpha-0001")]
407+
[InlineData(1, "1.2.3.4-alpha.{height}", VersionOptions.VersionPrecision.Build, "1.2.3-alpha-0001")]
408+
[InlineData(1, "1.2.3.4-alpha.{height}", VersionOptions.VersionPrecision.Revision, "1.2.3.4-alpha-0001")]
409+
//
410+
// SemVer 2
411+
//
412+
// 2 version fields configured in version.json
413+
[InlineData(2, "1.2", VersionOptions.VersionPrecision.Major, "1.0.0")]
414+
[InlineData(2, "1.2", VersionOptions.VersionPrecision.Minor, "1.2.0")]
415+
[InlineData(2, "1.2", VersionOptions.VersionPrecision.Build, "1.2.1")]
416+
[InlineData(2, "1.2", VersionOptions.VersionPrecision.Revision, "1.2.1.<commit>")]
417+
// 3 version fields configured in version.json
418+
[InlineData(2, "1.2.3", VersionOptions.VersionPrecision.Major, "1.0.0")]
419+
[InlineData(2, "1.2.3", VersionOptions.VersionPrecision.Minor, "1.2.0")]
420+
[InlineData(2, "1.2.3", VersionOptions.VersionPrecision.Build, "1.2.3")]
421+
[InlineData(2, "1.2.3", VersionOptions.VersionPrecision.Revision, "1.2.3.1")]
422+
// 4 version fields configured in version.json
423+
[InlineData(2, "1.2.3.4", VersionOptions.VersionPrecision.Major, "1.0.0")]
424+
[InlineData(2, "1.2.3.4", VersionOptions.VersionPrecision.Minor, "1.2.0")]
425+
[InlineData(2, "1.2.3.4", VersionOptions.VersionPrecision.Build, "1.2.3")]
426+
[InlineData(2, "1.2.3.4", VersionOptions.VersionPrecision.Revision, "1.2.3.4")]
427+
// 2 version fields with git height in prerelease tag configured in version.json
428+
[InlineData(2, "1.2-alpha.{height}", VersionOptions.VersionPrecision.Major, "1.0.0-alpha.1")]
429+
[InlineData(2, "1.2-alpha.{height}", VersionOptions.VersionPrecision.Minor, "1.2.0-alpha.1")]
430+
[InlineData(2, "1.2-alpha.{height}", VersionOptions.VersionPrecision.Build, "1.2.0-alpha.1")]
431+
[InlineData(2, "1.2-alpha.{height}", VersionOptions.VersionPrecision.Revision, "1.2.0.0-alpha.1")]
432+
// 3 version fields with git height in prerelease tag configured in version.json
433+
[InlineData(2, "1.2.3-alpha.{height}", VersionOptions.VersionPrecision.Major, "1.0.0-alpha.1")]
434+
[InlineData(2, "1.2.3-alpha.{height}", VersionOptions.VersionPrecision.Minor, "1.2.0-alpha.1")]
435+
[InlineData(2, "1.2.3-alpha.{height}", VersionOptions.VersionPrecision.Build, "1.2.3-alpha.1")]
436+
[InlineData(2, "1.2.3-alpha.{height}", VersionOptions.VersionPrecision.Revision, "1.2.3.0-alpha.1")]
437+
// 4 version fields with git height in prerelease tag configured in version.json
438+
[InlineData(2, "1.2.3.4-alpha.{height}", VersionOptions.VersionPrecision.Major, "1.0.0-alpha.1")]
439+
[InlineData(2, "1.2.3.4-alpha.{height}", VersionOptions.VersionPrecision.Minor, "1.2.0-alpha.1")]
440+
[InlineData(2, "1.2.3.4-alpha.{height}", VersionOptions.VersionPrecision.Build, "1.2.3-alpha.1")]
441+
[InlineData(2, "1.2.3.4-alpha.{height}", VersionOptions.VersionPrecision.Revision, "1.2.3.4-alpha.1")]
442+
public void CanSetPrecisionForNuGetPackageVersion(int semVer, string version, VersionOptions.VersionPrecision precision, string expectedPackageVersion)
443+
{
444+
VersionOptions workingCopyVersion = new VersionOptions
445+
{
446+
Version = SemanticVersion.Parse(version),
447+
NuGetPackageVersion = new VersionOptions.NuGetPackageVersionOptions
448+
{
449+
SemVer = semVer,
450+
Precision = precision
451+
}
452+
};
453+
this.WriteVersionFile(workingCopyVersion);
454+
this.InitializeSourceControl();
455+
var oracle = new VersionOracle(this.Context);
456+
oracle.PublicRelease = true;
457+
expectedPackageVersion = expectedPackageVersion.Replace("<commit>", oracle.Version.Revision.ToString());
458+
Assert.Equal(expectedPackageVersion, oracle.NuGetPackageVersion);
459+
}
460+
375461
[Fact]
376462
public void CanSetSemVer2ForNuGetPackageVersionNonPublicRelease()
377463
{

src/NerdBank.GitVersioning/VersionOptions.cs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -584,7 +584,7 @@ public class NuGetPackageVersionOptions : IEquatable<NuGetPackageVersionOptions>
584584
{
585585
isFrozen = true,
586586
semVer = 1.0f,
587-
precision = VersionPrecision.Build
587+
precision = DefaultPrecision,
588588
};
589589

590590
[DebuggerBrowsable(DebuggerBrowsableState.Never)]
@@ -596,6 +596,11 @@ public class NuGetPackageVersionOptions : IEquatable<NuGetPackageVersionOptions>
596596
[DebuggerBrowsable(DebuggerBrowsableState.Never)]
597597
private VersionPrecision? precision;
598598

599+
/// <summary>
600+
/// Default value for <see cref="Precision"/>.
601+
/// </summary>
602+
public const VersionPrecision DefaultPrecision = VersionPrecision.Build;
603+
599604
/// <summary>
600605
/// Initializes a new instance of the <see cref="NuGetPackageVersionOptions" /> class.
601606
/// </summary>

src/NerdBank.GitVersioning/VersionOracle.cs

Lines changed: 44 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -353,7 +353,7 @@ public IDictionary<string, string> CloudBuildVersionVars
353353
/// <summary>
354354
/// Gets the version to use for NuGet packages.
355355
/// </summary>
356-
public string NuGetPackageVersion => this.VersionOptions?.NuGetPackageVersionOrDefault.SemVerOrDefault == 1 ? this.NuGetSemVer1 : this.SemVer2;
356+
public string NuGetPackageVersion => this.VersionOptions?.NuGetPackageVersionOrDefault.SemVerOrDefault == 1 ? this.NuGetSemVer1 : this.NuGetSemVer2;
357357

358358
/// <summary>
359359
/// Gets the version to use for Chocolatey packages.
@@ -414,8 +414,39 @@ public IDictionary<string, string> CloudBuildVersionVars
414414
/// Gets a SemVer 1.0 compliant string that represents this version, including the -gCOMMITID suffix
415415
/// when <see cref="PublicRelease"/> is <c>false</c>.
416416
/// </summary>
417-
private string NuGetSemVer1 =>
418-
$"{this.Version.ToStringSafe(3)}{this.PrereleaseVersionSemVer1}{this.NuGetSemVer1BuildMetadata}";
417+
private string NuGetSemVer1
418+
{
419+
get
420+
{
421+
var precision = this.VersionOptions?.NuGetPackageVersionOrDefault.PrecisionOrDefault ?? VersionOptions.NuGetPackageVersionOptions.DefaultPrecision;
422+
var version = this.Version.EnsureNonNegativeComponents();
423+
version = ApplyVersionPrecision(version, precision);
424+
425+
// If precision is set to include the 4th version component, return all 4 version fields, otherwise return 3 fields.
426+
var fieldCount = precision >= VersionOptions.VersionPrecision.Revision ? 4 : 3;
427+
428+
return $"{version.ToStringSafe(fieldCount)}{this.PrereleaseVersionSemVer1}{this.NuGetSemVer1BuildMetadata}";
429+
}
430+
}
431+
432+
/// <summary>
433+
/// Gets a SemVer 2.0 compliant string that represents this version, including the -gCOMMITID suffix
434+
/// when <see cref="PublicRelease"/> is <c>false</c>.
435+
/// </summary>
436+
private string NuGetSemVer2
437+
{
438+
get
439+
{
440+
var precision = this.VersionOptions?.NuGetPackageVersionOrDefault.PrecisionOrDefault ?? VersionOptions.NuGetPackageVersionOptions.DefaultPrecision;
441+
var version = this.Version.EnsureNonNegativeComponents();
442+
version = ApplyVersionPrecision(version, precision);
443+
444+
// If precision is set to include the 4th version component, return all 4 version fields, otherwise return 3 fields.
445+
var fieldCount = precision >= VersionOptions.VersionPrecision.Revision ? 4 : 3;
446+
447+
return $"{version.ToStringSafe(fieldCount)}{this.PrereleaseVersion}{this.SemVer2BuildMetadata}";
448+
}
449+
}
419450

420451
/// <summary>
421452
/// Gets the build metadata that is appropriate for SemVer2 use.
@@ -461,17 +492,21 @@ private static Version GetAssemblyVersion(Version version, VersionOptions? versi
461492
{
462493
// Otherwise consider precision to base the assembly version off of the main computed version.
463494
VersionOptions.VersionPrecision precision = versionOptions?.AssemblyVersion?.Precision ?? VersionOptions.DefaultVersionPrecision;
464-
465-
assemblyVersion = new Version(
466-
version.Major,
467-
precision >= VersionOptions.VersionPrecision.Minor ? version.Minor : 0,
468-
precision >= VersionOptions.VersionPrecision.Build ? version.Build : 0,
469-
precision >= VersionOptions.VersionPrecision.Revision ? version.Revision : 0);
495+
assemblyVersion = ApplyVersionPrecision(version, precision);
470496
}
471497

472498
return assemblyVersion.EnsureNonNegativeComponents(4);
473499
}
474500

501+
private static Version ApplyVersionPrecision(Version version, VersionOptions.VersionPrecision precision)
502+
{
503+
return new Version(
504+
version.Major,
505+
precision >= VersionOptions.VersionPrecision.Minor ? version.Minor : 0,
506+
precision >= VersionOptions.VersionPrecision.Build ? version.Build : 0,
507+
precision >= VersionOptions.VersionPrecision.Revision ? version.Revision : 0);
508+
}
509+
475510
/// <summary>
476511
/// Replaces any macros found in a prerelease or build metadata string.
477512
/// </summary>

0 commit comments

Comments
 (0)